mysqldump备份时保持数据一致性分析--master-data=2 --single-transaction
对MySQL数据进行备份,常见的方式如以下三种,可能有很多人对备份时数据一致性并不清楚
1、直接拷贝整个数据目录下的所有文件到新的机器。优点是简单、快速,只需要拷贝;缺点也很明显,在整个备份过程中新机器处于完全不可用的状态,且目的无法释放源数据文件中因为碎片导致的空间浪费和无法回收已发生扩展的innodb表空间。
2、用xtrabackup进行热备。优点是备份过程中可继续提供服务;缺点和第一种方法差不多,目的分区无法释放源数据文件中因为碎片导致的空间浪费和无法回收已发生扩展的innodb表空间。
3、使用官方自带的MySQLdump逻辑重做。优点是在整个备份过程中可以向外提供服务,最重要的一点是可以解决碎片浪费。
以上几种方法相信大家也都很熟悉,就不再详细介绍。下面主要讲解一下MySQLdump备份时如何保持数据的一致性。
MySQLdump对不同类型的存储引擎,内部实现也不一样。主要是针对两种类型的存储引擎:支持事务的存储引擎(如InnoDB)和不支持事务的存储引擎(如MyISAM),下面分别看看这两种存储引擎的实现:
1、对于支持事务的引擎如InnoDB,参数上是在备份的时候加上--single-transaction保证数据一致性
--single-transaction实际上通过做了下面两个操作:
①、在开始的时候把该session的事务隔离级别设置成repeatable read;
②、然后启动一个事务(执行begin),备份结束的时候结束该事务(执行commit),就相当于做一个当前时间点的数据的快照,针对当前时间点的数据再进行mysqldump备份,不对数据库本身进行锁表,这样就不会影响数据库的其他业务。
有了这两个操作,在备份过程中,该session读到的数据都是启动备份时的数据(同一个点)。可以理解为对于innodb引擎来说加了该参数,备份开始时就已经把要备份的数据定下来了,备份过程中的提交的事务时是看不到的,也不会备份进去。
2、对于不支持事务的引擎如MyISAM,只能通过锁表来保证数据一致性,这里分三种情况:
①、导出全库:加--lock-all-tables参数,这会在备份开始的时候启动一个全局读锁(执行flush tables with read lock),其他session可以读取但不能更新数据,备份过程中数据没有变化,所以最终得到的数据肯定是完全一致的;
②、导出单个库:加--lock-tables参数,这会在备份开始的时候锁该库的所有表,其他session可以读但不能更新该库的所有表,该库的数据一致;
③、导出单个表:加--lock-tables参数,这会在备份开始的时候锁该表,其他表不受影响,该表数据一致。
上面只是展示了对不同引擎来讲加的参数只是为了让数据保持一致性,但在备份中业务并没有停止,时刻可能有新的数据进行写入,为了让我们知道备份时是备份了哪些数据,或者截止到那个指针(二进制日志),我们可以再加入 --master-data参数,备份好的sql文件就会记录从备份截至到哪个指针,指针之后的数据更新我们可以通过二进制日志进行恢复。
MySQLdump -uroot -p --single-transaction --master-data=2 --flush-log --database test >test.sql --> --flush-log 表示备份开始之后的更新都切到下一个二进制日志
可以在备份的test.sql文件中前几行看到记录着备份当时的二进制日志信息
vimtest.sql
--CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=436263492;
---- Current Database: test
mysqlbinlog --start-position=436263492 mysql-bin.000004 > 00004.sql -->在全备恢复之后,我们可以通过之后的二进制日志进行恢复
另外解释下mysqldump备份时为什么要锁表才能保持数据的一致性:

说明:
1、在t1时间点,用mysqldump启动不锁表备份;
2、先导出a表,共耗时5分钟,因为没有锁表,在这5分钟内b表insert了10行数据;
3、到了t2时间点,a表导出完成,开始导出b表;
4、导出b表耗时10分钟,在导出b表的过程中,a、b表均没有数据变化;
5、到了t3时间点,b表导出完成,全部备份结束;
6、然后备机从t1时间点的binlog位置开始应用binlog,最后备机中b表的数据比主机多10行(因为全备当中包含了insert的十行数据,binlog二进制日志当中也包含了新增的十行数据,所以会导致备机利用mysqldump+binlog恢复数据的时候导致数据插入重复),数据不一致。
从这个图可以看出,对于不支持事务的存储引擎如MyISAM如果备份过程中不锁表,不同表开始备份时对应的binlog和pos是不一致的,这时候所有表都从备份开始的点应用binlog,有很大肯会出现数据不一致(备份过程中所有表均无数据更新除外)。
mysqldump备份时保持数据一致性分析--master-data=2 --single-transaction的更多相关文章
- mysqldump备份时保持数据一致性
对MySQL数据进行备份,常见的方式如以下三种,可能有很多人对备份时数据一致性并不清楚 1.直接拷贝整个数据目录下的所有文件到新的机器.优点是简单.快速,只需要拷贝:缺点也很明显,在整个备份过程中新机 ...
- 使用mysqldump备份时为什么要加上 -q 参数(5.7默认为on)
使用mysqldump备份时为什么要加上 -q 参数(5.7默认为on) 写在前面:我们在使用mysqldump备份数据时,请一定记住要加上 -q 参数,后果可能是很严重的,不要给自己挖坑哦. 先来看 ...
- mysqldump备份时,--master-data选项的作用是什么?
需求描述: 今天在研究mysql的备份和恢复,使用mysqldump备份数据库时,用到--master-data选项, 在此,测试并记录选项的作用 测试过程: 1.不使用--master-data进行 ...
- 使用 mysqldump 备份时的一些参数
因为还没有用到 ThinkPHP 的迁移组件,暂时使用 mysqldump 来备份,并版本控制. 有几个参数需要用到. --skip-dump-date 不要完成时间. --skip-extended ...
- Mysqldump备份说明及数据库备份脚本分享-运维笔记
MySQLdump是MySQL自带的导出数据工具,即mysql数据库中备份工具,用于将MySQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中.Mysqldump是一个客户端逻辑备份的工 ...
- 在给mysql数据库备份时,报错: mysqldump: Got error: 145: Table '.\shengdaxcom\pre_forum_thread' is marked as c rashed and should be repaired when using LOCK TABLES
在给mysql数据库备份时,报错: mysqldump: Got error: 145: Table '.\shengdaxcom\pre_forum_thread' is marked as cra ...
- mysqldump备份数据库时出现when using LOCK TABLES
用mysqldump备份数据库时,如果出现when using LOCK TABLES,解决办法是加上 --skip-lock-tables 例如: 用mysqldump备份数据库时出现 29: Fi ...
- MySQL Backup mysqldump备份流程学习
我们都知道MySQL逻辑备份工具mysqldump可以保证备份数据的一致性,但是它是怎么保持一致性的? 本文不讨论mysqldump具体的选项和用法,一直对mysqldump的工作机制梳理的不太清楚, ...
- Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录
在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份 ...
- mysqldump备份与还原mysql数据的实例
有关mysql数据库的备份与还原,我们一般用下面两种方式来处理:1.使用into outfile 和 load data infile导入导出备份数据 本文原始链接:http://www.jbxue. ...
随机推荐
- 从SAP CRM上传设备到SAP ERP
文档<Step by step to download equipment from ERP with hierarchy>描述了从ERP复制设备到CRM的步骤.默认情况下,ERP中的设备 ...
- Solution Set - Splay
A[洛谷P3369]维护集合,支持插入,删除,查询\(x\)的排名,查询排名\(x\)的数,查询前驱,查询后继. B[洛谷P3391]维护一个序列,支持区间翻转. C[洛谷P3380]维护数列,支持单 ...
- 开启 ssh 服务
开启 ssh 服务 vim /etc/ssh/sshd_config 重启 ssh 服务:/etc/init.d/ssh restart 设置服务自启动:update-rc.d ssh enable
- 在英特尔至强 CPU 上使用 🤗 Optimum Intel 实现超快 SetFit 推理
在缺少标注数据场景,SetFit 是解决的建模问题的一个有前途的解决方案,其由 Hugging Face 与 Intel 实验室 以及 UKP Lab 合作共同开发.作为一个高效的框架,SetFit ...
- LogAgen的工作流程
LogAgen的工作流程: 一.读日志 --tailf 第三方库 新建tail_test/main.go package main import ( "fmt" "git ...
- ECMAScript 语言规范每年都会进行一次更新,而备受期待的 ECMAScript 2024 将于 2024 年 6 月正式亮相。目前,ECMAScript 2024 的候选版本已经发布,为我们带来了一系列实用的新功能。
Promise.withResolvers 使用 Promise.withResolvers() 关键的区别在于解决和拒绝函数现在与 Promise 本身处于同一作用域,而不是在执行器中被创建和一次性 ...
- C# Bitmap 在winform里编辑了,再次重新编辑,报gdi+错误解决办法
经过排查,var bitmap=new Bitmap()这个局部对象,没有Dispose所致.虽然是局部的对象,但还是需要Dispose:
- .NET集成DeveloperSharp实现http网络请求&与其它工具的比较
爆了,爆了,DeveloperSharp系列近期又被制造业ERP.民航飞行App.建筑BIM.电力掌上营业厅.等多家大型采用,站在巨人的肩膀上你能走的更远. 支持.Net Core2.0及以上,支持. ...
- .net core 转 excel datatable list<t> 互转 xlsx
using System; using System.Collections; using System.Collections.Generic; using System.ComponentMode ...
- windows报错
如果说你dns没有权威的话1.先去long.com上面右键属性把"区域传送给所有服务器打勾"2.右键属性,在名称分析器中,输入要添加为辅助dns的服务器的ip显示解析成功就可以了