MySQL误操作数据后闪回恢复——Binlog2sql使用详解

Binlog2sql的用途

  1. 数据快速回滚(闪回)
  2. 主从切换后新master丢数据的修复
  3. 从binlog生成标准SQL,带来的衍生功能

Binlog2sql的安装步骤

首先,确保系统安装了git和pip。

安装binlog2sql。可以通过以下命令进行:

shell> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
shell> pip install -r requirements.txt

使用要求

MySQL服务器必须设置以下参数:

[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

用户需要的最小权限:

select, super/replication client, replication slave#建议授权
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 
权限说明
  • select:读取server端information_schema.COLUMNS表,获取表结构的元信息。
  • super/replication client:执行'SHOW MASTER STATUS', 获取server端的binlog列表。
  • replication slave:通过BINLOG_DUMP协议获取binlog内容的权限。

基本用法

解析出标准SQL

shell> python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -padmin -dtest -t test3 test4 --start-file='mysql-bin.000002'

解析出回滚SQL

shell> python binlog2sql.py --flashback -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttest3 --start-file='mysql-bin.000002' --start-position=763 --stop-position=1147

Binlog2sql选项

1、mysql连接配置

-h host; -P port; -u user; -p password

2、解析模式

--stop-never 持续解析binlog。可选。默认False,同步至执行命令时最新的binlog位置。

-K, --no-primary-key 对INSERT语句去除主键。可选。默认False

-B, --flashback 生成回滚SQL,可解析大文件,不受内存限制。可选。默认False。与stop-never或no-primary-key不能同时添加。

--back-interval -B模式下,每打印一千行回滚SQL,加一句SLEEP多少秒,如不想加SLEEP,请设为0。可选。默认1.0。

3、解析范围控制

--start-file 起始解析文件,只需文件名,无需全路径 。必须。

--start-position/--start-pos 起始解析位置。可选。默认为start-file的起始位置。

--stop-file/--end-file 终止解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。

--stop-position/--end-pos 终止解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效。

--start-datetime 起始解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。

--stop-datetime 终止解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。

4、对象过滤

-d, --databases 只解析目标db的sql,多个库用空格隔开,如-d db1 db2。可选。默认为空。

-t, --tables 只解析目标table的sql,多张表用空格隔开,如-t tbl1 tbl2。可选。默认为空。

--only-dml 只解析dml,忽略ddl。可选。默认False。

--sql-type 只解析指定类型,支持INSERT, UPDATE, DELETE。多个类型用空格隔开,如--sql-type INSERT DELETE。可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。

应用案例

误删整张表数据,需要紧急回滚

例如,误删了test库的tbl表中的所有数据,需要紧急回滚。

1. 登录mysql,查看目前的binlog文件

    mysql> show master status;+------------------+-----------+| Log_name         | File_size |+------------------+-----------+| mysql-bin.000051 |       967 || mysql-bin.000052 |       965 |+------------------+-----------+

2. 最新的binlog文件是mysql-bin.000052,我们再定位误操作SQL的binlog位置。误操作人只能知道大致的误操作时间,我们根据大致时间过滤数据。

 shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-datetime='2016-12-13 20:25:00' --stop-datetime='2016-12-13 20:30:00'输出:INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:26:00', 4, '小李'); #start 317 end 487 time 2016-12-13 20:26:26UPDATE `test`.`tbl` SET `addtime`='2016-12-12 00:00:00', `id`=4, `name`='小李' WHERE `addtime`='2016-12-13 20:26:00' AND `id`=4 AND `name`='小李' LIMIT 1; #start 514 end 701 time 2016-12-13 20:27:07DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:33' AND `id`=1 AND `name`='小赵' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:48' AND `id`=2 AND `name`='小钱' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-13 20:25:00' AND `id`=3 AND `name`='小孙' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-12 00:00:00' AND `id`=4 AND `name`='小李' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05

3. 我们得到了误操作sql的准确位置在728-938之间,再根据位置进一步过滤,使用flashback模式生成回滚sql,检查回滚sql是否正确(注:真实环境下,此步经常会进一步筛选出需要的sql。结合grep、编辑器等)

shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-position=3346 --stop-position=3556 -B > rollback.sql | cat输出:INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-12 00:00:00', 4, '小李'); #start 728 end 938 time 2016-12-13 20:28:05INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:25:00', 3, '小孙'); #start 728 end 938 time 2016-12-13 20:28:05INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:48', 2, '小钱'); #start 728 end 938 time 2016-12-13 20:28:05INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:33', 1, '小赵'); #start 728 end 938 time 2016-12-13 20:28:05

4. 确认回滚sql正确,执行回滚语句。

 shell> mysql -h127.0.0.1 -P3306 -uadmin -p'admin' < rollback.sql

 5、登录mysql确认,数据回滚成功。

   mysql> select * from tbl;+----+--------+---------------------+| id | name   | addtime             |+----+--------+---------------------+|  1 | 小赵   | 2016-12-10 00:04:33 ||  2 | 小钱   | 2016-12-10 00:04:48 ||  3 | 小孙   | 2016-12-13 20:25:00 ||  4 | 小李   | 2016-12-12 00:00:00 |+----+--------+---------------------+

限制(对比mysqlbinlog)

  • MySQL服务器必须开启,离线模式下不能解析。
  • 参数binlog_row_image必须为FULL
  • 解析速度不如mysqlbinlog。

优点(对比mysqlbinlog)

  • 纯Python开发,安装与使用都很简单。
  • 自带flashback、no-primary-key解析模式。
  • 适合闪回实战。
  • 解析为标准SQL,方便理解、筛选。
  • 代码容易改造,可以支持更多个性化解析。

通过binlog2sql,MySQL数据库管理者可以有效地应对数据误操作的情况,快速恢复数据,减少潜在的损失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(十二)springboot实战——SSE服务推送事件案例实现

前言 SSE&#xff08;Server-Sent Events&#xff0c;服务器推送事件&#xff09;是一种基于HTTP协议的服务器推送技术。它允许服务器向客户端发送异步的、无限长的数据流&#xff0c;而无需客户端不断地轮询或发起请求。这种技术可以用来实现实时通信、在线聊天、即时更新等功…

格力软件设计岗位2024春招一面记录

本文介绍2024届秋招中&#xff0c;格力的软件开发岗位一面的面试基本情况、提问问题等。 2024年01月投递了格力的电控软件设计岗位&#xff0c;但是后来简历似乎因为被调剂&#xff0c;被送到了另一个部门&#xff1b;具体部门叫什么我也没听清楚&#xff0c;但岗位就也还是软件…

C++并发编程 -2.线程间共享数据

本章就以在C中进行安全的数据共享为主题。避免上述及其他潜在问题的发生的同时&#xff0c;将共享数据的优势发挥到最大。 一. 锁分类和使用 按照用途分为互斥、递归、读写、自旋、条件变量。本章节着重介绍前四种&#xff0c;条件变量后续章节单独介绍。 由于锁无法进行拷贝…

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义

链表 空链表&#xff1a; 注意&#xff1a;函数不能返回局部变量的地址 操作&#xff1a; 1.创建空链表 2.头插 3.尾插 4.链表遍历 5.链表的长度 free&#xff1a;释放 删除&#xff1a; 头删 void popFront(struct Node *head) { //1.p指针变量指向首节点 //2.断…

ubuntu22.04 安装部署01:禁用内核更新

一、前言 ubunut22.04系统安装以后&#xff0c;内核更新会导致各种各样的问题&#xff0c;因此锁定初始安装环境特别重要&#xff0c;下面介绍如何锁定内核更新。 二、操作方法 2.1 查看可用内核 dpkg --list | grep linux-image dpkg --list | grep linux-headers dpkg --…

NLP_NLP技术的演进史

文章目录 起源: NLP 的起源可以追溯到阿兰图灵在20 世纪50年代提出的图灵测试。图灵测试的基本思想是&#xff0c;如果一个计算机程序能在自然语言对话中表现得像一个人&#xff0c;那么我们可以说它具有智能。从这里我们可以看出&#xff0c;AI最早的愿景与自然语言处理息息相…

Multisim14.0仿真(四十二)基于74LS183的8位表决器设计

一、74LS183简介&#xff1a; 74LS183是一种4位高速全加器&#xff0c;用于数字电路中的加法运算。74LS183输入端包括两个4位二进制数和一个进位信号&#xff0c;输出端包括1个4位二进制数和一个进位信号。 74LS138具有快速响应、低功耗灯特点&#xff0c;能实现高校的数字匀速…

MySQL的备份与恢复

目录 一、MySQL日志管理 1.1 MySQL日志类型 1.2 错误日志 1.3 通用查询日志 1.4 慢查询日志 1.5 二进制日志 日志滚动&#xff1a; 二、MySQL备份 2.1 备份类型 2.2 MySQL自带的备份工具 基于DBMS> mysqldump 一、MySQL日志管理 在数据库保存数据时&#xff0c;有…

计算huggingface模型占用硬盘空间的实战代码

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

贪心 向上取整 1898 B. Milena and Admirer

感觉要用差分来做&#xff0c;但是不知道咋做 #include<bits/stdc.h>using namespace std;const int N2e510;int a[N];int get(int x,int y) {if(x%y0) return x/y;return x/y1; }void solve() {int n;cin>>n;for(int i0;i<n;i) cin>>a[i];long long ans…

ChatGPT的探索与实践-应用篇

这篇文章主要介绍在实际的开发过程当中&#xff0c;如何使用GPT帮助开发&#xff0c;优化流程&#xff0c;文末会介绍如何与618大促实际的业务相结合&#xff0c;来提升应用价值。全是干货&#xff0c;且本文所有代码和脚本都是利用GPT生成的&#xff0c;请放心食用。 场景一&…

哨兵1号回波数据(L0级)提取与SAR成像(全网首发)

本专栏目录:全球SAR卫星大盘点与回波数据处理专栏目录 本文先展示提取出的回波结果,然后使用RD算法进行成像,展示成像结果,最后附上哨兵1号回波提取的MATLAB代码。 1. 回波提取 回波提取得到二维复矩阵数据,对其求模值后绘图如下(横轴为距离向采样点,纵轴为方位向采样…

【Go语言成长之路】Hello Go

文章目录 Hello Go一、建立工程目录二、开启代码追踪三、编写代码四、测试代码 Hello Go 一、建立工程目录 pzspzs-ubuntu22:~$ mkdir go_study/hello -p pzspzs-ubuntu22:~$ cd go_study/hello​ 在hello目录下&#xff0c;我们会编写属于自己的第一个Go demo例子&#xff0…

Linux实验记录:使用vsftpd服务传输文件

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 为了解决在多样复杂的设备之间解决传…

openmax

通过EmptyThisBuffer传递未解码的buffer给component&#xff0c;component收到该命令后会去读取input port buffer中的数据&#xff0c;将其组装为帧之后进行解码&#xff0c;buffer处理完成后会通过EmptyBufferDone通知上层输入使用完成&#xff0c;上层收到命令可以继续送输入…

图解Vue组件通讯【一图胜千言】

Vue的每个组件都有独自的作用域&#xff0c;组件间的数据是无法共享的&#xff0c;但实际开发工作中我们常常需要让组件之间共享数据&#xff0c;今天我们来学习下面三种组件通信方式&#xff1a; 父子组件之间的通信 兄弟组件之间的通信 祖先与后代组件之间的通信 1. 父子组件…

Qt|制作简单的不规则窗体

通常我们用到的对话框基本上都是规则的&#xff0c;在有些特殊情况下&#xff0c;也会使用到不规则窗口&#xff0c;那么该如何实现不规则窗体呢&#xff1f; 在MFC框架下很难实现&#xff0c;应该说是难的都想放弃&#xff0c;但是&#xff0c;Qt框架下提供了一个叫做setMask…

产品经理学习-产品运营《海报制作》

如何策划一款优秀的海报 海报是什么&#xff1f; 是一种将文字和图片结合的信息传递形式&#xff1b;其作用和目的是把想传递给用户的信息高效的传递出去&#xff0c;让用户在极短的时间内产生兴趣&#xff0c;进而产生收藏、分享等行为。 海报的类型&#xff1a; 类型 特点 …

算法:阿里巴巴找黄金宝箱(II)

一、算法描述 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0-N的箱子&#xff0c; 每个箱子上面贴有箱子中藏有金币Q的数量。 从金币数量中选出一个数字集合&#xff0c; 并销毁贴有这些数字的每个箱子&…

BL808 Linux支持WIFI

BL808芯片介绍 BL808是高度集成的AIoT芯片组&#xff0c;具有Wi-Fi/BT/BLE/Zigbee等无线互联单元&#xff0c;包含多个 CPU 以及音频编码译码器、视频编码译码器和 AI 硬件加速器&#xff0c;适用于各种高性能和低功耗应用领域。 外围接口包括 USB2.0、 Ethernet、 SD/MMC、 …