现网中数据库运维时,要经常对数据库做热备。为保证恢复时数据的完整性与一致性, 一种方法是在备份之前锁表,但锁表会影响正在运行的业务。

mysqldump是当前MySQL中最常用的备份工具,通过mysqldump --help可以查看很多选项。

在mysqldump开始备份后,执行其它的更新数据库操作,mysqldump备份的结果会不会包含备份结束前对数据库的更改呢?在一个时间点备份,最理想的结果是备份的结果就是备份开始时的数据库快照。通过选择合适的选项做备份,mysqldump可以保证数据一致性且不影响业务的运行。

mysqldump产生的备份,最终是要结合binlog进行恢复。mysqldump也可以准确得到binlog的恢复点。

那么mysqldump中如何保证数据一致性并生成备份的呢?下面通过一个常用示例来解释mysqldump的原理。(仅针对InnoDB存储引擎举例)

mysqldump –uuser -p --skip-opt -q -R  --single-transaction --default-character-set=utf8 --master-data=2  --create-option --no-autocommit –S ${sock} -B ${DBName}  > backup.sql

执行上述命令后,会得到一个可以用于恢复的backup.sql文件。bauckup.sql中主要有一系列的create语句与insert语句,恢复的过程就是创建原来存在的数据库及表,并将所有表数据直接insert到表中。

在执行mysqldump命令前,在MySQL中执行set global general_log = on来打开通用日志,该日志默认是关闭的。通用日志记录了MySQL服务器响应的所有SQL语句信息,mysqldump命令实际上是通过构造一系列SQL语句并发送到数据库服务器,利用服务器的响应信息从而构造出备份文件backup.sql。

下图是执行上述mysqldump命令后,general log中记录的部分内容。

第一行,执行connect是通过mysqldump选项中的-u, -p, -S来进行端口、用户验证,然后连接服务器。

其中的flush tables 、flush tables with read lock、 unlock tables及其中的show master status是响应选项--master-data.通过一个瞬间的锁表,利用show master status来得到binlog的位置。在backup.sql中,可以找到类似下面的信息。

进行瞬间的锁表就是要保证得到正确的binlog位置。flush tables后,当前数据库快照就是我们要备份的,通过show master status得到binlog位置信息。那么如何保证对当前数据库快照进行备份呢?结合选项--single-transaction,mysqldump的处理是start transaction。由于INNODB的MVCC机制,start transacion会产生一个事务id,利用这个事务id可以过滤该事务之后的事务对数据库的更新操作,从而得到当前快照的备份。

有个细节要注意,flush tables ;flush tables with read lock; 为什么不直接就加上read lock,这样写的好处是什么? 其实这样做可以尽可能少的减少加锁的影响,减少冲突。

另一个细节要注意是start transaction要放在flush tables 与 unlock tables之间,不能放在前面或者后面。flush tables后,当前数据库快照就是我们要备份的,然后show master status也得到了binlog位置信息。而start transaction是通过begin一个事务来获取这个快照的,如果放在前面或者后面,会造成数据丢失或者数据的重复插入。

另外,还有很多general log信息,来得到当前快照中的数据库、表、存储过程及数据等。下面仅以test库中一个t1表的部分内容为例说明。

show create database if not exists ‘test’; 服务器响应该语句得到test库的创建语句

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test`;

加上if not exists保证在create时不存在test库才创建test。

show tables获取test库中所有的表。

show table status like ‘t1’得到t1表的状态信息,便于进一步处理。

show create table `t1`生成t1表的创建语句。

SELECT /*!40001 SQL_NO_CACHE */ * FROM `t1; 该语句得到表t1的所有数据,在backup.sql中会生成相应的insert语句,恢复时执行这些数据的insert操作。其中sql_no_cache的作用是避免查询结果缓存(不是不在缓存中查询结果)。

在general log中还可以看到一系列mysqldump处理后发送到服务器的语句,然后mysqldump利用服务器返回的结果进行处理,从而得到备份文件backup.sql。

mysql dump 影响业务_mysqldump原理3相关推荐

  1. mysql dump锁表_mysqldump 锁表和解锁语句

    备份: 导出要用到MySQL的mysqldump工具,基本用法是: mysqldump [OPTIONS] database [tables] 如果你不给定任何表,整个数据库将被导出. 通过执行mys ...

  2. 打通MySQL架构和业务的任督二脉

    目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...

  3. oracle异构迁移mysql方案实施(含原理)——已迁移成功

    从迁移方案的落地.迁移前准备.N次迁移演练.回归测试.性能调优整整用了四个月左右的时间(当然在此期间还包括其他项目及日常操作耗费工时).正式迁移到迁移成功.以及上线开服后性能稳定这些操作已经过去了一个 ...

  4. 【数据库】MySQL事务并发、MVCC原理及实现

    文章目录 ACID 隔离性分为四个级别 数据库事务并发可能出现的问题 读已提交等级下解决脏读办法 可重复读解决不可重复读 MySQL 是如何解决幻读的 快照读和当前读 那什么又是悲观锁呢 MySQL ...

  5. 纲举目张:打通MySQL架构和业务的任督二脉

    目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...

  6. mysql中影响数据库性能的因素讲解

    mysql中影响数据库性能的因素讲解 在本篇文章中我们给大家讲述了mysql中影响性能的因素以及相关知识点内容,有兴趣的朋友参考下 关于数据库性能的故事 面试时多多少少会讲到数据库上的事情," ...

  7. mysql数据库mysqldump还原_mysqldump数据库备份与恢复

    mysqldump -u 用户名 -p 数据库名> 备份的文件名 本文中因服务器为多实例,所以在执行登陆等命令时指定了-S参数,即指定其中一个数据库 备份: mysqldump -u root ...

  8. [MySQL] 在线 DDL 工具 gh-ost 原理简介

    一.简介 gh-ost: github 提供的针对 MySQL 无触发器式在线架构迁移解决方案. 二.原理 目前的在线架构变更工具都使用了类似的方式:创建一个和源表一样的临时表,在临时表执行 DDL ...

  9. 腾讯一面:说一说 MySQL 中索引的底层原理

    一.前言 最近有很多读者要我出一些面试题的文章,一般我会给他一个老周整理的电子书,但有些读者反馈回来的面试题我觉得还是蛮经典的,而老周又在写系列的文章,本着对读者负责的态度,我会穿插写几篇我认为比较经 ...

最新文章

  1. sqlplus导数_使用sqlplus 几个常用命令
  2. python之路--嵌套函数、匿名函数、高阶函数。函数的递归
  3. 开发日记-20190914 关键词 汇编语言王爽版 第五章
  4. UE选择合适的小区进行驻留以后
  5. 7 Javascript:表单与验证-非空验证
  6. Ubuntu16.04下面的vs code出现Unable to activate CppCheck analyzer
  7. CF1286D-LCC【动态dp,数学期望】
  8. oracle idm_深入了解Oracle IDM审核
  9. (77)Vivado设置伪路径约束
  10. 如何设置通知栏下拉不可用
  11. C#session共享+redis_Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享
  12. Android Studio实现 历史上的今天
  13. Android最佳实践之流畅设计
  14. ftp同步软件android,[Android ]FTP/SCP/FTPS客户端AndFTP v4.5专业版 开心版
  15. [NOIP2013 普及组 T1] 计数问题
  16. Vivado初次使用教程
  17. 从VGG19中任意层提取图像识别的特征
  18. linux网卡驱动如何安装,linux下网卡驱动安装全过程
  19. 计算机设置休眠密码,win10系统如何设置电脑待机密码?windows10设置待机密码图文教程...
  20. 重新启动oracle 服务,在linux重新启动下如何设置oracle服务自动开启

热门文章

  1. linux tempfs及/dev/shm 基于内存的文件系统
  2. Docker的镜像导出与导入与拷贝
  3. Libgcrypt实现AES加密
  4. 国际化困境(第二篇)
  5. _splitpath,_makepath分析路径
  6. 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
  7. 提高你开发效率的十五个Visual Studio 2010使用技巧
  8. idea设置java_使用IntelliJ IDEA 配置JDK(入门)
  9. TCP校验和的设计与实现
  10. objdump反汇编用法示例