博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用pt-fifo-split 工具往mysql插入海量数据

Posted on 2017-12-21 23:01  moss_tan_jun  阅读(385)  评论(0编辑  收藏  举报

《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 性能评测可以参考这篇文章

mysql之pt工具之pt-fifo-split用法介绍

在工作中用到也比较多,在load data大文件时,如果文件太大会导致主从延时等问题,必须得将文件拆分成许多小文件,使用这个工具就不需要人工进行切割文件。

此工具只能工作在类unix操作系统。具体的可以查看: http://www.mysqlperformanceblog.com/2008/07/03/how-to-load-large-files-safely-into-innodb-with-load-data-infile/

在一个session中执行如下命令:

perl pt-fifo-split infile.txt --fifo /tmp/my-fifo --lines 1000000
在另一个session执行如下命令:

while [ -e /tmp/my-fifo ]; do
   time mysql -e "set foreign_key_checks=0; set sql_log_bin=0; set unique_checks=0; load data local infile '/tmp/my-fifo' into table load_test fields terminated by '\t' lines terminated by '\n' (col1, col2);"
   sleep 1;
done

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索操作系统 文件 pt fifo split、mysql split函数用法、altera fifo详细用法、fifo用法、java split用法,以便于您获取更多的相关知识。