LOAD DATA INFILE 導入 InnoDB。pt-fifo-split 建立一個 **Named Pipe (FIFO)**,生產端逐行讀取大檔寫入 FIFO,消費端(MySQL)從 FIFO 讀取並 LOAD DATA。FIFO 緩衝區滿時生產端阻塞,實現天然背壓控制。
perl pt-fifo-split /data/huge_infile.txt \
--fifo /tmp/mysql_load.fifo \
--lines 1000000 # 每批 100 萬行
--pid /tmp/pt-fifo-split.pid
while [ -e /tmp/mysql_load.fifo ]; do
mysql -e "
SET foreign_key_checks=0;
SET sql_log_bin=0;
SET unique_checks=0;
LOAD DATA LOCAL INFILE '/tmp/mysql_load.fifo'
INTO TABLE load_test
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
(col1, col2);
"
sleep 1; # 避免空循環佔 CPU
done
| 參數 | 說明 | 建議值 |
|---|---|---|
--lines | 每批次行數 | 100000~1000000(視行寬與記憶體) |
--fifo | FIFO 路徑 | /tmp/mysql_load.fifo |
--chunk-size | 以位元組為單位切分(替代 --lines) | 100M~500M |
--max-files | 最大同時開啟檔案數 | 預設 8 |
SET foreign_key_checks=0; 關閉 FK 檢查,大幅提速。SET sql_log_bin=0; 不寫 Binlog,**避免主從延遲與 Binlog 膨脹**(僅限從庫或可接受數據不進 Binlog 的場景)。SET unique_checks=0; 關閉唯一鍵檢查,導入後再 SET unique_checks=1; ANALYZE TABLE; 重建統計。LOAD DATA LOCAL INFILE 需客戶端與伺服器均啟用 local_infile=1。#!/bin/bash
FIFO=/tmp/mysql_load.fifo
INFILE=/data/huge_infile.txt
LINES=500000
# 建立 FIFO
mkfifo "$FIFO"
# 背景啟動生產端
pt-fifo-split "$INFILE" --fifo "$FIFO" --lines "$LINES" &
PRODUCER_PID=$!
# 前景循環消費
while [ -e "$FIFO" ]; do
mysql --local-infile=1 -e "
SET foreign_key_checks=0;
SET sql_log_bin=0;
SET unique_checks=0;
LOAD DATA LOCAL INFILE '$FIFO'
INTO TABLE load_test
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
(col1, col2);
"
sleep 0.5
done
wait $PRODUCER_PID
echo "Load completed."
LOAD DATA 會報錯中斷。pt-archiver 或自行切分檔案記錄位移。