mysql

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

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

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

这里一定要开启binlog和row模式,关于这个模式可以看下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。

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

方法 binlog2sql 对于客户端强依赖方法 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

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 同一个目录下面。

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: