批次模式讓 MySQL 非互動式執行 SQL 腳本;LOAD DATA INFILE 則是極速大量匯入的核心利器。兩者結合,可實現從日誌回放、異構遷移到 ETL 落地的全鏈路自動化。
New_Data.sql)USE Meet_A_Geek;
INSERT INTO Customers (Customer_ID, Last_Name) VALUES (NULL, "Block");
INSERT INTO Customers (Customer_ID, Last_Name) VALUES (NULL, "Newton");
INSERT INTO Customers (Customer_ID, Last_Name) VALUES (NULL, "Simmons");
# Linux/macOS
mysql -u root -p < /home/mark/New_Data.sql
# Windows CMD
mysql -u root -p < C:\scripts\New_Data.sql
輸入密碼後自動執行,錯誤會輸出至 STDERR。
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_path'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\']
]
[LINES TERMINATED BY '\n']
[IGNORE number LINES]
[(col_name_or_user_var, ...)]
| 參數 | 場景 | 範例 |
|---|---|---|
LOCAL | 檔案在客戶端,經網路傳給伺服器 | LOAD DATA LOCAL INFILE 'C:/data.txt' INTO TABLE t; |
LOW_PRIORITY | 等待無讀鎖時才寫入,降低對線上查詢影響 | LOAD DATA LOW_PRIORITY INFILE '/data.txt' INTO TABLE t; |
REPLACE | 主鍵/唯一鍵衝突時覆蓋舊行 | LOAD DATA REPLACE INFILE '/data.txt' INTO TABLE t; |
IGNORE | 衝突時跳過新行,保留舊行 | LOAD DATA IGNORE INFILE '/data.txt' INTO TABLE t; |
FIELDS TERMINATED BY ',' ENCLOSED BY '"' | CSV 格式 | LOAD DATA INFILE '/data.csv' INTO TABLE t FIELDS TERMINATED BY ',' ENCLOSED BY '"'; |
(col1, col3, col5) | 只匯入指定欄位,順序對應檔案欄位 | LOAD DATA INFILE '/data.txt' INTO TABLE t (id, name, email); |
LOAD DATA INFILE '/raw.log' INTO TABLE logs
(@ts, @level, message)
SET created_at = STR_TO_DATE(@ts, '%Y-%m-%d %H:%i:%s'),
level = UPPER(@level);
LOAD DATA LOCAL INFILE 'access_export.csv' INTO TABLE target FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES;(col1, col2, ...) 指定對應關係。SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; 匯入後恢復並 COMMIT;COMMIT,避免 Undo Log 膨脹。--local-infile=1 啟用客戶端 LOCAL 功能(伺服端亦需 local_infile=ON)。CHARACTER SET 參數一致(建議 UTF-8)。掌握批次與 LOAD DATA,讓 TB 級資料遷移也能在維護窗口內從容完成。