设为首页 收藏本站
查看: 947|回复: 0

[经验分享] mysql闪回工具binlog2sql 安装使用

[复制链接]

尚未签到

发表于 2018-10-2 08:09:24 | 显示全部楼层 |阅读模式
  软件包下载地址:链接:https://pan.baidu.com/s/15dDeGufVWOgVrfATGWBzaA 密码:gnz8
  DBA或开发人员,有时会误删或者误更新数据,如果是线上环境会影响较大,这就需要能快速回滚;而MySQL闪回(flashback)利用binlog能直接进行回滚,并且能快速恢复数据(MySQL闪回现在只支持DML语句进行闪回)。
  利用binlog闪回需要的条件:
  Mysql参数设置:
  log_bin = /目录/mysql-bin.log(开启)
  binlog_format = row
  binlog_row_image = full(默认是full)
  工作原理主要是对于delete操作,从binlog取出delete信息,生成insert的回滚语句。对于insert操作,回滚SQL是delete。对于update操作,回滚sql应该交换SET和WHERE的值。
  安装:
  环境准备安装各种依赖的工具包列表
  将python换成python3.6版本 (python版本升级参考博客:https://blog.csdn.net/wwwdaan5com/article/details/78218277)
  python-pip ,
  PyMySQL ,
  python-mysql-replication,
  wheel argparse
  1、binlog2sql下载
  https://github.com/danfengcao/binlog2sql
  2、binlog2sql依赖包安装
  (1)PyMySQL-0.8.0安装
  https://pypi.python.org/pypi/PyMySQL/
  [root@node1 binlogsql]# tar -xzvf PyMySQL-0.8.0.tar.gz
  [root@node1 binlogsql]# cd PyMySQL-0.8.0
  [root@node1 PyMySQL-0.8.0]# python setup.py install
  (2)wheel-0.31.0安装
  https://pypi.python.org/pypi/wheel/
  [root@node1 binlogsql]# tar -xzvf wheel-0.31.0.tar.gz
  [root@node1 binlogsql]# cd wheel-0.31.0
  [root@node1 wheel-0.31.0]# python setup.py install
  (3)python-mysql-replication安装
  https://github.com/noplay/python-mysql-replication
  [root@node1 binlogsql]# unzip python-mysql-replication-master.zip
  [root@node1 binlogsql]# cd python-mysql-replication-master
  [root@node1 python-mysql-replication-master]# python setup.py  install
  (4)可以通过pip安装相应的依赖包
  https://pypi.python.org/pypi/pip
  [root@node1 tools]# tar -xzvf pip-10.0.1.tar.gz
  [root@node1 tools]# cd pip-10.0.1
  [root@node1 pip-10.0.1]# python setup.py install
  [root@node1 binlog2sql-master]# pip install  -r requirements.txt
  可能会出错误。
  FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.6/site-packages/mysql_replication-0.18-py3.6.egg'
  依赖包版本问题。
  执行。。pip install mysql-replication
  再执行 pip install  -r requirements.txt
DSC0000.jpg

  显示都已安装完成。
  实战演练:
  1.查看测试数据:
  MariaDB [test]> select * from t;
  +----+--------------+

  |>  +----+--------------+
  |  1 | ga           |
  | 31 | ga           |
  | 38 | ga           |
  | 45 | ga           |
  | 52 | hg           |
  | 59 | hh           |
  | 61 | 规划如果     |
  | 68 | 干点啥       |
  | 73 | ww           |
  | 80 | ww           |
  | 87 | gg           |
  | 94 | gg           |
  +----+--------------+
  12 rows in set (0.00 sec)
  2.删除部分数据:

  MariaDB [test]> delete from t where>  Query OK, 8 rows affected (0.18 sec)
  MariaDB [test]> select * from t;
  +----+------+

  |>  +----+------+
  |  1 | ga   |
  | 31 | ga   |
  | 38 | ga   |
  | 45 | ga   |
  +----+------+
  4 rows in set (0.00 sec)
  删了8条记录。
  3.查看master的日志位置。
  MariaDB [test]> show master status;
  +------------------+-----------+--------------+------------------+
  | File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
  +------------------+-----------+--------------+------------------+
  | mysql-bin.000029 | 468829331 |              |                  |
  +------------------+-----------+--------------+------------------+
  1 row in set (0.01 sec)
  4.根据误操作的大概时间找出相应的误操作语句
  [root@localhost binlog2sql]# python binlog2sql.py -h172.168.1.201 -P3306 -uroot -p123456 -dtest -tt --start-file='mysql-bin.000029' --start-datetime='2018-05-10 11:00:00' --stop-datetime='2018-05-10 11:10:00' > a.sql
  [root@localhost binlog2sql]# cat a.sql
  DELETE FROM `test`.`t` WHERE `id`=52 AND `name`='hg' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52
  DELETE FROM `test`.`t` WHERE `id`=59 AND `name`='hh' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52
  DELETE FROM `test`.`t` WHERE `id`=61 AND `name`='规划如果' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52
  DELETE FROM `test`.`t` WHERE `id`=68 AND `name`='干点啥' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52
  DELETE FROM `test`.`t` WHERE `id`=73 AND `name`='ww' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52
  DELETE FROM `test`.`t` WHERE `id`=80 AND `name`='ww' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52
  DELETE FROM `test`.`t` WHERE `id`=87 AND `name`='gg' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52
  DELETE FROM `test`.`t` WHERE `id`=94 AND `name`='gg' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52
  从a.sql中可以查到这个事物在binlog中的start和end(binlog2sql对于同一个事务会输出同样的start position)
  5.根据上一步中的位置点生成相应的insert恢复语句
  使用 -B 选项生成回滚sql,检查回滚sql是否正确。(注:真实场景下,生成的回滚SQL经常会需要进一步筛选,查看里面是否有别的表的dml语句以及本表的非delete操作的语句,结合grep、编辑器等)
  [root@localhost binlog2sql]# python binlog2sql.py -h172.168.1.201 -P3306 -uroot -p123456 -dtest -tt --start-file='mysql-bin.000029' --start-position=468829113 --stop-position=468829304 -B > b.sql
  [root@localhost binlog2sql]# cat b.sql
  INSERT INTO `test`.`t`(`id`, `name`) VALUES (94, 'gg'); #start 468829113 end 468829304 time 2018-05-10 11:06:52
  INSERT INTO `test`.`t`(`id`, `name`) VALUES (87, 'gg'); #start 468829113 end 468829304 time 2018-05-10 11:06:52
  INSERT INTO `test`.`t`(`id`, `name`) VALUES (80, 'ww'); #start 468829113 end 468829304 time 2018-05-10 11:06:52
  INSERT INTO `test`.`t`(`id`, `name`) VALUES (73, 'ww'); #start 468829113 end 468829304 time 2018-05-10 11:06:52
  INSERT INTO `test`.`t`(`id`, `name`) VALUES (68, '干点啥'); #start 468829113 end 468829304 time 2018-05-10 11:06:52
  INSERT INTO `test`.`t`(`id`, `name`) VALUES (61, '规划如果'); #start 468829113 end 468829304 time 2018-05-10 11:06:52
  INSERT INTO `test`.`t`(`id`, `name`) VALUES (59, 'hh'); #start 468829113 end 468829304 time 2018-05-10 11:06:52
  INSERT INTO `test`.`t`(`id`, `name`) VALUES (52, 'hg'); #start 468829113 end 468829304 time 2018-05-10 11:06:52
  和删除语句进行对比  刚好8条。
  6、与开发确认回滚sql没问题后,执行回滚语句并确认回滚成功。
  MariaDB [test]> source /home/binlog2sql-master/binlog2sql/b.sql
  Query OK, 1 row affected (0.06 sec)
  Query OK, 1 row affected (0.06 sec)
  Query OK, 1 row affected (0.09 sec)
  Query OK, 1 row affected (0.05 sec)
  Query OK, 1 row affected (0.05 sec)
  Query OK, 1 row affected (0.05 sec)
  Query OK, 1 row affected (0.05 sec)
  Query OK, 1 row affected (0.05 sec)
  MariaDB [test]> select * from t;
  +----+--------------+

  |>  +----+--------------+
  |  1 | ga           |
  | 31 | ga           |
  | 38 | ga           |
  | 45 | ga           |
  | 52 | hg           |
  | 59 | hh           |
  | 61 | 规划如果     |
  | 68 | 干点啥       |
  | 73 | ww           |
  | 80 | ww           |
  | 87 | gg           |
  | 94 | gg           |
  +----+--------------+
  12 rows in set (0.00 sec)
  7。
  (1)闪回的关键是快速筛选出真正需要回滚的SQL。
  (2)先根据库、表、时间做一次过滤,再根据位置做更准确的过滤。
  (3)由于数据一直在写入,要确保回滚sql中不包含其他数据。可根据是否是同一事务、误操作行数、字段值的特征等等来帮助判断。
  (4)执行回滚sql时如有报错,需要查实具体原因,一般是因为对应的数据已发生变化。由于是严格的行模式,只要有唯一键(包括主键)存在,就只会报某条数据不存在的错,不必担心会更新不该操作的数据。
  (5)如果待回滚的表与其他表有关联,要与开发说明回滚和不回滚各自的副作用,再确定方案。
  (6)最重要的两点:筛选出正确SQL!与开发沟通清楚!


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-607343-1-1.html 上篇帖子: Mysql 集群 下篇帖子: MySQl5.6主主复制配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表