使用 binlog2sql 恢复 MySQL 数据

binlog2sql

从 MySQL binlog 解析出你要的 SQL。根据不同选项,你可以得到原始 SQL、回滚 SQL、去除主键的 INSERT SQL 等。

  • GitHub

使用条件

开启 bin-log

MySQL Server 必须开启 bin-log 配置。

[mysqld]
server_id = 1
log_bin = "C:/Program Files (x86)/MySQL/mysql-5.7.33-win32/mysql-bin.log"
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

查看 bin-log 类型:

show global variables like '%format%';

安装 Python 依赖

安装 pymysql

pip3 install pymysql

安装 mysql-replication

pip3 install mysql-replication

安装 pymysql-utils

pip3 install --user pymysql==0.10.1

mysql-replication 模块依赖 PyMySQL 模块,并且在 PyMySQL 模块 1.0.0 之后,移除了【pymysql.util】

异常处理

异常:

Traceback (most recent call last):
  File ".\binlog2sql.py", line 150, in <module>
    back_interval=args.back_interval, only_dml=args.only_dml, sql_type=args.sql_type)
  File ".\binlog2sql.py", line 48, in __init__
    with self.connection as cursor:
AttributeError: __enter__

需要将 binlog2sql.py 文件第 48 行,修改为:

with self.connection.cursor() as cursor:

异常:

<pymysql.connections.Connection object at 0x03476BD0>
Traceback (most recent call last):
  File ".\binlog2sql.py", line 151, in <module>
    binlog2sql.process_binlog()
  File ".\binlog2sql.py", line 74, in process_binlog
    with temp_open(tmp_file, "w") as f_tmp, self.connection as cursor:
AttributeError: __enter__

需要将 binlog2sql.py 文件第 74 行,修改为:

with temp_open(tmp_file, "w") as f_tmp, self.connection.cursor() as cursor:

参数说明

mysql 连接配置

-h host; -P port; -u user; -p password

解析模式

--stop-never 持续解析 binlog。可选。默认 False,同步至执行命令时最新的 binlog 位置。

-K, --no-primary-key 对 INSERT 语句去除主键。可选。默认 False

-B, --flashback 生成回滚 SQL,可解析大文件,不受内存限制。可选。默认 False。与 stop-never 或 no-primary-key 不能同时添加。

--back-interval -B 模式下,每打印一千行回滚 SQL,加一句 SLEEP 多少秒,如不想加 SLEEP,请设为 0。可选。默认 1.0。

解析范围控制

--start-file 起始解析文件,只需文件名,无需全路径 。必须。

--start-position/--start-pos 起始解析位置。可选。默认为 start-file 的起始位置。

--stop-file/--end-file 终止解析文件。可选。默认为 start-file 同一个文件。若解析模式为 stop-never,此选项失效。

--stop-position/--end-pos 终止解析位置。可选。默认为 stop-file 的最末位置;若解析模式为 stop-never,此选项失效。

--start-datetime 起始解析时间,格式 '% Y-% m-% d % H:% M:% S'。可选。默认不过滤。

--stop-datetime 终止解析时间,格式 '% Y-% m-% d % H:% M:% S'。可选。默认不过滤。

对象过滤

-d, --databases 只解析目标 db 的 sql,多个库用空格隔开,如 - d db1 db2。可选。默认为空。

-t, --tables 只解析目标 table 的 sql,多张表用空格隔开,如 - t tbl1 tbl2。可选。默认为空。

--only-dml 只解析 dml,忽略 ddl。可选。默认 False。

--sql-type 只解析指定类型,支持 INSERT, UPDATE, DELETE。多个类型用空格隔开,如 --sql-type INSERT DELETE。可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。

使用方式

使用示例:

python .\binlog2sql.py -hlocalhost -P3306 -uroot -p'jue' --start-file='mysql-bin.000001' --stop-file='mysql-bin.000003'

使用示例:

python .\binlog2sql.py -h'XX.XX.XX.XX' -P3306 -uXXX -pXXX -dXXX -tXXX --start-file='mysql-bin.335529'

异常处理

异常:

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"

访问 下载,安装 C++ 库文件。

异常:

C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30037\bin\HostX86\x86\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MT -Dversion_info=(2,0,3,'final',0) -D__version__=2.0.3 "-IC:\Program Files (x86)\MySQL\MySQL Connector C 6.1\include\mariadb" -Ic:\greensoftware\python\python37\include -Ic:\greensoftware\python\python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30037\include" /TcMySQLdb/_mysql.c /Fobuild\temp.win32-3.7\Release\MySQLdb/_mysql.obj
   _mysql.c
   MySQLdb/_mysql.c(29): fatal error C1083: 无法打开包括文件: “mysql.h”: No such file or directory
fatal error C1083: 无法打开包括文件: “corecrt.h”: No such file or directory

勾选 “Windows Universal CRT SDK”,安装它。

fatal error C1083: 无法打开包括文件: “windows.h”: No such file or directory