pt-archiver官方地址:https://www.percona.com/doc/percona-toolkit/3.0/pt-archiver.html

介绍:归档数据,比如将一年前的数据备份到其他mysql实例+删除一年前的数据,原表只保留最近一年,更好的方案我觉得应该是对大表做分区表。更多详细介绍参考官方或者其他博客。

常用的参数

pt-archiver --source h=$source_host,P=$source_port,u=$source_user,p=$source_pass,D=$source_db,t=$table \
--dest h=$dest_host,P=$dest_port,u=$dest_user,p=$dest_pass,D=$dest_db,t=$dest_table \
--where ''$condition2' <= '$max_id'' \
--progress --file "/data/%Y-%m-%d-%D.%t" --limit= --commit-each --bulk-insert --bulk-delete --no-bulk-delete-limit --statistics --charset=utf8 \
--max-lag= --check-interval= \
--check-slave-lag h=$slave1_host,P=$slave1_port,u=$slave1_user,p=$slave1_pass
#--check-slave-lag h=$slave2_host,P=$slave2_port,u=$slave2_user,p=$slave2_pass

--source和--dest 指定源库和目标库的信息

--where 限制条件

--limit 没有--bulk-delete时,只是select获取id时会在sql语句跟上limit,有--bulk-delete时会在delete语句时跟上limit

--progress 归档过程中每完成10000条时报告进展

--statistics 归档完列出统计信息

--charset 字符集,没有指定时,可能数据写到--file之中会变成乱码

--max-lag --check-interval --check-slave-lag都是归档过程中监控从库延迟的情况

说说我遇到的问题,一开始的命令如下,引发的问题就是:主库磁盘io异常高,从库延迟跟不上。(我的环境是mysql版本5.7.24-log,主库binlog_format格式为mixed,binlog_row_image默认FULL)
网上搜索了也有类似的问题,因为--bulk-delete和--limit参数,开启gen_log可以看到实际的sql大致为delete from $table where id > 100 and id < 1100 limit 1000;limit语句会导致数据库写binlog时binlog_format更改为ROW,两篇文章的解决方案都是去掉--bulk-delete。

--progress  --file "/data/%Y-%m-%d-%D.%t" --limit= --txn-size= --bulk-insert --bulk-delete --statistics --charset=utf8

但是去掉--bulk-delete之后(同时也不能加--bulk-insert),最终在gen_log和binlong的sql语句变成delete from $table where id =1100,执行1万条delete时commit一次,--limit此时作用只是在select语句阶段一次性获取1000个id,等于执行10次select+1万次delete+1次commit。

但是这种方案显然也不适合,因为我们的大表需要删除将近1000万条记录。

--progress  --file "/data/%Y-%m-%d-%D.%t" --limit= --txn-size= --statistics --charset=utf8

既然binlog为变ROW格式,导致大量的日志写到系统文件上,那么就把binlog禁止掉。查了官网,可通过修改DSN参数,If true, disable binlog with SQL_LOG_BIN,目标库关闭binlog同理。

pt-archiver --source h=$source_host,P=$source_port,u=$source_user,p=$source_pass,D=$source_db,t=$table,b=true

但这是个蛋疼的方案,你删完主库还得删从库。在mixed改变成ROW格式时,就想官方不可能没考虑个这个问题。再次翻看官网,找到了--no-bulk-delete-limit参数;

此时gen_log的语句大致为delete from $table where id > 100 and id < 1010;后面没有跟limit;最终到binlog也就不会变成ROW格式。

--progress  --file "/data/%Y-%m-%d-%D.%t" --limit= --txn-size= --bulk-insert --bulk-delete --no-bulk-delete-limit --statistics --charset=utf8

由于生产环境删除时从库延迟还是挺大,所以将--txn-size替换为--commit-each牺牲性能换取延迟。

还有经常看到网友反馈pt-archiver的问题是,在处理最后一行时,工具并不归档。解决方案大多都是修改源码,重新编译安装pt-archiver。

其实官网也提供了相应的参数来解决--nosafe-auto-increment,听说这是mysql的bug,到8.0版本才解决这个问题。

还有一些可能用到的参数,比如:要删除的记录过多,不能在白天删除,业务低峰期又不能一次性删完(我们就这么蛋疼的环境,大表8000万记录,字段多,索引多,白天非高峰期,删除的速度也就100万条/小时)

此时就需要工具运行一定时间后,退出进程。

--run-time其实就可以很好地解决,但是我们的环境再次打脸,因为需要归档的不止是一张表,所以我用shell写了一些for循环,再将当月的记录归档到对应月份的表(目标库上建立了类似table_201901、table_201902),

--run-time只能退出单个pt-archiver进程,并不能退出整个shell,所以就只能cron判断进程是否存在,再kill。

或者往cron指定时间添加个pt-archiver --stop,该命令会在系统上添加文件/tmp/pt-archiver-sentinel。pt-archiver一旦检测有这个文件就会退出,我的shell之中for就会遇到多次退出,还好不影响最终结果。

--why-quit会打印退出的原因

--run-time
type: time Time to run before exiting. Optional suffix s=seconds, m=minutes, h=hours, d=days; if no suffix, s is used. --why-quit
Print reason for exiting unless rows exhausted. Causes pt-archiver to print a message if it exits for any reason other than running out of rows to archive.
This can be useful if you have a cron job with --run-time specified, for example,
and you want to be sure pt-archiver is finishing before running out of time. --sentinel
type: string; default: /tmp/pt-archiver-sentinel Exit if this file exists. The presence of the file specified by --sentinel will cause pt-archiver to stop archiving and exit.
The default is /tmp/pt-archiver-sentinel. You might find this handy to stop cron jobs gracefully if necessary. See also --stop. --stop
Stop running instances by creating the sentinel file. Causes pt-archiver to create the sentinel file specified by --sentinel and exit. 
This should have the effect of stopping all running instances which are watching the same sentinel file.

[mysql] 归档工具pt-archiver,binlog格式由mixed变成row的更多相关文章

  1. my15_ mysql binlog格式从mixed修改为row格式

    由于主库繁忙,就在从库上修改binlog格式 1. 从库切日志mysql> flush logs;Query OK, 0 rows affected (0.00 sec) mysql> f ...

  2. MySQL binlog格式解析

    MySQL binlog格式解析   binlog想必大家都不陌生,在主从复制或者某些情况下的数据恢复会用到.由于binlog是二进制数据,要查看一般都借助mysqlbinlog工具.这篇笔记分析了b ...

  3. MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨

    开心一刻 产品还没测试直接投入生产时,这尼玛... 背景问题 在讲 binlog 之前,我们先来回顾下主流关系型数据库的默认隔离级别,是默认隔离级别,不是事务有哪几种隔离级别,别会错题意了 1.Ora ...

  4. MySQL在线更改binlog格式

    今天变更jboss报错如下: SQLWarning ignored: SQL state ', message [Unsafe statement written to the binary log ...

  5. mysql客户端工具

    MySQL 数据库不仅提供了数据库的服务器端应用程序,同时还提供了大量的客户端工具程序,如 mysql,mysqladmin,mysqldump 等等,都是大家所熟悉的.虽然有些人对这些工具的功能都已 ...

  6. mysql二进制日志和mysql备份工具介绍以及日志恢复

    mysql备份: 三种备份方式 冷备:数据库停机,在进行备份 热备:lock table锁表,read   数据库只可以读不能写,在备份 温备:备份时数据库正常运行 备份类型:完整备份:全部备份,部分 ...

  7. Mysql 复制工具(percona-toolkit)

    Mysql 复制工具 1.percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检 ...

  8. 涂抹mysql笔记-mysql管理工具

    五花八门的mysql管理工具<>mysql提供的命令行工具 mysql_install_db:mysql建库工具,在源码安装mysql环节我们使用过. mysql_safe:mysql启动 ...

  9. MySQL和Mariadb二进制日志binlog详解

    Mariadb/mysql提供了4中不同的日志,分别是错误日志(error.log).普通日志(general log).慢日志(slow log)以及二进制日志(binlog).错误日志记录了系统启 ...

随机推荐

  1. windows7使用Sphinx+PHP+MySQL详细介绍

    安装(Windows) 1.官方下载 Sphinx下载地址: 下载 2.解压并重命名 此处下载版本为3.0.3,将 sphinx 文件夹命名为sphinx 3.文件夹目录介绍 sphinx --api ...

  2. 学习Java 采取令牌的方式避免重复提交

    重复提交原因 从提交页面到成功页面的跳转一般采用视图定位,由于视图定位是在服务端跳转的,如果用户在点击提交之后再次刷新页面,会导致重复提交,数据库的数据会有重复. 采用令牌措施 1.在转账展示页面生成 ...

  3. iOS渐变导航栏封装

    由于最近开发的几个项目都有渐变导航栏,每次写的时候都要copy一堆关于导航渐变相关的代码,显得类很冗余,所以花了点时间封装了一个渐变类,直接继承就可以满足大部分需求啦,这里简单写一下心路历程: 渐变的 ...

  4. 有关ajax

    1.什么是ajax? ajax是前端与后端交互所依赖的一项技术,它相当于一座桥梁,沟通了前端与后端. 2.ajax的优点 可以局部更新网页内容. 3.ajax的本质就是xmlHttpRequest对象 ...

  5. redis 基本数据类型-字符串(String)

    不瘦原来对redis也是有个大概的了解(就你知道的多), 但是最近和大神聊天的过程中才明白自己知道的简直就是鸡毛蒜皮(让你得瑟),所以不瘦打算从头在捋一遍,顺便把过程也记录下来,如果能给大家在学习re ...

  6. nginx如何做到TCP的负载均衡

    原文:https://blog.csdn.net/u011218159/article/details/50966861   TCP 的 负载均衡   这个片段描述了如何通过nginx plus进行负 ...

  7. JavaWeb基础—JSP自定义标签入门

    自定义标签的作用:替换JSP页面的java代码 步骤:1.标签处理类(标签是一个对象,那也就需要先有类) 2.tld文件 它是一个xml(可以向c标签里借),一般放到WEB-INF下,不让客户端浏览器 ...

  8. 学习笔记:Oracle的trace文件可见性

    隐藏参数: _trace_files_public 参数 trace文件的默认权限: - r w - r - - - - - 如果设定  trace_files_public参数为 true, 则 t ...

  9. 10.14 (上午)开课一个月零十天 (PHP环境搭建)

    一.修改APACHE的监听端口 2 1.在界面中选apache,弹出隐藏菜单选项,打开配置文件httpd.conf; 2.找到Listen 80 和 ServerName localhost:80; ...

  10. 【LG3246】[HNOI2016]序列

    [LG3246][HNOI2016]序列 题面 洛谷 题解 60pts 对于每个位置\(i\),单调栈维护它往左第一个小于等于它的位置\(lp_i\)以及往右第一个小于它的位置\(rp_i\). 那么 ...