一 简介:今天咱们来聊聊pt-archiver的使用
二 相关参数
相关参数1
--statistics 结束的时候给出统计信息:开始的时间点,结束的时间点,查询的行数,归档的行数,删除的行数,以及各个阶段消耗的总的时间和比例,便于以此进行优化。
--progress 每处理progress指定的行数后,就打印一次信息
--no-delete :表示不删除原来的数据,注意:如果不指定此参数,所有处理完成后,都会清理原表中的数据。
--limit 每组一次删除多少条数据
--where 过滤的条件
--why-quit 打印退出的原因
--purge 执行删除操作
--bulk-insert/delete 并发插入删除,能大幅度提高速度
--no-check-charset 不检测utf8mb4,因为pt工具不支持,建议加入
--txn-size 每组事务的大小(行数)
--source 源机器目标
--purge/--dest/--file 与source选项搭配,分别为删除 归档 和导入文件
--dry-run 只试运行,并不真正执行,会生成相关执行语句
相关参数2
i Index to use 这里要注意,对于非主键条件一定要指定列的索引,否则会强制走主键
三 常见需求场景
需求1
表数据归档
1 不删除
/usr/bin/pt-archiver --source h=localhost,u=root,p=root,P=3306,D=db,t=table,i=index_name --socket=/tmp/mysql.sock --no-check-charset --dest h=localhost,P=3306,u=root,p=root,D=db,t=table --socket=/tmp/mysql.sock --progress 5000 --where '' --statistics --charset=UTF8 --limit=10000 --txn-size 1000 - -no-delete --bulk-insert --why-quit
2 删除
去掉 --no-delete即可
需求2
表数据清理,但是不需要归档
/usr/bin/pt-archiver --source h=localhost,u=root,p=root,P=3306,D=db,t=table,i=index_name --purge --socket=/tmp/mysql.sock --no-check-charset --progress 5000 --where '' --statistics --limit=10000 --txn-size 1000 --why-quit --bulk-delete
四 总结
1 pt-archiver Bug不会迁移max(id)那条数据的解决方法
编辑修改/usr/bin/pt-archiver
修改前: $first_sql .= \" AND ($col < \" . $q->quote_val($val) . \")\";
修改后: $first_sql .= \" AND ($col <= \" . $q->quote_val($val) . \")\";
2 如同其他pt工具一样,这个工具的限制也一样,比如无主键,有触发器不能执行等
3 pt-archiver的select 如果where是主键条件,那么select 主键
如果不是主键条件,就会进行主键+条件进行组合
如果指定索引,走的就是索引
五 过程
1 pt-archiver先查询原库表,根据where条件进行limit查询
2 然后insert到指定的目的库表
3 然后select 指定的目的库表的where条件
4 最后根据目标库表的where条件进行删除原库表的相关数据,能确保新表拥有的数据在原表删除,保证安全性
六 注意事项
1 如果条件是非主键,一定要注意是否是索引,如果是索引,一定要制定,.如果不是,则再根据主键处理
2 如果数据重要,建议先迁移数据,然后再进行原表删除,
1 确保数据正确,根据条件进行查询
2 确保数据没有乱码
3 备份的表自增ID可能不连续(采用并发插入的方式)
3 根据输出结果可以查看具体进度