LOAD DATA INFILE 是 MySQL 將文本文件高速載入表的核心語句,速度較 INSERT 快 **20 倍以上**(官方數據)。本文系統梳理完整語法、文件路徑解析規則、字段/行分隔符控制、異常處理策略、索引優化技巧與實戰避坑指南,助您駕馭 TB 級數據導入。
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name_or_user_var, ...)]
[SET col_name = expr, ...]
LOCAL 關鍵字:客戶端 vs 服務端讀取| 模式 | 讀取方 | 文件路徑解析 | 權限要求 | 適用場景 |
|---|---|---|---|---|
| 無 LOCAL | Server 進程 | 服務端主機絕對路徑 / 相對 datadir / 相對當前庫目錄 | FILE 權限 | 文件已在 DB 服務器,大文件、高性能 |
| LOCAL | Client 進程 | 客戶端主機路徑(相對啟動目錄) | 無需 FILE 權限 | 文件在應用/跳板機,跨網絡傳輸 |
關鍵差異:LOCAL 會將文件內容經網絡發送給 Server,傳輸過程不可中斷,故預設行為等同 IGNORE(重複鍵跳過)。
-- 標準 CSV:逗號分隔、雙引號包裹、換行結束
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n'
-- Windows 捷徑(\r\n 換行)
LINES TERMINATED BY '\r\n'
-- 自定義多字符行分隔(如日誌 %% 分隔)
LINES TERMINATED BY '\n%%\n'
OPTIONALLY ENCLOSED BY:僅字符類型字段加引號;無 OPTIONALLY 則所有字段強制加引號。ESCAPED BY:預設反斜槓 \\,空字符意味著不轉義(危險,慎用)。IGNORE number LINES:跳過標題行
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;
REPLACE vs IGNORE:主鍵/唯一鍵衝突策略| 關鍵字 | 行為 | 適用場景 |
|---|---|---|
REPLACE | 新行替換舊行(同主鍵/唯一鍵) | 全量覆蓋同步、數據修正 |
IGNORE | 跳過衝突行,保留舊行 | 增量同步、避免主鍵衝突報錯 |
| 無指定 | 非 LOCAL 報錯終止;LOCAL 等同 IGNORE | 嚴格模式、需感知錯誤 |
(col_list) 與 SET:列映射與衍生計算
-- 僅導入指定列,其他列用默認值
LOAD DATA LOCAL INFILE 'persondata.txt' INTO TABLE persondata (col1, col2);
-- 衍生列計算:導入 col3, col4 映射到表 col1, col2,col3 經函數處理
LOAD DATA INFILE 'data.txt' INTO TABLE t1 (col1, col2, @var1)
SET col3 = UPPER(@var1), col4 = NOW();
注意:SET 中只能引用 @user_var,不可前向引用同語句賦值的列。
LINES STARTING BY:跳過行前綴
-- 文件內容:
xxx"row",1
something xxx"row",2
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test LINES STARTING BY "xxx";
-- 結果:只導入 ("row",1) 和 ("row",2)
無前綴行將被整行跳過。
LOAD DATA 會延遲非唯一索引創建至載入完成後(類似 REPAIR TABLE),極大加速。無需手動 DISABLE KEYS。SET autocommit=0; LOAD DATA ...; COMMIT; 事務批量提交。ALTER TABLE ... DISABLE KEYS(僅 MyISAM)或臨時移除二級索引,導入後重建。LOAD DATA 至分區表或不同表,再合併。bulk_insert_buffer_size(MyISAM)適度調大(如 64M~256M)加速批量插入緩衝。| 文件來源 | 行終止符 | LOAD DATA 設定 |
|---|---|---|
| Linux/Unix | \n (LF) | LINES TERMINATED BY '\n' (默認) |
| Windows (CRLF) | \r\n | LINES TERMINATED BY '\r\n' |
| Mac OS 9 (CR) | \r | LINES TERMINATED BY '\r' |
診斷技巧:hexdump -C file.txt | head 或 file file.txt 查看換行符類型。
LOCAL 模式需 FILE 權限(高危,僅 DBA 持有)。LOCAL 模式下,客戶端讀取文件,**MySQL 服務端無法控制文件來源**,潛在安全風險(CVE-2013-0132 類漏洞)。生產環境建議:local_infile=OFF(默認 5.6+ 為 OFF)。mysql --local-infile=1 顯式啟用客戶端能力。| 錯誤 | 原因 | 修復 |
|---|---|---|
| File not found (Errcode: 2) | 路徑錯誤/相對路徑解析偏差 | 使用絕對路徑;確認 Server/Client 讀取方一致性 |
| Incorrect integer value | 字段類型不匹配/分隔符錯誤導致列錯位 | 核對 FIELDS/LINES 子句;用 SHOW WARNINGS 定位行 |
| Duplicate entry for key 'PRIMARY' | 主鍵衝突且未指定 REPLACE/IGNORE | 添加 REPLACE 或 IGNORE |
| Packet too large | 單行超過 max_allowed_packet | 增大 max_allowed_packet(如 256M) |
LOAD DATA INFILE 是數據遷移、ETL、歸檔入庫的「核武器」。掌握「LOCAL 與否」「分隔符精準控制」「衝突策略選擇」「索引延遲建立」「跨平台換行符適配」五大核心技法,配合權限最小化與安全加固,即能在 TB 級數據洪流中,實現**快、穩、準**的精準打擊。願本文成為您數據導入戰場上的「作戰地圖」。