使用pt-fifo-split 工具往mysql插入海量數據

  • 2019 年 10 月 4 日
  • 筆記

http://www.cnblogs.com/chenny7/p/4253337.html

https://www.percona.com/blog/2008/07/03/how-to-load-large-files-safely-into-innodb-with-load-data-infile/

使用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=10000  # 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 -uroot -pxxxx --database=test --show-warnings -vve "source ${LOAD_FILE}; "  done

Tags: