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

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备份原理 | 腾讯游戏DBA团队   http://tencentdba.com/blog/mysqldump-backup-principle/

mysqldump备份原理的更多相关文章

  1. mysqldump备份原理6

    写在前面:我们在使用mysqldump备份数据时,请一定记住要加上 -q 参数,后果可能是很严重的,不要给自己挖坑哦.到底为什么呢,且听我慢慢道来! 先来看看 mysqldump –help 中,关于 ...

  2. mysql 5.5 mysqldump备份原理

    开启general_log日志,获取mysqldump执行语句 show VARIABLES like 'general_log%' set GLOBAL general_log=on 执行备份命令 ...

  3. mysqldump 备份原理8

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; http://www.cnblogs.com/lyhabc/p/38 ...

  4. mysqldump 备份原理9

      前文的一个细节http://blog.itpub.net/29254281/viewspace-1392757/ 5.--master-data + --single-transaction 同时 ...

  5. mysqldump+mydumper+xtrabackup备份原理流程

    mysqldump备份原理 备份的基本流程如下: 1.调用FTWRL(flush tables with read lock),全局禁止读写 2.开启快照读,获取此时的快照(仅对innodb表起作用) ...

  6. mysqldump和xtrabackup备份原理实现说明

    背景: MySQL数据库备份分为逻辑备份和物理备份两大类,犹豫到底用那种备份方式的时候先了解下它们的差异: 逻辑备份的特点是:直接生成SQL语句,在恢复的时候执行备份的SQL语句实现数据库数据的重现. ...

  7. MySQL备份原理详解

    备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低.衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(R ...

  8. mysqldump备份7

    http://www.cnblogs.com/ivictor/p/5505307.html   对于MySQL的备份,可分为以下两种: 1. 冷备 2. 热备 其中,冷备,顾名思义,就是将数据库关掉, ...

  9. MySQL Backup mysqldump备份流程学习

    我们都知道MySQL逻辑备份工具mysqldump可以保证备份数据的一致性,但是它是怎么保持一致性的? 本文不讨论mysqldump具体的选项和用法,一直对mysqldump的工作机制梳理的不太清楚, ...

随机推荐

  1. PropertyGird( 属性表格) 组件

    本节课重点了解 EasyUI 中 PropertyGird(属性表格)组件的使用方法,这个组件依赖于 DataGrid(数据表格)组件. 一. 加载方式 //class 加载方式<table i ...

  2. Sass变量、嵌套

    声明变量定义变量的语法Sass 的变量包括三个部分: 声明变量的符号“$” 变量名称 赋予变量的值简单的示例,假设你的按钮颜色可以给其声明几个变量: $brand-primary : darken(# ...

  3. [c#]控制台进度条的示例

    看到[vb.net]控制台进度条的示例 感觉很好玩,翻译成C#版. using System; using System.Collections.Generic; using System.Linq; ...

  4. 使用 Nginx 来反向代理多个 NoderCMS

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...

  5. POJ 1845

    接下来交给大家一个网上查不到的解题方法 题目是酱找出a^b的因子的和答案对9901取模 我们将a可变成这样e1^x1*e2^x2...(ei为素数) 答案就变成这样(e1^0+e1^1...e1^x1 ...

  6. MySQL 使用索引扫描来做排序

    MySQL有两种方式可以生成有序的结果:通过排序操作:或者按照索引顺序扫描:如果EXPLAIN 出来的结果的type列的值为“index”,则说明MySQL使用了索引扫描来做排序(不要和Extra列的 ...

  7. [Mugeda HTML5技术教程之11]Mugeda API简介

    一.API 概述 Mugeda API 提供了一个简单的,结构化的方法来实时动态管理Mugeda内容.它提供了一下方法: •访问Mugeda内容中的对象. •获取和设置对象属性,如位置.旋转.比例.不 ...

  8. jQuery工作原理解析以及源代码示例

    jQuery的开篇声明里有一段非常重要的话:jQuery是为了改变javascript的编码方式而设计的.从这段话可以看出jQuery本身并不是UI组件库或其他的一般AJAX类库.jQuery改变ja ...

  9. C程序设计语言练习题1-11

    练习1-11 你准备如何测试单词计数程序?如果程序中存在某种错误,那么什么样的输入最可能发现这类错误呢? 代码如下: #include <stdio.h> // 包含标准库的信息. #de ...

  10. Spark link集合

    Part1. 各种参数的意义及如何配置 Spark官方文档——Spark Configuration(Spark配置) http://www.cnblogs.com/vincent-hv/p/3316 ...