萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Percona Toolkit pt-fifo-split:大檔案 LOAD DATA 秒級拆分並行導入

適用場景

  • 超大 CSV/TSV 檔(>10 GB)需 LOAD DATA INFILE 導入 InnoDB。
  • 單次大檔導入會造成:主從延遲飆升、InnoDB redo log 爆增、鎖爭用、甚至 OOM。
  • 需將大檔**流式拆分**為小批次,並行/串行導入,平滑資源佔用。

工具原理

pt-fifo-split 建立一個 **Named Pipe (FIFO)**,生產端逐行讀取大檔寫入 FIFO,消費端(MySQL)從 FIFO 讀取並 LOAD DATA。FIFO 緩衝區滿時生產端阻塞,實現天然背壓控制。

雙終端機操作範例

終端機 1:生產端(拆分大檔)

perl pt-fifo-split /data/huge_infile.txt \
     --fifo /tmp/mysql_load.fifo \
     --lines 1000000          # 每批 100 萬行
     --pid /tmp/pt-fifo-split.pid

終端機 2:消費端(循環導入)

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(視行寬與記憶體)
--fifoFIFO 路徑/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."

注意事項與限制

  • 僅支援類 Unix 系統(Linux/macOS/FreeBSD),Windows 無 Named Pipe 機制無法使用。
  • 導入期間**不可對目標表進行 DDL**(加欄位、建索引),否則 LOAD DATA 會報錯中斷。
  • 若需**斷點續傳**,建議改用 pt-archiver 或自行切分檔案記錄位移。
  • Percona Toolkit 官網:https://www.percona.com/doc/percona-toolkit/
copyright © 萬盛學電腦網 all rights reserved