前几天,有开发误操作,要求恢复数据,用my2sql rollback模式抢救回来。今天介绍一下该工具,并做个总结,后续有时间看看该工具的代码实现。
1、my2sql简介
my2sql是一款用go语言开发的binlog解析工具。解析binlog生成原始SQL、回滚SQL、去除主键的INSERT SQL等,也可以生成DML统计信息以及大事务分析信息。
2、安装 源码安装(本文基于centos8测试、centos7可下载社区提供的二进制包)
代码语言:javascript复制#1 安装go
yum -y install go
#2 克隆原代码
git clone https://github.com/liuhr/my2sql.git
#3编译
cd my2sql/
go build .
编译完成后会看到my2sql的二进制文件。
3、重要参数说明
代码语言:javascript复制-U
优先使用unique key作为where条件,默认false
-mode
repl: 伪装成从库解析binlog文件,file: 离线解析binlog文件, 默认repl
-local-binlog-file
当指定-mode=file 参数时,需要指定-local-binlog-file binlog文件相对路径或绝对路径,可以连续解析多个binlog文件,只需要指定起始文件名,程序会自动持续解析下个文件
-add-extraInfo
是否把database/table/datetime/binlogposition...信息以注释的方式加入生成的每条sql前,默认false
# datetime=2020-07-16_10:44:09 database=orchestrator table=cluster_domain_name binlog=mysql-bin.011519 startpos=15552 stoppos=15773
UPDATE `orchestrator`.`cluster_domain_name` SET `last_registered`='2020-07-16 10:44:09' WHERE `cluster_name`='192.168.1.1:3306'
-big-trx-row-limit n
transaction with affected rows greater or equal to this value is considerated as big transaction
找出满足n条sql的事务,默认500条
-databases 、 -tables
库及表条件过滤, 以逗号分隔
-sql
要解析的sql类型,可选参数insert、update、delete,默认全部解析
-doNotAddPrifixDb
Prefix table name witch database name in sql,ex: insert into db1.tb1 (x1, x1) values (y1, y1)
默认生成insert into db1.tb1 (x1, x1) values (y1, y1)类sql,也可以生成不带库名的sql
-file-per-table
为每个表生成一个sql文件
-full-columns
For update sql, include unchanged columns. for update and delete, use all columns to build where condition.
default false, this is, use changed columns to build set part, use primary/unique key to build where condition
生成的sql是否带全列信息,默认false
-ignorePrimaryKeyForInsert
生成的insert语句是否去掉主键,默认false
-output-dir
将生成的结果存放到制定目录
-output-toScreen
将生成的结果打印到屏幕,默认写到文件
-threads
线程数,默认8个
-work-type
2sql:生成原始sql,rollback:生成回滚sql,stats:只统计DML、事务信息
3、使用案例
3.1 生成原始sql
代码语言:javascript复制#1 创建文件夹
mkdir /data/aaaa/
#2 生成原始sql
./my2sql -user root -password xxx -host 127.0.0.1 -port 3306 -mode file -local-binlog-file /data/mysql_log/mysql-bin.000014 -work-type 2sql -start-file /data/mysql_log/mysql-bin.000014 -start-datetime "2023-04-07 15:00:00" -stop-datetime "2023-04-07 15:30:00" -output-dir /data/aaaa/
3.2 生成回滚sql
代码语言:javascript复制#1 创建文件夹
mkdir /data/bbbb/
#2 生成原始sql
./my2sql -user root -password xxx -host 127.0.0.1 -port 3306 -mode file -local-binlog-file /data/mysql_log/mysql-bin.000014 -work-type rollback -start-file /data/mysql_log/mysql-bin.000014 -start-datetime "2023-04-07 15:00:00" -stop-datetime "2023-04-07 15:30:00" -output-dir /data/bbbb/
3.3 生成统计信息
代码语言:javascript复制#1 创建文件夹
mkdir /data/cccc/
#2 生成原始sql
./my2sql -user root -password xxx -host 127.0.0.1 -port 3306 -mode file -local-binlog-file /data/mysql_log/mysql-bin.000014 -work-type stats -start-file /data/mysql_log/mysql-bin.000014 -start-datetime "2023-04-07 15:00:00" -stop-datetime "2023-04-07 15:30:00" -output-dir /data/cccc/
4、限制
代码语言:javascript复制使用回滚/闪回功能时,binlog格式必须为row,且binlog_row_image=full, DML统计以及大事务分析不受影响
只能回滚DML, 不能回滚DDL
使用rollback功能时,要解析的binlog段,表结构要保持一致(例如:解析mysql-bin.000001文件,此binlog文件的的表有add column或drop column操作,则执行rollback可能会执行异常)
支持指定-tl时区来解释binlog中time/datetime字段的内容。开始时间-start-datetime与结束时间-stop-datetime也会使用此指定的时区, 但注意此开始与结束时间针对的是binlog event header中保存的unix timestamp。结果中的额外的datetime时间信息都是binlog event header中的unix timestamp
此工具是伪装成从库拉取binlog,需要连接数据库的用户有SELECT, REPLICATION SLAVE, REPLICATION CLIENT权限
MySQL8.0版本需要在配置文件中加入default_authentication_plugin =mysql_native_password,用户密码认证必须是mysql_native_password才能解析
5、补充说明:
1、暂时不支持GTID