MySQL数据闪回工具

一、 MySQL闪回工具

1.1 binlog2sql

binlog2sql安装包及依赖包

asn1crypto-master.zip cairocffi-master.zip cryptography-master.zip ipaddress-master.zip pycparser-master.zip PyMySQL-master.zip setuptools-40.6.2.zip binlog2sql-master.zip cffi-1.11.5.tar.gz enum34-master.zip pip-18.1.tar.gz  python-mysql-replication-master.zip wheel-0.32.3.tar.gz

使用要求

#my.cnf参数设置
server_id = 33061
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
用户最小权限:select,super,replication client,replication slave 
* select:需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句 
* super/replication client:两个权限都可以,需要执行'SHOW MASTER STATUS', 获取server端的binlog列表 
* replication slave:通过BINLOG_DUMP协议获取binlog内容的权限

基本用法

解析出标准SQL:python binlog2sql.py -h -P -u -p -d -t  --start-file= --start-position=
解析出回滚SQL:python binlog2sql.py -h -P -u -p -d -t  --start-file= --start-position=  -B
**命令选项**
mysql连接配置:-h host; -P port; -u user; -p password
**解析模式 **
* --stop-never 持续同步binlog。可选。不加则同步至执行命令时最新的binlog位置。 
* -K, --no-primary-key 对INSERT语句去除主键。可选。 
* -B, --flashback 生成回滚语句,可解析大文件,不受内存限制,每打印一千行加一句SLEEP SELECT(1)。可选。与stop-never或no-primary-key不能同时添加。
**解析范围控制**
* --start-file 起始解析文件。必须。 
* --start-position/--start-pos start-file的起始解析位置。可选。默认为start-file的起始位置。 
* --stop-file/--end-file 末尾解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。 
* --stop-position/--end-pos stop-file的末尾解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效。 
* --start-datetime 从哪个时间点的binlog开始解析,格式必须为datetime,如'2016-11-11 11:11:11'。可选。默认不过滤。 
* --stop-datetime 到哪个时间点的binlog停止解析,格式必须为datetime,如'2016-11-11 11:11:11'。可选。默认不过滤。
**对象过滤**
* -d, --databases 只输出目标db的sql。可选。默认为空。 
* -t, --tables 只输出目标tables的sql。可选。默认为空。

注意点

* 闪回的目标:快速筛选出真正需要回滚的数据。
* 先根据库、表、时间做一次过滤,再根据位置做更准确的过滤。
* 由于数据一直在写入,要确保回滚sql中不包含其他数据。可根据是否是同一事务、误操作行数、字段值的特征等等来帮助判断。
* 如果只回滚某张表,并且该表有关联表,关联表并不会被回滚,需与业务方沟通清楚。
* 哪些数据需要回滚,让业务方来判断!

1.2 MyFlash

参数

全部参数请通过--help查看,以下只列举部分常用参数。
databaseNames
指定需要回滚的数据库名。多个数据库可以用“,”隔开。如果不指定该参数,相当于指定了所有数据库。
tableNames
指定需要回滚的表名。多个表可以用“,”隔开。如果不指定该参数,相当于指定了所有表。
start-datetime
指定回滚的开始时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间
stop-datetime
指定回滚的结束时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间
sqlTypes
指定需要回滚的sql类型。目前支持的过滤类型是INSERT, UPDATE ,DELETE。多个类型可以用“,”隔开。
binlogFileNames
指定需要回滚的binlog文件,目前只支持单个文件,后续会增加多个文件支持。
outBinlogFileNameBase
指定输出的binlog文件前缀,如不指定,则默认为binlog_output_base.flashback。

示例

回滚bin.000009中,所有与Messages_Center 表上delete操作有关的SQL,时间为‘2018-04-17 15:00:00‘ 之后。
1.过滤并重新生成回滚二进制日志
./flashback --databaseNames stdzwfw9release --tableNames Messages_Center --start-datetime 2018-04-17 15:00:00 --sqlTypes DELETE --binlogFileName bin.000009
2.应用生成的回滚日志
mysqlbinlog binlog_output_base.flashback | mysql -h<host> -u<user> -p

二、总结

  对于MySQL来讲,数据闪回的方式一共有以下几种:

  • mysqlbinlog工具配合sed、awk。该方式先将binlog解析成类SQL的文本,然后使用sed、awk把类SQL文本转换成真正的SQL。但是该方式在SQL语句复杂的时候存在出错概率。
  • 使用binlog2sql成熟工具,但是binlog2sql工具过滤选项支持较差,需要结合awk、sed等工具进行筛选,并且依赖MySQL server。
  • 使用MyFlash工具,MyFlash不依赖于MySQL Server,过滤性好,但是解析出来的依旧为binlog文件,易读性差,业务确定不方便,需要用mysqlbinlog配合解决。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章