mysqldump原理3
现网中数据库运维时,要经常对数据库做热备。为保证恢复时数据的完整性与一致性, 一种方法是在备份之前锁表,但锁表会影响正在运行的业务。
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。
mysqldump原理3的更多相关文章
- mysqldump原理2
本文主要探讨 mysqldump 的几种主要工作方式,并且比较一下和 mk-parralel-dump的一些差异,为备份方式的选择提供更多的帮助. 首先来看下 mysqldump 的几个主要参数的实际 ...
- MySQL备份恢复-mysqldump原理
+++++++++++++++++++++++++++++++++++++++++++标题:mysqldump对MySQL数据库备份恢复原理时间:2019年2月23日内容:mysqldump工具重点: ...
- [转]深入理解mysqldump原理 --single-transaction --lock-all-tables --master-data
本文转至:http://blog.csdn.net/cug_jiang126com/article/details/49824471 在mysqldump过程中,之前其实一直不是很理解为什么加了--s ...
- mysqldump原理5
http://blog.csdn.net/niu870781892/article/details/6186078 导出多张表的时候表之间用空格分开: # mysqldump -h192.168.25 ...
- mysqldump原理4
http://blog.csdn.net/dba_waterbin/article/details/23611601?utm_source=tuicool&utm_medium=referra ...
- [转]深入理解mysqldump原理
本文转至:http://blog.csdn.net/cug_jiang126com/article/details/49824471 在mysqldump过程中,之前其实一直不是很理解为什么加了--s ...
- mysqldump 原理(转载)
mysqldump 备份过程可以描述为: (1) 先发出一条 flush tables 关闭实例上所有打开的表(2) 创建一个全局锁,FLUSH TABLES WITH READ LOCK获得 db ...
- mysqldump原理及实战
使用mysqldump命令行工具创建逻辑备份: 注意mysqldump的版本和路径mysqldump命令创建的是逻辑备份,结果集有两种格式:一种是将数据转换成标准的SQL语句(一堆CREATE,DRO ...
- mysqldump 原理
(3)分析general.log日志: [root@zstedu data]# cat zstedu.log mysqld, Version: 5.7.22-log (MySQL Community ...
随机推荐
- CQOI2009中位数图
原来在vijos上做过,当时根本看不懂 现在看起来这么水…… x记录从b向左连续走比k大的有多少个 y记录从b向右连续走比k大的有多少个 最后根据乘法原理乘一下 不过要加上x[0]+y[0]+1 因为 ...
- 自问自答之VR遐想
先让我组织一下语言,作为表达能力超弱的战五渣来讲,归纳总结什么的最要命了. 我可以给你分析个1到N条出来,但是一般来讲没什么顺序,想到什么就说什么.而且我属于线性思维,有一个引子就可以按着话头一步步发 ...
- js基础第六天
获取节点属性 getAttribute("属性") 获取属性 setAttribute("属性","值"); 设置节点属性 删除某个属性 r ...
- PHP基本语法的小结
一.PHP能做什么? PHP能做什么?我觉得它很强大,只要我能想到的,它都能做,只是我技术能力还不行╮(╯﹏╰)╭.好吧,一张图,基本了解一下吧(ps:PHP的功能不局限于此( ^_^ )) 图像有点 ...
- codeforce 600A - Extract Numbers
学习string #include <bits/stdc++.h> #define eps 1e-8 #define M_PI 3.141592653589793 ; using name ...
- IntelliJ远程调试教程
概述 对于分布式系统的调试不知道大家有什么好的方法.对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时.今天咱们来了解了解Java远程调试这个牛逼的 ...
- connect to a specific wifi network in Android programmatically
http://stackoverflow.com/questions/8818290/how-to-connect-to-a-specific-wifi-network-in-android-prog ...
- IP查找工具——angry IP Scanner
作用] 若树莓派没有屏幕可通过该工具查找树莓派的IP地址.例如下图的树莓派IP地址可能为192.168.1.107. 图1 IP scan查找树莓派IP地址
- 44 个 JavaScript 变态题解析
当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了…. 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧! 第1题 ["1", &qu ...
- Exercise: Rot13 Reader
package main import ( "io" "os" "strings" "fmt" ) type rot13 ...