pt-archiver是一个十分高效的表数据归档工具,归档数据可以分批进行事务处理,减少性能消耗;
如果实例开启了GTID,因为GTID不支持CTAS创建表的语法,可以使用pt-archiver处理;
对于跨实例或者跨服务器的表数据归档,pt-archiver可以运行在目标端服务器,因为生成的临时文件是在工具执行所在的服务器。
对于大表的过期数据的批量删除也可以通过pt-archiver指定选项--purge进行处理。
QQ截图20200701150725.png
需要清理的表的信息
mysql> select count(*) from fwk_biz_log;
+----------+
| count(*) |
+----------+
| 4347412 |
+----------+
1 row in set (1.05 sec)
mysql> select count(*) from fwk_biz_log where T_LOG_DATE BETWEEN '2018-08-01' AND '2018-09-01';
+----------+
| count(*) |
+----------+
| 11092 |
+----------+
1 row in set (0.01 sec)
删除数据
将2019-09-01之前的日志删除,查看数据库磁盘使用状态
通过 --drt-run 打印查询需要清除数据的执行语句,确认执行内容
[root@VM_100_3_centos ~]# pt-archiver --source h=10.41.98.234,D=ipcis_cloud,t=fwk_biz_log --user=user --password=pass --purge --where "T_LOG_DATE BETWEEN '2019-09-01' AND '2019-10-01'" --dry-run
SELECT /*!40001 SQL_NO_CACHE */ `n_log_id`,`t_log_date`,`c_log_file`,`c_log_line`,`c_log_thread`,`c_log_level`,`c_log_message`,`c_log_messagea`,`c_log_messageb`,`c_log_messagec` FROM `ipcis_cloud`.`fwk_biz_log` FORCE INDEX(`PRIMARY`) WHERE (T_LOG_DATE BETWEEN '2019-09-01' AND '2019-10-01') AND (`n_log_id` < '29476920') ORDER BY `n_log_id` LIMIT 1
SELECT /*!40001 SQL_NO_CACHE */ `n_log_id`,`t_log_date`,`c_log_file`,`c_log_line`,`c_log_thread`,`c_log_level`,`c_log_message`,`c_log_messagea`,`c_log_messageb`,`c_log_messagec` FROM `ipcis_cloud`.`fwk_biz_log` FORCE INDEX(`PRIMARY`) WHERE (T_LOG_DATE BETWEEN '2019-09-01' AND '2019-10-01') AND (`n_log_id` < '29476920') AND ((`n_log_id` >= ?)) ORDER BY `n_log_id` LIMIT 1
DELETE FROM `ipcis_cloud`.`fwk_biz_log` WHERE (`n_log_id` = ?)
执行删除
删除 2019-09-01 之前的数据
[root@VM_100_3_centos ~]# pt-archiver --source h=10.41.98.234,D=ipcis_cloud,t=fwk_biz_log --user=user --password=pass --purge --where "T_LOG_DATE
[root@VM_100_3_centos ~]#
mysql> select * from fwk_biz_log WHERE T_LOG_DATE
Empty set (0.00 sec)
mysql> select count(*) from fwk_biz_log ;
+----------+
| count(*) |
+----------+
| 4238760 |
+----------+
1 row in set (0.93 sec)
删除 2019-09-01 跟 2019-10-01 之间的数据
[root@VM_100_3_centos ~]# pt-archiver --source h=10.41.98.234,D=ipcis_cloud,t=fwk_biz_log --user=user --password=pass --purge --where "T_LOG_DATE BETWEEN '2019-09-01' AND '2019-10-01'"
[root@VM_100_3_centos ~]#
mysql> select * from fwk_biz_log WHERE T_LOG_DATE
Empty set (0.00 sec)
mysql>
mysql>
mysql> select count(*) from fwk_biz_log ;
+----------+
| count(*) |
+----------+
| 4234534 |
+----------+
1 row in set (1.11 sec)
在腾讯云上验证
图片.png
碎片空间增加了,没有解决碎片的问题。
归档数据
将2019-11月的日志归档到 fwk_biz_log_201911表中
创建归档表
归档数据
[root@VM_100_3_centos ~]# pt-archiver --source h=10.41.98.234,D=ipcis_cloud,t=fwk_biz_log --dest h=10.41.98.234,D=ipcis_cloud,t=fwk_biz_log_201912 --user=user --password=pass --where "T_LOG_DATE BETWEEN '2019-12-01' AND '2020-01-01'" --limit 1000 --commit-each
查看归档结果
mysql> select * from fwk_biz_log_201912 limit 1;
+----------+---------------------+---------------------+------------+--------------+-------------+---------------+----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+
| N_LOG_ID | T_LOG_DATE | C_LOG_FILE | C_LOG_LINE | C_LOG_THREAD | C_LOG_LEVEL | C_LOG_MESSAGE | C_LOG_MESSAGEA | C_LOG_MESSAGEB | C_LOG_MESSAGEC |
+----------+---------------------+---------------------+------------+--------------+-------------+---------------+----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+
| 24872794 | 2019-12-01 18:57:41 | PayServiceImpl.java | 458 | svc-#233642 | INFO | 签约申请 | applySign | {"payType":"2","dataSrc":"66","signature":"3fc5094c38f20aaf6ce9a3d56e9ad27b","bankCode":"ICBC","accountType":"00","accountNo":"6222081812002930000","accountName":"小明","idType":"8","id":"110000199102058366","tel":"18511991009"} | |
+----------+---------------------+---------------------+------------+--------------+-------------+---------------+----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+
1 row in set (0.00 sec)
mysql> select * from fwk_biz_log limit 1;
+----------+---------------------+------------------------+------------+--------------+-------------+------------------------------------------------------+-----------------------+----------------+----------------+
| N_LOG_ID | T_LOG_DATE | C_LOG_FILE | C_LOG_LINE | C_LOG_THREAD | C_LOG_LEVEL | C_LOG_MESSAGE | C_LOG_MESSAGEA | C_LOG_MESSAGEB | C_LOG_MESSAGEC |
+----------+---------------------+------------------------+------------+--------------+-------------+------------------------------------------------------+-----------------------+----------------+----------------+
| 25256968 | 2020-01-01 00:00:01 | PolicyServiceImpl.java | 1994 | svc-#899 | INFO | 更新到期保单状态Wed Jan 01 00:00:00 CST 2020 | UpdateExpirePlyStatus | ListCPkgNos:[] | |
+----------+---------------------+------------------------+------------+--------------+-------------+------------------------------------------------------+-----------------------+----------------+----------------+
1 row in set (0.00 sec)
mysql> select count(*) from fwk_biz_log_201912;
+----------+
| count(*) |
+----------+
| 6435 |
+----------+
1 row in set (0.00 sec)
--limit
type: int; default: 1
每个片段(statement)查询和归档的行数设置。
限制每个SELECT statements查询归档的行数。默认是 1 。提升Limit限制可以更高效,但是如果你想通过设置很多行来减少归档次数需要慎重考虑。这可能会导致其他查询的问题,取决于存储引擎,事务隔离级别,以及配置项比如 "--for-update"。
--txn-size
type: int; default: 1
每个事务的行数。
指定每个事务处理的行数。0 关闭transactions altogether。在 pt-archiver 处理这些行后,它提交 "--source" 和 "--dest" (如果有的话),并且刷新"--file"配置的文件。
这个参数对性能很重要。如果你正在归档一个正在运行的服务器,比如大量OLTP任务的服务器,你需要在 transaction size 和 commit overhead 权衡。大的事务可能会导致更多锁和死锁,小的事务会导致更频繁的提交。为了提供建议参数,这里做了个小测试。在个人PC的MySQL实例上,归档到文件或其他表。设置值为500,性能约为每千行2秒。 设置为0关闭transactions,开启autocommit,性能降低到每千行38秒。
如果你不是事务存储引擎归档,或者归档到事务存储引擎,你可以关闭 transactions ,这样pt-archiver就不会 commit了。
--commit-each
提交每次查询归档 (disables "--txn-size")。
在每个归档后、下个查询前(在sleep前,如果配置 了"--sleep"),提交事务,刷新 "--file" 。
禁用"--txn-size"; 使用 "--limit" 来控制"--commit-each"的事务内容数量。
该配置项常用,作为配置 "--limit" 和 "--txn-size" 同样值的缩略写法。 但是更重要的是,它避免了在查询很多行的时候,事务一直在运行。比如,设想从一个非常大的表的开始位置归档旧数据,配置"--limit" 1000 和 "--txn-size" 1000。 在一次归档1000行后,pt-archiver查找最近的999行然后归档,然后执行下一个SELECT来获取更多行。这会扫描剩下的表空间,但是没有获取更多行。它长时间保持开启事务,仅用来判断任务是否结束了。可以使用 "--commit-each" 参数来避免这些问题。