天天看點

使用pt-fifo-split 工具往mysql插入海量資料

<a href="http://www.cnblogs.com/chenny7/p/4253337.html" target="_blank">http://www.cnblogs.com/chenny7/p/4253337.html</a>

<a href="https://www.percona.com/blog/2008/07/03/how-to-load-large-files-safely-into-innodb-with-load-data-infile/" target="_blank">https://www.percona.com/blog/2008/07/03/how-to-load-large-files-safely-into-innodb-with-load-data-infile/</a>

使用LOAD DATA INFILE語句,可以從一個檔案直接加載資料到mysql中,但如果檔案非常大,可能還需要對檔案進行切割,分多次加載,這種情況下,可以使用pt-fifo-split工具将檔案分割成多個資料塊(chunks),進而控制每次傳輸到mysql伺服器的資料量大小。

pt-fifo-split 指令用法:

例如:使用pt-fifo-split分割一個大檔案,每次讀1000000行:

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=10000

# Split the file

pt-fifo-split --force --lines ${CHUNK_SIZE} ${FLAT_FILE} --fifo ${FIFO_PATH} &amp;

# 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} &gt; ${LOAD_FILE}

  # Load chunk into table

  mysql -uroot -pxxxx --database=test --show-warnings -vve "source ${LOAD_FILE}; "

done

本文轉自 lirulei90 51CTO部落格,原文連結:http://blog.51cto.com/lee90/1971233,如需轉載請自行聯系原作者

繼續閱讀