阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用Python脚本实现MySQL误操作的快速回滚

431次阅读
没有评论

共计 4563 个字符,预计需要花费 12 分钟才能阅读完成。

1. 简介
在 Oracle 数据库中,当一个误操作被提交后,我们可以通过 Oracle 提供的闪回功能将表闪回至误操作之前的状态。mysql 中没有原生的 flushback 功能,DBA 误操作时,传统的恢复方式是利用全备 + 二进制日志前滚进行恢复。

今天给大家介绍一种使用 Python 脚本在 MySQL 中实现类似 Oracle 中 flushback table 的闪回功能,相比于传统的全备 + 增备,本方法更为快速、简单。

2. 闪回原理
原理:调用 mysql_rollback.py 下载见本文最后)对 rows 格式的 binlog 进行逆向操作,delete 反向生成 insert、update 生成反向的 update、insert 反向生成 delete。

3. 说明
0、需安装 python 及 MySQLdb 模块
1、binlog 的格式必须为 row
2、要恢复的表操作前后表结构没有发生变更,否则脚本无法解析
3、只生成 DML(insert/update/delete) 的 rollback 语句,DDL 语句不可回滚
4、最终生成的 SQL 是逆序的,所以最新的 DML 会生成在输入文件的最前面,并且带上了时间戳和偏移点,方便查找目标
5、需要提供一个连接 MySQL 的只读用户,主要是为了获取表结构
6、如果 binlog 过大,建议带上时间范围,也可以指定只恢复某个库的 SQL
7、SQL 生成后,请务必在测试环境上测试恢复后再应用到线上

4. 实战
step1. 登陆 mysql 查看表信息

mysql> use db1
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from test;
+——+——-+——+———+———-+
| id  | name  | age  | country | city    |
+——+——-+——+———+———-+
|    1 | alex  |  26 | china  | shanghai |
|    2 | bob  |  25 | britain | london  |
|    3 | simon |  24 | france  | paris    |
+——+——-+——+———+———-+
3 rows in set (0.00 sec)

step2. 模拟误操作(update)

mysql> update test set country=’europe’ where name=’bob’;  –bob 的国家被改为 europe
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from test;
+——+——-+——+———+———-+
| id  | name  | age  | country | city    |
+——+——-+——+———+———-+
|    1 | alex  |  26 | china  | shanghai |
|    2 | bob  |  25 | europe  | london  |
|    3 | simon |  24 | france  | paris    |
+——+——-+——+———+———-+
3 rows in set (0.00 sec)

mysql> exit;
Bye

step3. 分析 binlog 并生成反向语句
找到最新的 binlog

SZD-L0087668:gzz3306:Master > ll
-rw-rw—- 1 mysql mysql      167 May  2 14:30 mysql-bin.000001
-rw-rw—- 1 mysql mysql 11400402 May  2 19:28 mysql-bin.000002
-rw-rw—- 1 mysql mysql    1807 May  2 19:49 mysql-bin.000003
-rw-rw—- 1 mysql mysql      660 May  2 20:10 mysql-bin.000004
-rw-rw—- 1 mysql mysql      403 May  2 20:10 mysql-bin.000005
-rw-rw—- 1 mysql mysql      584 May  3 10:45 mysql-bin.000006
-rw-rw—- 1 mysql mysql      417 May  3 10:53 mysql-bin.000007
-rw-rw—- 1 mysql mysql    1973 May  3 13:28 mysql-bin.000008
-rw-rw—- 1 mysql mysql    2604 May  3 14:13 **mysql-bin.000009**
-rw-rw—- 1 mysql mysql      369 May  3 13:28 mysql-bin.index
-rw-r–r– 1 root  root    12222 Apr 13  2017 mysql_rollback.py

根据关键词 europe 查找 binlog 中的误操作 sql,并输出 europe 前后 30 行(行数视具体情况而定,一定要输出语句对应的 BEGIN 和 COMMIT 部分)

SZD-L0087668:gzz3306:Master > mysqlbinlog –no-defaults -v -v –base64-output=DECODE-ROWS –set-charset=utf8 mysql-bin.000009 | grep -C 30 ‘europe’

BEGIN
/*!*/;
# at 2426
#180503 14:13:36 server id 1  end_log_pos 2482 CRC32 0xe79b9612        Table_map: `db1`.`test` mapped to number 76
# at 2482
#180503 14:13:36 server id 1  end_log_pos 2573 CRC32 0xacd94a0b        Update_rows: table id 76 flags: STMT_END_F
### UPDATE `db1`.`test`
### WHERE
###  @1=2 /* INT meta=0 nullable=1 is_null=0 */
###  @2=’bob’ /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
###  @3=25 /* INT meta=0 nullable=1 is_null=0 */
###  @4=’britain’ /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
###  @5=’london’ /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
### SET
###  @1=2 /* INT meta=0 nullable=1 is_null=0 */
###  @2=’bob’ /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
###  @3=25 /* INT meta=0 nullable=1 is_null=0 */
###  @4=’europe’ /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
###  @5=’london’ /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
# at 2573
#180503 14:13:36 server id 1  end_log_pos 2604 CRC32 0x63b3d5fa        Xid = 118
COMMIT/*!*/;

选取 2426 和 2604 作为分析 binlog 的起始位置

SZD-L0087668:gzz3306:Master > python2.7 mysql_rollback.py -f mysql-bin.000009 -o rollback.sql -h127.0.0.1 -P3306 -uroot -p123456 –start-position=’2426′ –stop-position=’2604′ -d db1
正在获取参数 …..
正在解析 binlog…..
正在初始化列名 …..
正在开始拼凑 sql…..
done!

查看 rollback.sql 中误操作的逆向语句

SZD-L0087668:gzz3306:Master > cat rollback.sql
## at 2482
##180503 14:13:36 server id 1  end_log_pos 2573 CRC32 0xacd94a0b        Update_rows: table id 76 flags: STMT_END_F
UPDATE `db1`.`test`
SET
  id=2
  ,name=’bob’
  ,age=25
  ,country=’britain’
  ,city=’london’
WHERE
  id=2
  AND name=’bob’
  AND age=25
  AND country=’europe’
  AND city=’london’;

step4. 回滚

SZD-L0087668:gzz3306:Master > mysql -uroot -p <rollback.sql
Enter password:
SZD-L0087668:gzz3306:Master > mysql -uroot -p -e ‘select * from db1.test’;
Enter password:
+——+——-+——+———+———-+
| id  | name  | age  | country | city    |
+——+——-+——+———+———-+
|    1 | alex  |  26 | china  | shanghai |
|    2 | bob  |  25 | britain | london  |
|    3 | simon |  24 | france  | paris    |
+——+——-+——+———+———-+

test 表已回滚。

mysql_rollback.py 脚本 可以到 Linux 公社资源站下载:

—————————————— 分割线 ——————————————

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /2018 年资料 / 5 月 / 3 日 / 使用 Python 脚本实现 MySQL 误操作的快速回滚 /

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

—————————————— 分割线 ——————————————

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计4563字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7799036
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛 NAS 硬件 03:五盘位 +N5105+ 双网口的成品 NAS 值得入手吗 前言 大家好,我...
亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示

亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示

亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示 首先来回顾一下 10...
优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器 在多台服务器同时运行的环境中,性能监控、状态告警、资源可视化 是运维人...
星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛 NAS-4:飞牛 NAS 安装 istore 旁路由,家庭网络升级的最佳实践 开始 大家好我是...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...