暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

使用reverse_sql将MySQL binlog解析为反向SQL

reverse_sql 是一个用于解析和转换 MySQL 二进制日志(binlog)的工具。它可以将二进制日志文件中记录的数据库更改操作(如插入、更新、删除)转换为反向的 SQL 语句,以便进行数据恢复。其运行模式需二进制日志设置为 ROW 格式。
首先需要确认二进制日志设置是ROW格式或row_image是full。
因为程序运行时会检测binlog_format != ‘ROW’ and binlog_row_image != ‘FULL’,如果成立则直接退出。

然后下载:

https://github.com/hcymysql/reverse_sql

在服务器上解压后,授权:

chmod 755 reverse_sql

选项说明:

options:
-h, --help show this help message and exit
-ot ONLY_TABLES [ONLY_TABLES …], --only-tables ONLY_TABLES [ONLY_TABLES …]
设置要恢复的表,多张表用,逗号分隔
-op ONLY_OPERATION, --only-operation ONLY_OPERATION
设置误操作时的命令(insert/update/delete)
-H MYSQL_HOST, --mysql-host MYSQL_HOST
MySQL主机名
-P MYSQL_PORT, --mysql-port MYSQL_PORT
MySQL端口号
-u MYSQL_USER, --mysql-user MYSQL_USER
MySQL用户名
-p MYSQL_PASSWD, --mysql-passwd MYSQL_PASSWD
MySQL密码
-d MYSQL_DATABASE, --mysql-database MYSQL_DATABASE
MySQL数据库名
-c MYSQL_CHARSET, --mysql-charset MYSQL_CHARSET
MySQL字符集,默认utf8
–binlog-file BINLOG_FILE
Binlog文件
–binlog-pos BINLOG_POS
Binlog位置,默认4
–start-time ST 起始时间
–end-time ET 结束时间
–max-workers MAX_WORKERS
线程数,默认10
–print 将解析后的SQL输出到终端
–replace 将update转换为replace操作

示例:

 ./reverse_sql -u 'wenjie.wang' -p 123 -H 10.10.4.154 -P 3306 -d scmprd -ot srm_pur_mat_require_main,srm_pur_mat_require_line --binlog-file /binlog/mysqlbin.000451 --start-time "2023-09-25 09:40:00" --end-time "2023-09-25 10:00:00"

工具运行后,会在当前目录下生成一个{db}_{table}_recover.sql文件,保存着原生SQL(原生SQL会加注释)和反向SQL。
但注意,如果字段值中包含换行符,则原生SQL后几行不会被注释,需要手动处理。

  • 注:reverse_sql支持MySQL 5.7/8.0和MariaDB,适用于CentOS 7系统。

可能存在的问题:

  • 数据库密码含特殊字符:需要加单引号圈起来;
  • 数据库字段中如有换行符或者其他特殊字符,则原生sql显示的时候后面可能不会注释,导致回滚sql错乱。因此需要我们将原生SQL用正则替换,即“-- 原生sql:”和“-- 回滚sql:”之间的部分(-- 原生sql:.*?-- 回滚sql:)

参考:

https://github.com/hcymysql
最后修改时间:2024-11-07 09:09:50
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论