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

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

时间: 2024-10-10 07:04:22

使用pt-fifo-split 工具往mysql插入海量数据的相关文章

pt(Percona Toolkit)工具详解:(一)安装

pt(Percona Toolkit)工具是由Percona公司开发的一个用perl语言编写的工具集,包含很多功能,例如在线更改数据表结构,校验主从数据,检查数据库状态,分析慢查询等这些靠人手做起来比较麻烦的事情,功能强大,操作简单. 安装 既然是perl语言开发的工具集,那当然是先安装perl相关依赖包了 yum install -y perl perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl-Digest-MD5 然后,就到下面这个

mysql 插入中文时出现ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xCB\xC4' for column 'usern ame' at row 1

1 环境: MySQL Server 6.0  命令行工具 2 问题 :  插入中文字符数据出现如下错误: ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xCB\xC4' for column 'usern ame' at row 1 3 当时环境: mysql> insert into user(id , username , birthday, sex, address) values('2' , ' 李四' , '1980 12

mysql 插入/更新数据

mysql 插入/更新数据 INSERT 语句 1.一次性列出全部字段的值,例如: INSERT INTO student VALUES('Chenqi','M', 29); INSERT INTO student VALUES('Bush','M', 60),('Obama', 'M', 45); 允许同时插入多个数据行: 2.只对部分字段赋值 INSERT INTO student(name, sex) VALUES ('Abby', 'F'),('Joseph', 'M'); 没有在INS

Springboot接口简单实现生成MySQL插入语句

Springboot接口简单实现调用接口生成MySQL插入语句 在实际测试中,有这样一个需求场景,比如:在性能压力测试中,可能需要我们事先插入数据库中一些相关联的数据. 我们在实际测试中,遇到问题,需要事先在数据库中创建10000家门店,存在shop表中.关键字段(门店的编号6位数). 分析:两种具体实现方案. 一.利用MySQL函数功能随机生成<SELECT FLOOR(+ RAND() * 1000000)>,最后编写insert语句.但是效率低下. 二.使用springboot编写接口实

Mysql 插入时间时报错Incorrect datetime value: &#39;&#39; for column &#39;createtime&#39;

在网上找了很多方法总结如下: 1.MySQL驱动版本的问题.这种一般是在mYSQL版本更新了之后才会报错.解决方法在jdbc里添加"&useOldAliasMetadataBehavior=true" 2.可能是datetime的格式问题. datetime 以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值.支持的范围为'1000-01-01 00:00:00'到'9999-12-31 23:59:59'TIMESTAMP值不能早于1970或晚于20

MySQL 插入中文不乱码的5种方法

MySQL 插入中文不乱码的5种方法: 方法一: 登录MySQL,先做 set names latin1 ,然后在更新语句或者执行SQL语句 mysql> set names latin1; mysql> source  test.sql; 方法二: 在SQL文件中指定set names latin1;然后登录MySQL,执行相应文件    [[email protected] ~]# cat test.sql  set names latin1; insert ***************

mysql插入blob大文件

1,E:\MySQL\MySQL Server 5.7\my.ini    max_allowed_packet=40M 2,MySQL的四种BLOB类型 类型 大小(单位:字节)  TinyBlob 最大 255  Blob 最大 65K  MediumBlob 最大 16M  LongBlob 最大 4G mysql插入blob大文件,布布扣,bubuko.com

JDBC实现往MySQL插入百万级数据

from:http://www.cnblogs.com/fnz0/p/5713102.html JDBC实现往MySQL插入百万级数据 想往某个表中插入几百万条数据做下测试, 原先的想法,直接写个循环10W次随便插入点数据试试吧,好吧,我真的很天真.... DROP PROCEDURE IF EXISTS proc_initData;--如果存在此存储过程则删掉 DELIMITER $ CREATE PROCEDURE proc_initData() BEGIN DECLARE i INT DE

mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...

总结写在前面, 总结: 当Java通过jdbc链接mysql插入中文时,要保证程序可以正常执行,而且插入的中文不会乱码, mysql服务器端,对数据表(不是数据库)的编码设置,要保证是支持中文的,例如gbk, gb2312, utf-8 jdbc的连接配置,要开启useUnicode=true,并且要设置一个支持中文的编码,不需要跟mysql表的编码保持一致,只需要支持中文就行.例如characterEncoding=utf8 本身的Java文件的编码需要支持中文 ===============