mysqldump binlog增量恢复会导致数据重复

news2025/1/21 17:59:41

1. mysqldump时间很长,导出第一个表和导出最后一个表的时间可能过去几个小时,如果期间不锁库,使用binlog增量恢复的时候,如果从备份开始的binlog开始恢复,备份期间别的表的改动通过应用binlog日志会再次被应用一次。导出数据变多了。 如果从备份结束时binlog位置开始恢复,备份期间的数据又多了。

解决办法

--lock-all-tables,-x
在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 --single-transaction 和 --lock-tables 选项。

--lock-tables
它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。

 --single-transaction
该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用 --quick 选项。

--quick,-q
该选项在导出大表时很有用,它强制 MySQLdump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。

2.执行没有幂等性,是不是开启了GTID就可以了? 但是开启GTID会报错,执行不下去,恢复时还是需要禁用。

mysqlbinlog   /var/lib/mysql/docker-bin.000001 --start-position=499 --stop-position=3716  | mysql -uroot -p123456 test

mysqlbinlog   /var/lib/mysql/docker-bin.000001 --start-position=499 --stop-position=3716  | mysql -uroot -p123456 test

开启Binlog

查看是否打开了Binlog 【ON表示已经打开 OFF表示关闭 默认关闭状态】

show variables like ‘%log_bin%’;

开启Binlog 【修改完以后重启服务】

方法1:
找到mysql配置中的my.ini文件,在[mysqld]下面添加如下参数
log_bin=mysql-bin
binlog-format=ROW

Mysql binlog日志有三种格式 【binlog-format参数】

1.Statement:每一条会修改数据的sql都会记录在binlog中
2.Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改
3.Mixedlevel:是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。

方法2:
SET SQL_LOG_BIN=1 命令开启
SET SQL_LOG_BIN=0 命令关闭

开启以后,重启服务会发现data目录下多了日志文件

使用Binlog恢复数据

show master status; 【查看当前正在写入的binlog文件】

测试表, 测试update 【全部改为赵六,再改为老王,恢复为全部为赵六】


update user set name = ‘赵六’;
update user set name = ‘老王’;

show binlog EVENTS in ‘binlog.000178’ ; 【查询所需要恢复的事件起止的位置】

如果是恢复最后一次修改前数据,则使用记录的倒数第二条日志的结束起止坐标

cmd 切换到MySQL存放mysqlbinlog.exe应用程序的bin目录后,执行以下命令,指定数据恢复起始位置,转换为SQL文件

这里的起止坐标为2536 - 2848
mysqlbinlog --no-defaults “D:\DataBase\MYSQL\mysql-8.0.24-winx64\data\binlog.000178” -d test --skip-gtids --start-position=2536 --stop-position=2848>test.sql
 

cmd登录MySQL,切换到对应数据库,执行命令指定SQL文件位置恢复数据

mysql -uroot -p123456


use test;
source D:\DataBase\MYSQL\mysql-8.0.24-winx64\bin\test.sql

再次查询表数据

附录

cmd 切换到MySQL存放mysqlbinlog.exe应用程序的bin目录后,执行以下命令,可以将Binlog文件转换为txt文件,方便阅读理解

cmd 切换到MySQL存放mysqlbinlog.exe应用程序的bin目录后,执行以下命令,可以一次性完成数据恢复

mysqlbinlog.exe --no-defaults --start-position=2536 --stop-position=2848 --database=test “D:\DataBase\MYSQL\mysql-8.0.24-winx64\data\binlog.000178” | mysql -u root -p

mysqlbinlog: [ERROR] unknown variable ‘default-character-set=utf8’.

如果遇到这个错误原因是mysqlbinlog这个工具无法识别binlog中的配置中的default-character-set=utf8这个指令
两个方法可以解决这个问题:
一:在MySQL的配置/etc/my.cnf中将default-character-set=utf8 修改为 character-set-server = utf8,需要重启MySQL服务
二:用mysqlbinlog --no-defaults mysql-bin.000004 命令打开

近期项目开发中出现了一次误删的操作,于是在网上查找了mysql的回滚操作,这里记录一下。

简单说下binlog,binlog是mysql中的二进制日志,其记录了数据库发生更改的各种变化。所以通过binlog可以回滚或者恢复失误的操作。

恢复一般使用mysqlbinlog命令,该命令是mysql自带的,使用简单。其运行的本质是将日志记录中的事件再次执行一遍。回滚一般要借助第三方工具binlog2sql,其回滚的本质是解析日志文件生成要回滚的sql,我们拷贝执行该sql即可。

2、创建一个test数据库,准备一张空表t1,包含两个字段id、name,如下:

 3、通过如下命令查看是否开启binlog记录功能(如果没开则上网搜一下开启教程,这里不过多介绍):

show variables like 'log_bin';


4、为了便于观察测试,使用如下一系列命令产生一个新的binlog日志文件,使得我们后续的操作都记录在新的binlog中。

flush logs //产生一个新的日志文件
 
show variables like 'log_bin_basename' //查看日志存储地址
 
show master status; //查看最新日志文件名称
5、插入三条数据,如下:

 6、查看此时的binlog日志记录

show binlog events in 'binlog.000068';


 这里可以看到我们的三次插入事件

7、删除一条数据,此时的表数据和binlog如下:

 可以看到多了一个delete事件,这里注意下binlog中每个事件都有一个begin和commit,我们后面进行恢复或回滚的时候开始和结束的pos都是取的事件整体的开始点和结束点。比如上面删除事件的开始点其实是1105,结束点则是1316。

8、mysqlbinlog恢复数据

注意这里是恢复数据,不是回滚数据,恢复的本质是将原有的插入语句再执行一遍,而回滚则是回退到删除之前的状态。
mysqlbinlog是mysql自带的命令,一般是在mysql安装目录下的bin目录里。因为我们是恢复数据,所以要找到已经删除语句的对应写入事件,将该事件再重新执行一遍即可。
先通过show binlog events in 'binlog.000068'确认下插入语句的事件位置

可以看到开始位置为815,结束位置为1026,接着用mysqlbinlog命令恢复:

mysqlbinlog --no-defaults   ..\data\binlog.000068 --start-position=815 --stop-position=1026  | mysql -uroot -p123456 test


 下面来看一下表数据和binlog信息:

可以看到表中数据已经恢复,binlog中也多了一次写入事件。

小结:
mysqlbinlog命令只是用于恢复,不能用于回滚。如果数据进行update操作,则很难通过该命令恢复。所以该命令比较适用一些数据迁移,数据同步的场景。

mysqlbinlog 运行过程中如果出现unknown variable 'default-character-set=utf8mb4'异常,可以再该命令后加--no-defaults参数解决:mysqlbinlog --no-defaults

mysqlbinlog命令的详细用法这里没有介绍,需要的可以上官网或者百度搜索。

9、binlog2sql数据回滚

binlog2sql是一个第三方的工具,其安装过程中调试了很久,为了不让该文章的逻辑变的杂乱,这里我新开了一篇文章讲解(binlog2sql 工具安装使用及问题汇总_Interest1_wyt的博客-CSDN博客),不了解该工具的可以参考下。

binlog2sql回滚的原理是生成要回滚事件对应的sql语句,我们最后只需要拷贝该语句实现即可。这里为了便于观察,我们先清空t1表,然后再重新开启一个binlog记录,开启和查看新binlog命令前面介绍过,这里仅截图展示下:

 向t1表再次插入三条数据:

 修改最后一条数据的name字段,此时表和binlog的记录情况如下:

 通过binlog2sql生成回滚sql:

E:\Program Files\PYTHON3.9.5\lib\site-packages\pymysql\cursors.py:170: Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 1")
  result = self._query(query)
UPDATE `test`.`t1` SET `id`=3, `name`='回滚3' WHERE `id`=3 AND `name`='更新' LIMIT 1; #start 1105 end 1312 time 2022-04-16 11:20:00
将回滚语句拷贝出来执行后再观察t1表和binlog日志:

 可以看到日志中多了一条更新事件,表中数据也被还原。
 

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

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

相关文章

如何做好舆情管控,TOOM舆情监控服务工作经验总结

网络舆情监测剖析是实时控制网络舆情动态的一项基本工作,也是妥当处置网络有害信息,制定有效宣扬策略,准确引诱舆论导向的主要前提与根据 。接下来简单了解如何做好舆情管控,TOOM舆情监控服务工作经验总结。 一、如何做好舆情管控…

priority_queue 优先级队列(堆) 的模拟实现

目录 一、优先级队列的模板参数列表 二、优先级队列的构造函数(建堆 nlogn) AdjustDown() 向下调整: 建堆的时间复杂度: 三、pop()接口 (堆顶元素的删除: logn) 四、push()接口 &#xff…

算法第九期——DFS(深度优先搜索)对树的应用

树 树是一种特殊的图 。 特点: 若树有n个点,则有n-1条边。树有连通性但没有回路。从一个点出发可以到达任意一个,而且路径是唯一的。树的重心u(最平衡的点): 以树上任意一个结点为根计算它的子树的结点数,如果结点…

1578_AURIX_TC275_MTU中的ECC检测、错误追踪以及运行模式

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) EOV其实是体现了一个错误递增的概念,而且这个是积累到了一定的度。至于具体的规则,其实后面还有更加详细的信息。关于ECC错误纠正使能,相应的处理可能跟…

产品更新!数维图编辑器超10项功能升级

新的一年我们加紧了更新迭代的速度,覆盖数维图三大可视化编辑器产品,超10项功能升级优化。我们将继续保持每天更新的产品升级节奏,满足不同行业用户的更多需求,为用户带来极致的产品使用体验。以下是主要的亮点功能更新汇总&#…

用R语言理解连续性和导数

文章目录微分1 连续性2 求导微分 1 连续性 众所周知微分的几何意义是斜率,然而斜率最初的定义只涉及直线,指的是ykxbykxbykxb中的kkk,而对任意曲线yf(x)yf(x)yf(x)而言,若想谈其斜率,就必须先做出其切线,…

#A. 毛毛虫树

Description给你一棵树希望你找出一条链来,这条链上的点,及这些点直接相连的点,加起来点数尽可能的多FormatInput第一行两个整数N,M,分别表示树中结点个数和树的边数。接下来M行,每行两个整数a, b表示点a和…

lombok快速入门

lombok快速入门 1.安装idea lombok插件 2.加入 maven 依赖 lombok常用注解 1. Getter/Setter 自动产生 getter/setter 2. ToString 自动重写 toString() 方法,会打印出所有变量 3. EqualsAndHashCode 自动生成 equals(Object other) 和 hashcode() 方法&#x…

MATLAB实验四

1.求方程2x5−3x371x2−9x1302x^5-3x^371x^2-9x1302x5−3x371x2−9x130 的全部根 >> p[2 0 -3 71 -9 13]; >> pkg load symbolic >> poly2sym(p) Symbolic pkg v3.0.0: Python communication link active, SymPy v1.10.1. ans (sym)5 3 22*x -…

FPGA图像处理HLS实现sobel边沿检测,提供HLS工程和vivado工程源码

目录一、sobel边沿检测原理二、HLS方案实现sobel边沿检测三、HLS在线仿真并导出IP四、Kintex7开发板vivado工程验证五、zynq7100开发板vivado工程验证六、板级调试验证七、福利:工程源码获取一、sobel边沿检测原理 所谓边缘是指其周围像素灰度急剧变化的那些象素的…

CS架构 企业ERP系统源码 Winform财务设备生产采购进销存源码

淘源码:国内知名的源码免费下载平台 推荐环境:vs2019 sql server 2008 r2以上 源码简介 本系统属于中小型企业ERP管理系统,可以对中小型生产企业或商业企业进行有效管理。 系统包含进销存、财务、生产、委外、财务、设备管理、权限管理等模…

【可解释性机器学习】基于ELI5使用解读LIME算法以及实战案例

LIME算法解读与实战案例LIME论文简介LIME算法原理LIME算法要点LIME的注意事项LIME的代码实现对Pytorch搭建的模型进行解释使用LIME解释Pytorch构建的模型参考资料LIME论文简介 LIME的全称为Local Interpretable Model-agnostic Explanations. 尽管被广泛采用,机器…

模板进阶篇

一、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。如图: 非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可…

Mybatis 原理之启动阶段

文章目录1.MyBatis 核心流程2.启动准备阶段流程3.创建 SQlSessionFactory4.创建XMLConfigBuilder5.创建 XPathParser6.解析并设置 configuration 中的属性7.解析Mappers标签1.MyBatis 核心流程 Mybatis的核心流程氛围两个阶段,启动准备阶段和执行SQL阶段。 加载配…

Day858.高性能网络应用框架Netty -Java 并发编程实战

高性能网络应用框架Netty Hi,我是阿昌,今天学习记录的是关于高性能网络应用框架Netty的内容。 Netty 是一个高性能网络应用框架,应用非常普遍,目前在 Java 领域里,Netty 基本上成为网络程序的标配了。 Netty 框架功…

win10录屏软件哪款比较好用?一款不限时长的录屏软件

现在大部分人的电脑都是win10系统的电脑,也有许多小伙伴会经常会问:“win10电脑怎么录屏?”录制电脑屏幕,需要使用到录屏软件,那win10录屏软件哪款比较好用?小编今天给大家分享一款试用版即可不限录制时长的…

【区间合并】洛谷 P1496 火烧赤壁

P1496 火烧赤壁 文章目录题目背景题目描述输入格式:输出格式:数据范围输入样例输出样例方法:区间合并解题思路代码复杂度分析:题目背景 曹操平定北方以后,公元 208 年,率领大军南下,进攻刘表。…

部分时变离散系统中的稳定性判据

部分时变离散系统中的稳定性判据 1.Lyapunov稳定性理论 下面先给出Lyapunov稳定性的一些基本理论(网上资源较多这里不再过多赘述): 2.一类时变离散系统的稳定性 定理 ​ 对于离散时变系统x(k1)A(k)x(k)x(k1)A(k)x(k)x(k1)A(k)x(k)&#x…

Java EE|多线程代码实例之单例模式与阻塞队列

文章目录前言设计模式介绍🔴单例模式什么是单例模式单例模式实现方式饿汉模式懒汉模式基于上述单例模式实现线程安全问题讨论重点回顾🔴阻塞队列阻塞队列是什么标准库中的阻塞队列典型应用场景:生产者消费者模型利用系统提供的BlockingQueue实…

osg fbo(三),将颜色缓冲区图片通过shader变绿

这个其实很简单, 一,写顶点着色器和片元着色器 static const char * vertexShader { “void main(void)\n” “{\n” " gl_Position ftransform();\n" “}\n” }; static const char *psShader { “uniform float alpha;” “void main(vo…