在《mysql插入/更新資料》這篇文章提到,使用LOAD DATA INFILE語句,可以從一個檔案直接加載資料到mysql中,但如果檔案非常大,可能還需要對檔案進行切割,分多次加載,這種情況下,可以使用pt-fifo-split工具将檔案分割成多個資料塊(chunks),進而控制每次傳輸到mysql伺服器的資料量大小。
pt-fifo-split 可以模拟切割檔案,并通過管道傳遞給先入先出隊列而不用真正的切割檔案。pt-fifo-split 是 percona-toolkit 套件的一部分。
pt-fifo-split 指令用法:
pt-fifo-split [options] [FILE ...]
例如:使用pt-fifo-split分割一個大檔案,每次讀1000000行:
pt-fifo-split --lines 1000000 hugefile.txt
while [ -e /tmp/pt-fifo-split ]; do cat /tmp/pt-fifo-split; done
pt-fifo-split 預設會在/tmp下面建立一個fifo檔案,并讀取大檔案中的資料寫入到fifo檔案,每次達到指定行數就往fifo檔案中列印一個EOF字元,讀取完成以後,關閉掉fifo檔案并移走,然後重建fifo檔案,列印更多的行。這樣可以保證你每次讀取的時候都能讀取到制定的行數直到讀取完成。注意此工具隻能工作在類unix作業系統。
常用選項:
--fifo /tmp/pt-fifo-split,指定fifo檔案的路徑;
--offset 0,如果不打算從第一行開始讀,可以設定這個參數;
--lines 1000,每次讀取的行數;
--force,如果fifo檔案已經存在,就先删除它,然後重新建立一個fifo檔案;
下面是一個完整的用法例子:
FLAT_FILE="/tmp/big_file.txt"
FIFO_PATH="${FLAT_FILE}.fifo"
LOAD_FILE="${FLAT_FILE}.load"
CHUNK_SIZE=100000
# Split the file
pt-fifo-split --force --lines ${CHUNK_SIZE} ${FLAT_FILE} --fifo ${FIFO_PATH} &
# Sleep 10 seconds to assure ${FIFO_PATH} exists before entering loop
sleep 10
while [ -e ${FIFO_PATH} ]
do
# Write chunk to disk
cat ${FIFO_PATH} > ${LOAD_FILE}
# Load chunk into table
mysql --database=test \
--show-warnings \
-vve "load data infile '${LOAD_FILE}' into table my_table;"
done
關于pt-fifo-split 性能評測可以參考這篇文章;
======專注高性能web伺服器架構和開發=====