Mysql闪回工具(Flashback )-介绍以及使用

mysql

背景:今天在操作数据库的时候直接修改了数据库字段,由于本人比较菜没有写where 语句,导致现网全部数据都被更新覆盖

这个时候当然是不能跑路的啊, 毕竟我是一个富有责任心的人 毕竟我是一个富有责任心的人 毕竟我是一个富有责任心的人.主要还是我会

之前我在看mysql45讲时候,作者已经说过通过使用binlog+row+Flashback 方式去恢复数据

这里一定要开启binlogrow模式,关于这个模式可以看下45讲内容

mysql 闪回工具具体可以分为 3类

patch

第一类是以patch形式集成到官方工具mysqlbinlog中。以彭提交的patch为代表。

  • 优点:
    上手成本低。mysqlbinlog原有的选项都能直接利用,只是多加了一个闪回选项。闪回特性未来有可能被官方收录。
    支持离线解析。
  • 缺点:
    兼容性差、项目活跃度不高。由于binlog格式的变动,如果闪回工具作者不及时对补丁升级,则闪回工具将无法使用。目前已有多位人员分别针对mysql5.5,5.6,5.7开发了patch,部分项目代码公开,但总体上活跃度都不高。
    难以添加新功能,实战效果欠佳。在实战中,经常会遇到现有patch不满足需求的情况,比如要加个表过滤,很简单的一个需求,代码改动也不会大,但对大部分DBA来说,改mysql源码还是很困难的事。
    安装稍显麻烦。需要对mysql源码打补丁再编译生成。
    这些缺点,可能都是闪回没有流行开来的原因。

独立工具

第二类是独立工具,通过伪装成slave拉取binlog来进行处理。以binlog2sql为代表。

  • 优点:
    兼容性好。伪装成slave拉binlog这项技术在业界应用的非常广泛,多个开发语言都有这样的活跃项目,MySQL版本的兼容性由这些项目搞定,闪回工具的兼容问题不再突出。
    添加新功能的难度小。更容易被改造成DBA自己喜欢的形式。更适合实战。
    安装和使用简单。
  • 缺点:
    必须开启MySQL server。

简单脚本

第三类是简单脚本。先用mysqlbinlog解析出文本格式的binlog,再根据回滚原理用正则进行匹配并替换。

  • 优点:
    脚本写起来方便,往往能快速搞定某个特定问题。
    安装和使用简单。
    支持离线解析。
  • 缺点:
    通用性不好。
    可靠性不好。
    就目前的闪回工具而言,线上环境的闪回,笔者建议使用binlog2sql,离线解析使用mysqlbinlog。

这里我们讲第二类工具方法

  1. 方法 binlog2sql 对于客户端强依赖
  2. 方法 MyFlash 可以不必依赖客户端,目前只支持 5.7,5.8版本

binlog2sql

执行下列该操作的时候避免对现网系统造成二次伤害,建议拉取现网log,放到测试环境上面

# 安装git
root@admin> yum install -y git# 安装pip工具
root@admin> yum install -y epel-release
root@admin> yum install -y python-pip
​
# 安装binlog2sql
root@admin> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
root@admin> pip install -r requirements.txt

通过mysqlbinlog 分析出来当时错误处理位置

 mysqlbinlog --start-datetime="2021-06-05 11:07:40" --stop-datetime="2022-06-05 11:07:45"  -v  binlog.000009

根据位置去导出当时误删源数据

python binlog2sql.py  -h 127.0.0.1  -u root -p'root'  --start-file='mysql-bin.000051' --start-position=958983832  --stop-position=959082126 -B > rollback.sql

根据时间去查找当时误删源数据

python binlog2sql.py -h 127.0.0.1 -P3307  -u root -p'root'   --start-file='binlog.000009' --start-datetime="2021-06-05 11:07:40" --stop-datetime="22022-06-05 11:07:45"   > rollback.sql

根据时间去查找当时误删源数据并反转成insert语句

 python binlog2sql.py --flashback  -h 127.0.0.1 -P3307    -u root -p'root'  --start-file='binlog.000009' --start-position='958983832' --stop-position='959082126'   > rollback.sql

错误之一

Traceback (most recent call last):
  File "binlog2sql.py", line 149, in <module>
    back_interval=args.back_interval, only_dml=args.only_dml, sql_type=args.sql_type)
  File "binlog2sql.py", line 53, in __init__
    raise ValueError('parameter error: start_file %s not in mysql server' % self.start_file)
ValueError: parameter error: start_file /data/mysql/data/binlog.000012 not in mysql server

这个时候要看好你当时测试数据库的 binlog_index 头尾都在哪里,如果index 第一个文件是 binlog.00009,记得要将正式环境的log 重命名, 并且讲正式环境的 binlog 放入跟 测试log 同一个目录下面。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhougubei/article/details/124634017