代码拉取完成,页面将自动刷新
从MySQL binlog解析出你要的SQL。根据不同选项,你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。
shell> git clone https://github.com/codelhf/binlog2sql.git && cd binlog2sql
shell> pip install -r requirements.txt
git与pip的安装问题请自行搜索解决。
[mysqld]
server_id = 1
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
# 建议授权
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO
权限说明
# mysql连接配置
host = '127.0.0.1'
port = 3306
user = 'root'
password = 'root'
# 数据库配置
# 只解析目标db的sql,多个库用 , 隔开,如-d db1 db2。可选。默认为空
databases = 'test',
# 只解析目标table的sql,多张表用 , 隔开,如-t tbl1 tbl2。可选。默认为空
tables = ''
# binlog配置
# 起始解析文件,只需文件名,无需全路径 。必须。
start_file = 'mysql-bin.000002'
# 终止解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。
stop_file = ''
# 起始解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。
start_time = ''
# 终止解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。
stop_time = ''
# 起始解析位置。可选。默认为start-file的起始位置。
start_position = '763'
# 终止解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效
stop_position = '1147'
# 持续解析binlog。可选。默认False,同步至执行命令时最新的binlog位置
stop_never = False
# 只解析dml,忽略ddl。可选。默认False
only_dml = False
# 只解析指定类型,支持INSERT, UPDATE, DELETE。多个类型用 , 隔开,用了此参数但没填任何类型,则三者都不解析
sql_type = 'INSERT', 'UPDATE', 'DELETE'
# no-primary-key 对INSERT语句去除主键。可选。默认False
no_pk = False
# 输出配置
# 生成回滚SQL,可解析大文件,不受内存限制。可选。默认False。与stop-never或no-primary-key不能同时添加
flashback = True
# SQL文件输出路径,tables不为空时,每个table的SQL文件保存在该路径下的table的文件夹下
output_path = 'F:\\test' + os.sep + tables
# 输出到控制台。默认False
output_console = True
解析出标准SQL和回滚SQL
shell> python main.py
INSERT INTO `test`.`test3`(`addtime`, `data`, `id`) VALUES ('2016-12-10 13:03:38', 'english', 4); #start 570 end 736
UPDATE `test`.`test3` SET `addtime`='2016-12-10 12:00:00', `data`='中文', `id`=3 WHERE `addtime`='2016-12-10 13:03:22' AND `data`='中文' AND `id`=3 LIMIT 1; #start 763 end 954
DELETE FROM `test`.`test3` WHERE `addtime`='2016-12-10 13:03:38' AND `data`='english' AND `id`=4 LIMIT 1; #start 981 end 1147
###### rollback sql ######
INSERT INTO `test`.`test3`(`addtime`, `data`, `id`) VALUES ('2016-12-10 13:03:38', 'english', 4); #start 981 end 1147
UPDATE `test`.`test3` SET `addtime`='2016-12-10 13:03:22', `data`='中文', `id`=3 WHERE `addtime`='2016-12-10 12:00:00' AND `data`='中文' AND `id`=3 LIMIT 1; #start 763 end 954
闪回详细介绍可参见example目录下《闪回原理》example/mysql-flashback-priciple
# test库tbl表原有数据
mysql> select * from tbl;
+----+--------+---------------------+
| id | name | addtime |
+----+--------+---------------------+
| 1 | 小赵 | 2016-12-10 00:04:33 |
| 2 | 小钱 | 2016-12-10 00:04:48 |
| 3 | 小孙 | 2016-12-13 20:25:00 |
| 4 | 小李 | 2016-12-12 00:00:00 |
+----+--------+---------------------+
4 rows in set (0.00 sec)
mysql> delete from tbl;
Query OK, 4 rows affected (0.00 sec)
# 20:28时,tbl表误操作被清空
mysql> select * from tbl;
Empty set (0.00 sec)
恢复数据步骤:
mysql> show master status;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000051 | 967 |
| mysql-bin.000052 | 965 |
+------------------+-----------+
# mysql连接配置
host = '127.0.0.1'
port = 3306
user = 'root'
password = 'root'
# 数据库配置
# 只解析目标db的sql,多个库用 , 隔开,如-d db1 db2。可选。默认为空
databases = 'test',
# 只解析目标table的sql,多张表用 , 隔开,如-t tbl1 tbl2。可选。默认为空
tables = 'tbl'
# binlog配置
# 起始解析文件,只需文件名,无需全路径 。必须。
start_file = 'mysql-bin.000052'
# 终止解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。
stop_file = ''
# 起始解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。
start_time = '2016-12-13 20:25:00'
# 终止解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。
stop_time = '2016-12-13 20:30:00'
# 起始解析位置。可选。默认为start-file的起始位置。
start_position = ''
# 终止解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效
stop_position = ''
# 持续解析binlog。可选。默认False,同步至执行命令时最新的binlog位置
stop_never = False
# 只解析dml,忽略ddl。可选。默认False
only_dml = False
# 只解析指定类型,支持INSERT, UPDATE, DELETE。多个类型用 , 隔开,用了此参数但没填任何类型,则三者都不解析
sql_type = 'INSERT', 'UPDATE', 'DELETE'
# no-primary-key 对INSERT语句去除主键。可选。默认False
no_pk = False
# 输出配置
# 生成回滚SQL,可解析大文件,不受内存限制。可选。默认False。与stop-never或no-primary-key不能同时添加
flashback = True
# SQL文件输出路径,tables不为空时,每个table的SQL文件保存在该路径下的table的文件夹下
output_path = 'F:\\test' + os.sep + tables
# 输出到控制台。默认False
output_console = False
shell> python main.py
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:26:00', 4, '小李'); #start 317 end 487 time 2016-12-13 20:26:26
UPDATE `test`.`tbl` SET `addtime`='2016-12-12 00:00:00', `id`=4, `name`='小李' WHERE `addtime`='2016-12-13 20:26:00' AND `id`=4 AND `name`='小李' LIMIT 1; #start 514 end 701 time 2016-12-13 20:27:07
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:33' AND `id`=1 AND `name`='小赵' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:48' AND `id`=2 AND `name`='小钱' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-13 20:25:00' AND `id`=3 AND `name`='小孙' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-12 00:00:00' AND `id`=4 AND `name`='小李' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
###### rollback sql ######
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-12 00:00:00', 4, '小李'); #start 728 end 938 time 2016-12-13 20:28:05
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:25:00', 3, '小孙'); #start 728 end 938 time 2016-12-13 20:28:05
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:48', 2, '小钱'); #start 728 end 938 time 2016-12-13 20:28:05
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:33', 1, '小赵'); #start 728 end 938 time 2016-12-13 20:28:05
shell> mysql -h127.0.0.1 -P3306 -uroot -p'root' < rollback.sql
mysql> select * from tbl;
+----+--------+---------------------+
| id | name | addtime |
+----+--------+---------------------+
| 1 | 小赵 | 2016-12-10 00:04:33 |
| 2 | 小钱 | 2016-12-10 00:04:48 |
| 3 | 小孙 | 2016-12-13 20:25:00 |
| 4 | 小李 | 2016-12-12 00:00:00 |
+----+--------+---------------------+
有任何问题,请与我联系。邮箱:liuhf668@163.com
欢迎提问题提需求,欢迎pull requests!
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。