mysql dump 影响业务_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。
mysql dump 影响业务_mysqldump原理3相关推荐
- mysql dump锁表_mysqldump 锁表和解锁语句
备份: 导出要用到MySQL的mysqldump工具,基本用法是: mysqldump [OPTIONS] database [tables] 如果你不给定任何表,整个数据库将被导出. 通过执行mys ...
- 打通MySQL架构和业务的任督二脉
目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...
- oracle异构迁移mysql方案实施(含原理)——已迁移成功
从迁移方案的落地.迁移前准备.N次迁移演练.回归测试.性能调优整整用了四个月左右的时间(当然在此期间还包括其他项目及日常操作耗费工时).正式迁移到迁移成功.以及上线开服后性能稳定这些操作已经过去了一个 ...
- 【数据库】MySQL事务并发、MVCC原理及实现
文章目录 ACID 隔离性分为四个级别 数据库事务并发可能出现的问题 读已提交等级下解决脏读办法 可重复读解决不可重复读 MySQL 是如何解决幻读的 快照读和当前读 那什么又是悲观锁呢 MySQL ...
- 纲举目张:打通MySQL架构和业务的任督二脉
目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...
- mysql中影响数据库性能的因素讲解
mysql中影响数据库性能的因素讲解 在本篇文章中我们给大家讲述了mysql中影响性能的因素以及相关知识点内容,有兴趣的朋友参考下 关于数据库性能的故事 面试时多多少少会讲到数据库上的事情," ...
- mysql数据库mysqldump还原_mysqldump数据库备份与恢复
mysqldump -u 用户名 -p 数据库名> 备份的文件名 本文中因服务器为多实例,所以在执行登陆等命令时指定了-S参数,即指定其中一个数据库 备份: mysqldump -u root ...
- [MySQL] 在线 DDL 工具 gh-ost 原理简介
一.简介 gh-ost: github 提供的针对 MySQL 无触发器式在线架构迁移解决方案. 二.原理 目前的在线架构变更工具都使用了类似的方式:创建一个和源表一样的临时表,在临时表执行 DDL ...
- 腾讯一面:说一说 MySQL 中索引的底层原理
一.前言 最近有很多读者要我出一些面试题的文章,一般我会给他一个老周整理的电子书,但有些读者反馈回来的面试题我觉得还是蛮经典的,而老周又在写系列的文章,本着对读者负责的态度,我会穿插写几篇我认为比较经 ...
最新文章
- sqlplus导数_使用sqlplus 几个常用命令
- python之路--嵌套函数、匿名函数、高阶函数。函数的递归
- 开发日记-20190914 关键词 汇编语言王爽版 第五章
- UE选择合适的小区进行驻留以后
- 7 Javascript:表单与验证-非空验证
- Ubuntu16.04下面的vs code出现Unable to activate CppCheck analyzer
- CF1286D-LCC【动态dp,数学期望】
- oracle idm_深入了解Oracle IDM审核
- (77)Vivado设置伪路径约束
- 如何设置通知栏下拉不可用
- C#session共享+redis_Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享
- Android Studio实现 历史上的今天
- Android最佳实践之流畅设计
- ftp同步软件android,[Android ]FTP/SCP/FTPS客户端AndFTP v4.5专业版 开心版
- [NOIP2013 普及组 T1] 计数问题
- Vivado初次使用教程
- 从VGG19中任意层提取图像识别的特征
- linux网卡驱动如何安装,linux下网卡驱动安装全过程
- 计算机设置休眠密码,win10系统如何设置电脑待机密码?windows10设置待机密码图文教程...
- 重新启动oracle 服务,在linux重新启动下如何设置oracle服务自动开启