pt-archiver数据平滑删除、平滑迁移利器!

  • 写在前面mysql

调研一件工具以前,在内心必定要明白,本身要实现的是什么功能,带着本身的问题,去找寻答案才能学到新的知识点!sql

  • 需求背景数据库

1)线上数据库有一类ip表,用来记录天天用户对网站的访问记录状况,而后将其按照时间段整合到一块儿,作数据分析工做,整合的时间不一样,最后造成的数据表大小亦是不一样,小点千万级,大点可能亿级,现有需求将半年前的用户记录删除,如何安全删除?vim

2)系统作了升级,现要将原来的数据迁移至新服务器上同名数据库中,如何保证安全迁移,而不形成导入时造成大量I/O,致使系统负载太高,用户、研发等部门能够正常使用,特别是在业务高峰期间?
安全


  • pt-archiver简介服务器

数据库归档和清理工具,能够实现的功能有ide

一、清理线上过时数据 工具

二、清理过时数据,并把数据归档到本地归档表中,或者远端归档服务器 fetch

三、两张表之间的数据不彻底相同,但愿合并。此时加--ignore --replace选项,能够轻松实现 网站

四、导出线上数据,到线下数据做处理


根据个人需求,调研此工具能够实现所需功能,这也正是本文始点:带着问题找答案,但做者只用到了一、2的功能,至于三、4的功能在这里只作一个记录,待以后有需求后,再作使用


  • 需求实现

1.1直接删除

DELETE FROM `ip_limit_20170701_bak` WHERE id>1000

最简单的方式,但若是数据表很大,可能形成大量的磁盘I/O、系统负载等,若是还存在slave,还会形成严重的从库延迟等问题


1.2按照索引条件批量删除

DELETE FROM `ip_limit_20170701_bak` WHERE id>1000 LIMIT 10000

较安全的删除方式,能够保证磁盘I/O、系统负载、从库延迟等处于可控范围内,但数据量巨大,手动操做较为繁琐


1.3使用工具删除

[root@backup home]# pt-archiver --version   [pt工具请自行安装]

pt-archiver 3.0.10

[root@backup ~]# time

pt-archiver --source u=root,p=123456,S=/tmp/mysql.sock,P=3306,D=test,t=ip_limit_20170701_bak --no-check-charset --progress 10000 --where 'id BETWEEN 1000 AND 494731' --limit 10000 --txn-size 1000 --bulk-delete --sleep 5 --purge --statistics

解释:删除test库,ip_limit_20170701_bak表数据,不作字符集检查,删除条件是 id BETWEEN 1000 AND 494731,每次取出10000行进行处理,每处理1000行则进行一次提交,每次处理10000行后显示处理信息,每完成一次处理sleep 5s


2.1mysqldump方式

第一种:将源数据库dump成sql文件,传输到目标服务器,再进行数据导入

第二种:直接在目标服务器dump源数据库的sql,再进行数据导入

但,不管采用哪一种方式数据迁移,数据表越大,在数据传输的东西,都会对带宽形成极大的消耗,在查看流量监控图的时候,能够清楚的看到毛尖;再者,在数据导入的时候,势必会形成巨大的I/O消耗,系统负载也会飙升,对数据库也会形成巨大的冲击


2.2使用工具删除

迁移数据时保留源数据:

[root@backup ~]#time pt-archiver --source u=root,p=123456,S=/tmp/mysql.sock,P=3306,D=test,t=ip_limit_20170701 --dest u=root,p=root,h=192.168.32.199,P=3306,D=ceshi,t=ip_limit_20170701 --charset=utf8 --progress 10000 --where 'id>=1' --limit 10000 --txn-size 1000 --sleep 5 --no-delete --bulk-insert --statistics

迁移数据时不保留源数据:

[root@backup ~]#time pt-archiver --source u=root,p=123456,S=/tmp/mysql.sock,P=3306,D=test,t=ip_limit_20170701 --dest u=root,p=root,h=192.168.32.199,P=3306,D=ceshi,t=ip_limit_20170701 --charset=utf8 --progress 10000 --where 'id>=1' --limit 10000 --txn-size 1000 --sleep 5  --bulk-delete --statistics


  • 经常使用参数

--source=d                 DSN specifying the table to archive from (required)    目标节点

--where=s                  WHERE clause to limit which rows to archive (required)

--purge                    Purge instead of archiving; allows omitting --file and --dest    删除source数据库的相关匹配记录

--progress=i               Print progress information every X rows    每处理多少行显示一次信息

--limit=i                  Number of rows to fetch and archive per statement (default 1)    每次取出多少行处理

--[no]check-charset        Ensure connection and table character sets are the same (default yes)    不检查字符集

--txn-size=i               Number of rows per transaction (default 1)    每多少行提交一次

--bulk-delete              Delete each chunk with a single statement (implies --commit-each)    并行删除

--statistics               Collect and print timing statistics    结束后输出统计信息


  • 最后一条数据不删除/不迁移BUG问题

平滑删除、迁移数据时,最后一条数据都不会被删除/迁移,已被证实为pt-archiver BUG,须要修改下pt-archiver代码

[root@backup ~]# vim /usr/bin/pt-archiver

原代码:

6401       $first_sql .= " AND ($col < " . $q->quote_val($val) . ")";

修改后:

6401       $first_sql .= " AND ($col <= " . $q->quote_val($val) . ")";


这些都是做者在工做中遇到的实际工做后引起的一些思考,并作的相关实践,对于其中理解不到位或者根本就是错误之处,望请下方留言,不胜感激!

相关文章
相关标签/搜索