返回顶部
首页 > 资讯 > 数据库 >使用python脚本实现mysql误操作的flushback
  • 603
分享到

使用python脚本实现mysql误操作的flushback

2024-04-02 19:04:59 603人浏览 薄情痞子
摘要

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

1.简介
oracle数据库中,当一个误操作被提交后,我们可以通过oracle提供的闪回功能将表闪回至误操作之前的状态。Mysql中没有原生的flushback功能,DBA误操作时,传统的恢复方式是利用全备+二进制日志前滚进行恢复。
今天给大家介绍一种使用python脚本在mysql中实现类似oracle中flushback table的闪回功能,相比于传统的全备+增备,本方法更为快速、简单。

2.闪回原理
原理:调用mysql_rollback.py(脚本在我的另一篇blog 闪回脚本: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 
###   @2='bob' 
###   @3=25 
###   @4='britain' 
###   @5='london' 
### SET
###   @1=2 
###   @2='bob' 
###   @3=25 
###   @4='europe' 
###   @5='london' 
# 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 -h227.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表已回滚。

您可能感兴趣的文档:

--结束END--

本文标题: 使用python脚本实现mysql误操作的flushback

本文链接: https://lsjlt.com/news/39079.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用python脚本实现mysql误操作的flushback
    1.简介在oracle数据库中,当一个误操作被提交后,我们可以通过oracle提供的闪回功能将表闪回至误操作之前的状态。mysql中没有原生的flushback功能,DBA误操作时,传统的恢复方式是利用全备...
    99+
    2024-04-02
  • 使用python脚本实现mysql误操作
    1.简介在oracle数据库中,当一个误操作被提交后,我们可以通过oracle提供的闪回功能将表闪回至误操作之前的状态。mysql中没有原生的flushback功能,DBA误操作时,传统的恢复方式是利用全备+二进制日志前滚进行恢复。今天给大...
    99+
    2023-01-31
    脚本 操作 python
  • 如何使用Python脚本在Linux中实现远程操作
    如何使用Python脚本在Linux中实现远程操作,需要具体代码示例在Linux系统中,使用Python脚本可以方便地实现远程操作,能够远程执行命令、传输文件等功能。本文将介绍如何使用Python脚本在Linux中实现远程操作,并给出具体的...
    99+
    2023-10-22
    Python Linux 远程操作
  • Linux脚本操作的Python实现优化策略
    Linux脚本操作的Python实现优化策略摘要:随着Linux操作系统的广泛使用,使用脚本进行自动化操作已经成为了一种常见的方式。在这篇文章中,我们将讨论如何用Python来优化Linux脚本操作,从而提高效率和可维护性。具体而言,我们将...
    99+
    2023-10-22
    Linux Python实现 脚本操作
  • python使用pymysql实现操作mysql
    pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。但目前pymysql支持python3.x而后者不支持3.x版本。 适用环境 python版本 >=2.6或3....
    99+
    2022-06-04
    操作 python pymysql
  • 在Linux系统中使用Python脚本操作MySQL数据库的方法
    在Linux系统中使用Python脚本操作MySQL数据库的方法随着数据处理和存储的需求不断增加,MySQL数据库成为了开发者们常用的选择之一。在Linux系统中,使用Python脚本与MySQL数据库进行交互十分便捷,本文将介绍如何在Li...
    99+
    2023-10-22
    Python Linux MySQL
  • Linux脚本操作的数据处理技巧与Python实现
    Linux脚本操作的数据处理技巧与Python实现引言:在日常工作中,数据处理是一个重要的环节。而在Linux系统中,使用脚本进行数据处理是非常高效的方法。本文将介绍一些在Linux脚本操作中常用的数据处理技巧,并结合Python语言,给出...
    99+
    2023-10-22
    Python Linux 脚本 数据处理
  • Python 使用dict实现switch的操作
    Python3还是没有switch,可以利用if-else来实现,但是非常不方便。使用dict来实现会比较简洁优雅。 # -*- coding: utf-8 -*- """ Py...
    99+
    2024-04-02
  • 用Shell脚本检查IP格式及mysql操作实例
    本篇内容主要讲解“用Shell脚本检查IP格式及mysql操作实例”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“用Shell脚本检查IP格式及mysql操作实例”吧!还是cronjob的一部分,...
    99+
    2023-06-09
  • 简单易用的Python Linux脚本操作指南
    简单易用的Python Linux脚本操作指南在Linux环境下,Python脚本是一种异常强大且易于使用的工具。Python的简洁语法和丰富的库使得编写脚本变得快捷和高效。本文将为您介绍一些简单易用的Python Linux脚本操作,并提...
    99+
    2023-10-22
    Python Linux 脚本操作
  • 有效使用Python和Linux平台进行脚本操作
    有效使用Python和Linux平台进行脚本操作在现代技术和信息时代,Python和Linux成为了非常强大的工具和平台,用于开发和运行各种脚本操作。Python是一种高级编程语言,拥有简洁而又强大的语法,可以轻松地进行数据处理、网络编程、...
    99+
    2023-10-22
    Python脚本 脚本操作 Linux平台
  • python操作mysql实现安装MySQL-python
    下文我给大家简单讲讲关于python操作mysql实现安装MySQL-python,大家之前了解过相关类似主题内容吗?感兴趣的话就一起来看看这篇文章吧,相信看完python操作mysql实现安装MySQL-...
    99+
    2024-04-02
  • Linux平台下的Python脚本操作实现系统资源管理
    Linux平台下的Python脚本操作实现系统资源管理在Linux平台下,我们可以使用Python脚本来实现对系统资源的管理和监控。Python是一种简洁而高效的编程语言,其强大的库支持使得编写系统管理脚本变得非常容易。系统资源管理是指对C...
    99+
    2023-10-22
    系统资源管理 Python脚本 Linux平台
  • binlog2sql如何实现MySQL误操作的恢复
    小编给大家分享一下binlog2sql如何实现MySQL误操作的恢复,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!对于MySQL...
    99+
    2024-04-02
  • 利用Python脚本操作在Linux中实现文件备份与同步
    标题:使用Python脚本在Linux中实现文件备份与同步引言:在日常工作和生活中,文件备份和同步是非常重要的任务。特别是在Linux系统中,我们可以利用Python脚本来自动化这一过程,提高工作效率。本文将介绍如何使用Python脚本实现...
    99+
    2023-10-22
    Python Linux 脚本 同步 文件备份
  • PHP Linux脚本操作实例:实现网络爬虫
    网络爬虫是一种程序,它自动浏览互联网上的网页,收集并提取所需的信息。对于网站数据分析、搜索引擎优化或市场竞争分析等应用来说,网络爬虫是非常有用的工具。在本文中,我们将使用PHP和Linux脚本来编写一个简单的网络爬虫,并提供具体的代码示例。...
    99+
    2023-10-21
    PHP 爬虫 Linux
  • PHP Linux脚本操作实践:实现定时任务
    在开发和管理Web应用程序时,我们经常需要执行一些定时任务来自动化一些重复、耗时的任务,如备份数据、生成报表等。在Linux系统中,我们可以利用crontab来管理定时任务。本文将介绍如何使用PHP脚本来操作Linux系统的定时任务,并提供...
    99+
    2023-10-21
    定时任务 PHP: 脚本
  • Redis进阶应用:Redis+Lua脚本实现复合操作
    一、引言Redis是高性能的key-value数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充。得益于超高性能和丰富的数据结构,Redis已...
    99+
    2024-04-02
  • 用shell脚本连接、读写、操作mysql数据库实例
    本篇内容介绍了“用shell脚本连接、读写、操作mysql数据库实例”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 连接mysql 数据...
    99+
    2023-06-09
  • 使用shell脚本自动备份MySQL数据库的具体操作
    不知道大家之前对类似使用shell脚本自动备份MySQL数据库的具体操作的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完使用shell脚本自动备份MySQL数据库的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作