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

gitee:https://gitee.com/ShiZan/binlog2sql

该方法应用到的工具binlog2sql,需要安装python运行环境

1.安装pip命令

①、如果没有epel源下载阿里的epel源

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

②、安装pip

yum -y install python-pip
pip install socks
pip install pysocks

③.因为提示,版本过于老旧,所以运行以下命令更新

 pip install --upgrade pip

2.安装git环境然后在/mydata目录下执行

git clone https://gitee.com/ShiZan/binlog2sql.git

或者直接上传文件binlog2sql.zip到/mydata目录下

解压

unzip binlog2sql.zip 

3.在/mydata/binlog2sql目录下执行

pip install -r requirements.txt

4.使用方法:

选项
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。可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。

在/mydata/binlog2sql/binlog2sql目录下执行

①解析出标准SQL

[root@mac-shuidi-7-121 binlog2sql]# python binlog2sql.py -h192.168.54.120 -P3306 -uroot -p'ShiZan_666' -dcanal_db -t canal_table --start-file='mysql-bin.000005' --start-position=951233 --stop-position=951509
INSERT INTO `canal_db`.`canal_table`(`remark`, `version`, `id`, `from_type`) VALUES ('测试binlog还原sql', 0, 42, 1); #start 951233 end 951509 time 2020-12-01 17:58:38

canal_d:数据库名称

canal_table:表名

start-file:binlog日志文件

start-position:开始位置

stop-position:结束位置

②误删恢复演练

假设大概在2020-12-02 10:00:00 ~2020-12-02 10:10:00分之间进行了删除操作

<1>登录mysql,查看目前的binlog文件

mysql> show master status;
+------------------+----------+------------------+-------------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB     | Binlog_Ignore_DB                                | Executed_Gtid_Set |
+------------------+----------+------------------+-------------------------------------------------+-------------------+
| mysql-bin.000005 |   953091 | user_db,canal_db | mysql,information_schema,performance_schema,sys |                   |
+------------------+----------+------------------+-------------------------------------------------+-------------------+
1 row in set (0.00 sec)

<2> 最新的binlog文件是mysql-bin.000005,我们再定位误操作SQL的binlog位置。误操作人只能知道大致的误操作时间,我们根据大致时间过滤数据。

[root@mac-shuidi-7-121 binlog2sql]# python binlog2sql.py -h192.168.54.120 -P3306 -uroot -p'ShiZan_666' -dcanal_db -tcanal_table --start-file='mysql-bin.000005' --start-datetime='2020-12-02 10:00:00' --stop-datetime='2020-12-02 10:10:00'DELETE FROM `canal_db`.`canal_table` WHERE `remark`='新增ql语句2' AND `version`=0 AND `id`=38 AND `from_type`=1 LIMIT 1; #start 951540 end 951810 time 2020-12-02 10:05:01
DELETE FROM `canal_db`.`canal_table` WHERE `remark`='新增sql语句3' AND `version`=2 AND `id`=39 AND `from_type`=1 LIMIT 1; #start 951841 end 952112 time 2020-12-02 10:05:01
DELETE FROM `canal_db`.`canal_table` WHERE `remark`='测试以表名为topic,发送消息后启动应用' AND `version`=1 AND `id`=40 AND `from_type`=1 LIMIT 1; #start 952143 end 952449 time 2020-12-02 10:05:01
DELETE FROM `canal_db`.`canal_table` WHERE `remark`='新增一条数据' AND `version`=0 AND `id`=41 AND `from_type`=1 LIMIT 1; #start 952480 end 952753 time 2020-12-02 10:05:01
DELETE FROM `canal_db`.`canal_table` WHERE `remark`='测试binlog还原sql' AND `version`=0 AND `id`=42 AND `from_type`=1 LIMIT 1; #start 952784 end 953060 time 2020-12-02 10:05:01
INSERT INTO `canal_db`.`canal_table`(`remark`, `version`, `id`, `from_type`) VALUES ('误删操作后新增的数据1', 0, 43, 1); #start 953091 end 953377 time 2020-12-02 10:07:35
INSERT INTO `canal_db`.`canal_table`(`remark`, `version`, `id`, `from_type`) VALUES ('误删操作后新增的数据2', 0, 44, 1); #start 953408 end 953694 time 2020-12-02 10:07:49
UPDATE `canal_db`.`canal_table` SET `remark`='误删操作后新增的数据1', `version`=1, `id`=43, `from_type`=1 WHERE `remark`='误删操作后新增的数据1' AND `version`=0 AND `id`=43 AND `from_type`=1 LIMIT 1; #start 953725 end 954059 time 2020-12-02 10:07:52

<3>我们得到了误操作sql的准确位置在951540-953060之间,再根据位置进一步过滤,使用flashback模式生成回滚sql,检查回滚sql是否正确(注:真实环境下,此步经常会进一步筛选出需要的sql。结合grep、编辑器等)

python binlog2sql.py -h192.168.54.120 -P3306 -uroot -p'ShiZan_666' -dcanal_db -tcanal_table --start-file='mysql-bin.000005' --start-position=951540 --stop-position=953060 -B > rollback.sql | cat
INSERT INTO `canal_db`.`canal_table`(`remark`, `version`, `id`, `from_type`) VALUES ('测试binlog还原sql', 0, 42, 1); #start 952784 end 953060 time 2020-12-02 10:05:01
INSERT INTO `canal_db`.`canal_table`(`remark`, `version`, `id`, `from_type`) VALUES ('新增一条数据', 0, 41, 1); #start 952480 end 952753 time 2020-12-02 10:05:01
INSERT INTO `canal_db`.`canal_table`(`remark`, `version`, `id`, `from_type`) VALUES ('测试以表名为topic,发送消息后启动应用', 1, 40, 1); #start 952143 end 952449 time 2020-12-02 10:05:01
INSERT INTO `canal_db`.`canal_table`(`remark`, `version`, `id`, `from_type`) VALUES ('新增sql语句3', 2, 39, 1); #start 951841 end 952112 time 2020-12-02 10:05:01
INSERT INTO `canal_db`.`canal_table`(`remark`, `version`, `id`, `from_type`) VALUES ('新增ql语句2', 0, 38, 1); #start 951540 end 951810 time 2020-12-02 10:05:01

在当前目录下生成 rollback.sql 文件,在业务方确认后执行sql

mysql -h192.168.54.120 -P3306 -uroot -p'ShiZan_666' < rollback.sql

数据恢复

③新增恢复演练

前两步定位同上,得到准确位置在 #start 953408 end 953694

获取恢复sql

[root@mac-shuidi-7-121 binlog2sql]# python binlog2sql.py -h192.168.54.120 -P3306 -uroot -p'ShiZan_666' -dcanal_db -tcanal_table --start-file='mysql-bin.000005' --start-position=953408 --stop-position=953694  -BDELETE FROM `canal_db`.`canal_table` WHERE `remark`='误删操作后新增的数据2' AND `version`=0 AND `id`=44 AND `from_type`=1 LIMIT 1; #start 953408 end 953694 time 2020-12-02 10:07:49

执行sql恢复数据

④修改恢复演练

前两步定位同上,得到准确位置在 #start 953725 end 954059

获取恢复sql

[root@mac-shuidi-7-121 binlog2sql]# python binlog2sql.py -h192.168.54.120 -P3306 -uroot -p'ShiZan_666' -dcanal_db -tcanal_table --start-file='mysql-bin.000005' --start-position=953725 --stop-position=954059  -BUPDATE `canal_db`.`canal_table` SET `remark`='误删操作后新增的数据1', `version`=0, `id`=43, `from_type`=1 WHERE `remark`='误删操作后新增的数据1' AND `version`=1 AND `id`=43 AND `from_type`=1 LIMIT 1; #start 953725 end 954059 time 2020-12-02 10:07:52

执行sql恢复数据

如何利用binlog还原sql或者恢复数据相关推荐

  1. python binlog还原sql或者恢复数据

    github:https://github.com/danfengcao/binlog2sql gitee:https://gitee.com/ShiZan/binlog2sql 下载地址 该方法应用 ...

  2. vue请求数据完成后执行_生产库删除数据后怎样执行对应的undo sql来恢复数据?...

    概述 Oracle11g 闪回事务查询就是对过去某段时间内所完成的事务的查询和撤销,通过闪回事物分析,可以识别在一个特定的时间段内所发生的所有变化,也可以对数据库表进行事物级恢复. 前面提到可以审计一 ...

  3. java oracle数据回滚,误操作ORACLE生产数据利用闪回查询备份恢复数据-java-51CTO博客...

    生产环境中万一对生产数据进行了误操作,这个时候有没有什么技术能够进行紧急回滚? 一>备份没执行脱敏脚本之前的数据 select * from cr_dw as of timestamp to_t ...

  4. mysql data目录 清空_Mysql binlog备份数据及恢复数据,学会这个,我在也不怕删库跑路啦~...

    导读 我一直都主张,技多不压身(没有学不会的技术,只有不学习的人),多学一项技能,未来就少求人一次.网上经常听到xxx删库跑路,万一真的遇到了,相信通过今天的学习,也能将数据再恢复回来~~~ 介绍 记 ...

  5. 利用 MySQL bin-log 恢复数据表

    今天公司一同事使用典型的"UPDATE 不带 WHERE 语句"误操作把数据库中一张极重要数据表 player 给"做掉了",还算幸运的是该数据库每3个月会完整 ...

  6. MySQL 技术篇- linux下mysql数据库利用binlog文件进行数据回滚实例演示,binlog恢复数据库的两种方式

    MySQL 数据库数据回滚 第一章:利用 binlog 进行数据回滚 ① 查看 binlog 文件所在位置 ② 查看主数据正在存储数据的 binlog 文件名 ③ 在控制台查看 binlog 文件内容 ...

  7. mysql用binlog恢复数据_利用mysql的binlog恢复数据

    MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...

  8. MySQL 之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 一 ...

  9. 不小心删除数据--利用MySQL的binlog恢复数据

    MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...

最新文章

  1. 以下一些使用ASP.NET和VISUAL STUDIO.NET2003的经验和技巧
  2. 一张清华大学教授工资单曝光!想象与现实天壤之别……
  3. Android5.0之CardView的使用
  4. linux 重新分区挂载,Linux:挂载磁盘分区,linux已挂载磁盘重新分区
  5. Android深度探索第四章
  6. python ip动态代理_Python 爬虫设置动态代理
  7. 矩阵乘法和快速幂的一些优化和剪枝
  8. TCP三次握手连接及seq和ack号的正确理解
  9. How does UDO tool resolve objects
  10. python 多层包多模块_python Modules模块操作
  11. 舞伴配对问题java_舞伴配对问题
  12. c#解决在数据表格中无法显示秒数问题
  13. HTML+CSS+JS实现 ❤️创意时间轮盘时钟特效❤️
  14. 快速理解浮动对标准流的影响
  15. 20多个好用的 Vue 组件库
  16. scanf 用法及陷阱(转)
  17. python测验6_Python语言程序设计 - 测验6: 组合数据类型 (第6周)
  18. 算法笔记习题 2-9小节
  19. 用windows 画图 裁剪照片
  20. ROS机器人项目开发11例-ROS Robotics Projects-2019更新补充说明

热门文章

  1. python搞笑教程_Python10分钟入门教程,Python入门神图一张
  2. JAVA毕业设计干洗店订单管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
  3. JavaSE:第十二章:IO流
  4. npm error code ELIFECYCLE
  5. python preference_Android首选项(二) 隐藏Preference
  6. 百度设置小度机器人出现
  7. 计算博弈笔记(一)博弈论
  8. 找啊找啊找工作... ...
  9. 锁表:MyISAM非聚集索引和InnoDB聚集索引的各种锁表问题
  10. Qt积少成多,QComboBox自定义信号槽