首页 > 数据库 >MySQL数据误删flashback

MySQL数据误删flashback

时间:2023-09-11 21:11:26浏览次数:40  
标签:binlog -- binlog2sql start testdb MySQL flashback 误删 id

使用binlog2sql(Python版)

解析binlog文件来创建回滚的sql

准备工作

需要提前安装Python环境

git clone https://github.com/danfengcao/binlog2sql.git
cd binlog2sql
pip3 install -r requirements.txt

MySQL必须 开启binlog,且binlog_format=ROW,且binlog_row_image=FULL

show variables like 'log_bin';
show variables like '%binlog_format%';
show variables like '%binlog_row_image%';

具体使用

解析出标准SQL

python3 binlog2sql.py -hip -P3310 -ubinlog2sql -p'pwd1' -d testdb -t t --start-file='mysql-bin.000004' --only-dml

仅解析testdb库的t表,只解析dml,忽略ddl,结果中也会包含格式为statement的日志

INSERT INTO `testdb`.`t`(`id`, `c`, `d`) VALUES (0, 0, 0); #start 4 end 438 time 2022-12-15 13:52:48
INSERT INTO `testdb`.`t`(`id`, `c`, `d`) VALUES (5, 5, 5); #start 4 end 438 time 2022-12-15 13:52:48
INSERT INTO `testdb`.`t`(`id`, `c`, `d`) VALUES (10, 10, 10); #start 4 end 438 time 2022-12-15 13:52:48
DELETE FROM `testdb`.`t` WHERE `id`=0 AND `c`=0 AND `d`=0 LIMIT 1; #start 469 end 737 time 2022-12-15 13:53:03
DELETE FROM `testdb`.`t` WHERE `id`=5 AND `c`=5 AND `d`=5 LIMIT 1; #start 469 end 737 time 2022-12-15 13:53:03

解析出回滚SQL

python3 binlog2sql.py --flashback -hip -P3310 -ubinlog2sql -p'pwd1' -d testdb -t t --start-file='mysql-bin.000001' --only-dml
  • 添加--only-dml参数,结果会过滤格式为statement的日志
  • 不添加--only-dml参数,格式为statement的日志原样输出
INSERT INTO `testdb`.`t`(`id`, `c`, `d`) VALUES (0, 0, 0); #start 4 end 438 time 2022-12-15 13:52:48
INSERT INTO `testdb`.`t`(`id`, `c`, `d`) VALUES (5, 5, 5); #start 4 end 438 time 2022-12-15 13:52:48
INSERT INTO `testdb`.`t`(`id`, `c`, `d`) VALUES (10, 10, 10); #start 4 end 438 time 2022-12-15 13:52:48
DELETE FROM `testdb`.`t` WHERE `id`=0 AND `c`=0 AND `d`=0 LIMIT 1; #start 469 end 737 time 2022-12-15 13:53:03
DELETE FROM `testdb`.`t` WHERE `id`=5 AND `c`=5 AND `d`=5 LIMIT 1; #start 469 end 737 time 2022-12-15 13:53:03
INSERT INTO `testdb`.`t`(`id`, `c`, `d`) VALUES (60, 60, 60); #start 19012 end 19267 time 2022-12-15 14:21:46
DELETE FROM `testdb`.`t` WHERE `id`=60 AND `c`=60 AND `d`=60 LIMIT 1; #start 19298 end 19553 time 2022-12-15 14:22:18

出现的问题

Traceback (most recent call last):
  File "binlog2sql/binlog2sql.py", line 149, in <module>
    back_interval=args.back_interval, only_dml=args.only_dml, sql_type=args.sql_type)
  File "binlog2sql/binlog2sql.py", line 46, in __init__
    self.connection = pymysql.connect(**self.conn_setting)
  File "/usr/local/lib/python3.6/site-packages/pymysql/__init__.py", line 90, in Connect
    return Connection(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 706, in __init__
    self.connect()
  File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 931, in connect
    self._get_server_information()
  File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 1269, in _get_server_information
    self.server_charset = charset_by_id(lang).name
  File "/usr/local/lib/python3.6/site-packages/pymysql/charset.py", line 38, in by_id
    return self._by_id[id]
KeyError: 255

升级PyMySQL

pip3 install --upgrade PyMySQL

Traceback (most recent call last):
  File "binlog2sql/binlog2sql.py", line 7, in <module>
    from pymysqlreplication import BinLogStreamReader
  File "/usr/local/lib/python3.6/site-packages/pymysqlreplication/__init__.py", line 23, in <module>
    from .binlogstream import BinLogStreamReader
  File "/usr/local/lib/python3.6/site-packages/pymysqlreplication/binlogstream.py", line 8, in <module>
    from pymysql.util import int2byte
ModuleNotFoundError: No module named 'pymysql.util'

解决方案

pip3 uninstall pymysql
pip3 install pymysql==0.9.3

binlog中没有记录新的日志

原因:账号权限不对
解决:创建账号,重新授权

CREATE USER 'binlog2sql'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd1';
GRANT SELECT,REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'binlog2sql'@'%';
flush privileges;

参考

binlog2sql github地址

使用binlog2sql(Java版)

<dependency>
  <groupId>com.github.shyiko</groupId>
  <artifactId>mysql-binlog-connector-java</artifactId>
  <version>0.18.0</version>
</dependency>

仅能监听新的binlog,不能解析一个文件的所有event

参考

binlog2sql_java github地址

使用美团MyFlash

该方式不像 binlog2sql 一样转换binlog为易读的sql语句,而是直接截取复制并修改二进制 binlog 文件实现SQL的反转,然后使用mysqlbinlog 命令读取新生成的二进制binlog闪回文件,将闪回操作导入数据库实现数据的恢复。

git clone https://github.com/Meituan-Dianping/MyFlash.git
gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback

获取开始和结束位置

show binlog events in 'mysql-bin.000001';

获取要闪回事务的开始和结束位置

生成闪回binlog文件

这里使用的是docker的mysql,需要将docker内部的binlog文件拷贝出来

docker cp xxx:/var/lib/mysql/mysql-bin.000001 . 

binlogFileNames指定binlog文件的具体路径

rm -rf MyFlash-master/binlog_output_base.flashback
MyFlash-master//binary/flashback --binlogFileNames=mysql-bin.000001 --sqlTypes=delete --start-position=21247 --stop-position=21552

通过开始和结束位置来具体确定一个事务(删除 tb_user 中 uid 为7的行)

执行闪回

将生成的闪回文件拷贝到docker内部

docker cp binlog_output_base.flashback xxx:/

在docker内部执行此命令

mysqlbinlog --skip-gtids  binlog_output_base.flashback | mysql -uroot -p
select * from tb_user;

可以看到结果中uid为7的行已经加回来了

参考

[美团] Myflash 的安装使用
MyFlash——美团点评的开源MySQL闪回工具
MyFlash-github地址

标签:binlog,--,binlog2sql,start,testdb,MySQL,flashback,误删,id
From: https://www.cnblogs.com/strongmore/p/17131251.html

相关文章

  • MYSQL笔记
    一、创建列表1、 创建库CREATEDATABASEwjd_table2、 删库,dropdatabasetable_name;3、 选库usetable_name;4、 类型分别有:1) char或character(负责数据,需设定长度);2) int或inteser(数字为整数或负数);dec(提供数值空间);3) datatime或timestamp(负责记录时间和日期);4) blob(大量文......
  • OGG-Postgres同步到MySQL
    (一)数据库信息名称源端数据库目标端数据库数据库类型Postgresql12.4MySQL5.7IP地址20.2.127.2320.2.127.24端口54323306数据库testpdbtest用户ogguserroot密码ogguserP2021Root@1234 postg......
  • 基于PHP vue2+element+ laravel8+ mysql开发的不良事件管理系统源码
    技术架构:PHP vue2+element+laravel8+mysql5.7+vscode不良事件上报系统通过“事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、以及“事后的原因分析和工作持续优化”,结合预存上百套已正在使用的模板,帮助医院从对护理事件、药品事件、医疗器械事件、......
  • 【笔记】Mysql常用操作
     linux上安装客户端 下载地址:https://dev.mysql.com/downloads/mysql/ 操作系统版本选择redhat,  在下载列表中选择ClientUtitiles  安装rpm-ivhmysql-community-client-5.7.36-1.el7.x86_64.rpm--nodeps--force ......
  • mysql 体系结构
     mysql数据库的体系结构如下图:1.连接器:主要负责客户端与数据库的连接a.连接后没有任何动作,那么连接就处于空闲状态,showfullprocesslist进行查看b.客户端连接数据库后会在一定时间范围内断开连接,具体时间可以进行查看showvariableslike'%timeout%'interactive_timeout:服务器......
  • MySQL篇:第一章_软件安装和基本操作
    本篇安装软件NavicatePremium16破解版和phpstudy_prophpstudy_pro安装教程phpstudy官网:https://www.xp.cn/download.html下载等待下载完成后,双击可执行文件开始安装,选择自定义安装;等待安装完成即可拥有MySQL环境NavicatePremium16破解版安装教程官网地址:https://ww......
  • 【验】Postfix+Dovecot+MySQL搭建邮件服务器
    网上有很多使用Postfix搭建邮件服务器的文章,但目前貌似没有看到较为完整的一篇。本例将尝试在Ubuntu系统中使用Postfix+Dovecot+MySQL搭建邮件服务器。说到邮件服务器,网上有许多不同解决方案。Window操作系统下常见的邮件服务器有hMailServer、MailEnable、EVOMailServer、ApacheJ......
  • es与mysql的概念对比
        ......
  • linux服务器上的nginx服务、mysql服务和docker里面的php服务配合使用
    之前有个老项目是nginx1.22.0+mysql5.7+php5.6的环境在跑,也就是常说的lnmp环境。但是最近出了一个新的需求,这台服务器上要跑一个php7.3的项目,mysql5.7还可以用,nginx1.22.0也可以用,主要是php的环境要升级到7.3,那么方案应该怎么实施呢,大概有下面几个思路:1、再独立安装一个php7.3的......
  • JDBC 连接 MySQL 报错 Unknown system variable ‘query_cache_size‘
    官方说法:ThequerycacheisdeprecatedasofMySQL5.7.20,andisremovedinMySQL8.0.Deprecationincludesquery_cache_size.querycache在MySQL5.7.20已经过时了,并且在MySQL8.0版本中被移除了。所以要更新mysql驱动版本<dependency><groupId>mysql</groupId......