zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

MySQL 数据库闪回工具binlog2sql —— 筑梦之路

mysql数据库工具 筑梦之路 闪回
2023-09-14 09:09:36 时间

适用范围:

mysql数据库,包括mysql、mariadb

github: 

https://github.com/danfengcao/binlog2sql.git

前提条件:

1)配置要求
[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
要授权一个用户有以下权限:

SELECT, REPLICATION SLAVE, REPLICATION CLIENT

2)权限说明:

select:需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句
super/replication client:两个权限都可以,需要执行'SHOW MASTER STATUS', 获取server端的binlog列表
replication slave:通过BINLOG_DUMP协议获取binlog内容的权限

3)binlog2sql的使用参数说明:
mysql连接配置

    -h host; -P port; -u user; -p password
解析模式

    --stop-never 持续同步binlog。可选。不加则同步至执行命令时最新的binlog位置。
    -K, --no-primary-key 对INSERT语句去除主键。可选。
    -B, --flashback 生成回滚语句,可解析大文件,不受内存限制,每打印一千行加一句SLEEP SELECT。可选。与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。可选。默认为空。

闪回原理:

MySQL binlog 以 event 为单位,记录数据库的变更信息,这些信息能够帮助我们重现这之间的所有变化,也就是所谓的闪回。利用 binlog 做闪回,需要将 binlog 格式设置为 row,因为我们需要最详尽的信息来确定操作之后数据不会出错。
既然 binlog 以 event 形式记录了所有的变更信息,那么我们把需要回滚的 event,从后往前回滚回去即可。

回滚操作:

1)对于 delete 操作,我们从 binlog 提取出 delete 信息,反向生成 insert 回滚语句;
2)对于 insert 操作,反向生成 delete 回滚语句;
3)对于 update 操作,根据信息生成反向的 update 语句。

#查看日志格式
show global variables like 'binlog_format';

#查看位置
show master status;

#做一系列操作增删改查


#使用binlog2sql进行格式为ROW的binlog生成标准SQL,带个-d的参数指定库名
python binlog2sql.py -uroot -h127.0.0.1 -proot -dtest --start-file='mysql-bin.000107' > test.sql

#生成反向sql
#对test这个库的所有操作生成反向SQL,这个时候需要在上面语句的基础上带一个-B参数,就是flashback闪回的意思

python binlog2sql.py -uroot -h127.0.0.1 -proot -dtest --start-file='mysql-bin.000107' -B > rollback_test.sql

#导入数据库
mysql>  use test;
Database changed
mysql>  source /tmp/rollback_test.sql

注意事项:

drop table 和truncate table 是无法生成反向SQL的,所以建议线上程序账号只给insert,upfate,select,delete权限