mysqldump原理及实践

系统环境

# cat /etc/redhat-release
CentOS release 6.5 (Final)
# uname -a
Linux miles 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

软件版本


mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.27-log |
+------------+

打开general_log

mysql> set global general_log=1;
Query OK, 0 rows affected (0.04 sec)

mysql> show global variables like '%gen%';
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| general_log      | ON                    |
| general_log_file | /data/mysql/miles.log |
+------------------+-----------------------+
2 rows in set (0.01 sec)

创建测试数据

mysql> create database test;
Query OK, 1 row affected (0.03 sec)

mysql> use test
Database changed

mysql> create table t1 (
    -> id int primary key auto_increment,
    -> name varchar(10) not null,
    -> age int not null);
Query OK, 0 rows affected (0.07 sec)

mysql> insert into t1(name,age) values('name1',10),('name2',10),('name3',10),('name4',10),('name5',10),('name6',10),('name7',10),('name8',10),('name9',10);
Query OK, 9 rows affected (0.01 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> create table t2(id int not null primary key auto_increment,name varchar(10) not null,age int not null);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t2(name,age) values('name1',10),('name2',10),('name3',10),('name4',10),('name5',10),('name6',10),('name7',10),('name8',10),('name9',10);
Query OK, 9 rows affected (0.01 sec)
Records: 9  Duplicates: 0  Warnings: 0

不开启–single-transaction执行备份

# mysqldump -uroot -p --socket=/data/mysql.sock -B test

查看对应的general_log

160728 21:28:00     5 Connect   root@localhost on
                    5 Query     /*!40100 SET @@SQL_MODE='' */
                    5 Query     /*!40103 SET TIME_ZONE='+00:00' */
                    5 Query     SHOW VARIABLES LIKE 'gtid\_mode'
                    5 Query     SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('test'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE ORDER BY LOGFILE_GROUP_NAME
                    5 Query     SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('test')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
                    5 Query     SHOW VARIABLES LIKE 'ndbinfo\_version'
                    5 Init DB   test
                    5 Query     SHOW CREATE DATABASE IF NOT EXISTS `test`
                    5 Query     show tables
                    5 Query     LOCK TABLES `t1` READ /*!32311 LOCAL */,`t2` READ /*!32311 LOCAL */
                    5 Query     show table status like 't1'
                    5 Query     SET SQL_QUOTE_SHOW_CREATE=1
                    5 Query     SET SESSION character_set_results = 'binary'
                    5 Query     show create table `t1`
                    5 Query     SET SESSION character_set_results = 'utf8'
                    5 Query     show fields from `t1`
                    5 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `t1`
                    5 Query     SET SESSION character_set_results = 'binary'
                    5 Query     use `test`
                    5 Query     select @@collation_database
                    5 Query     SHOW TRIGGERS LIKE 't1'
                    5 Query     SET SESSION character_set_results = 'utf8'
                    5 Query     show table status like 't2'
                    5 Query     SET SQL_QUOTE_SHOW_CREATE=1
                    5 Query     SET SESSION character_set_results = 'binary'
                    5 Query     show create table `t2`
                    5 Query     SET SESSION character_set_results = 'utf8'
                    5 Query     show fields from `t2`
                    5 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `t2`
                    5 Query     SET SESSION character_set_results = 'binary'
                    5 Query     use `test`
                    5 Query     select @@collation_database
                    5 Query     SHOW TRIGGERS LIKE 't2'
                    5 Query     SET SESSION character_set_results = 'utf8'
                    5 Query     UNLOCK TABLES

原理:

加全局读锁(防止备份数据不一致)
LOCK TABLES `t1` READ /*!32311 LOCAL */,`t2` READ /*!32311 LOCAL */
获取建表信息生成建表语句
show create table `t1`
当前字符集会做一些处理,防止乱码
SET SESSION character_set_results = 'utf8'
获取行记录从而转换成insert插入语句
show fields from `t1`
SELECT /*!40001 SQL_NO_CACHE */ * FROM `t1`
重复表t1操作
释放读锁
UNLOCK TABLES

开启–single-transaction备份

# mysqldump -uroot -p --socket=/data/mysql.sock -B test --single-transaction

查看对应的general_log

160728 21:28:41     6 Connect   root@localhost on
                    6 Query     /*!40100 SET @@SQL_MODE='' */
                    6 Query     /*!40103 SET TIME_ZONE='+00:00' */
                    6 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
                    6 Query     START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
                    6 Query     SHOW VARIABLES LIKE 'gtid\_mode'
                    6 Query     UNLOCK TABLES
                    6 Query     SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('test'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE ORDER BY LOGFILE_GROUP_NAME
                    6 Query     SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('test')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
                    6 Query     SHOW VARIABLES LIKE 'ndbinfo\_version'
                    6 Init DB   test
                    6 Query     SHOW CREATE DATABASE IF NOT EXISTS `test`
                    6 Query     SAVEPOINT sp
                    6 Query     show tables
                    6 Query     show table status like 't1'
                    6 Query     SET SQL_QUOTE_SHOW_CREATE=1
                    6 Query     SET SESSION character_set_results = 'binary'
                    6 Query     show create table `t1`
                    6 Query     SET SESSION character_set_results = 'utf8'
                    6 Query     show fields from `t1`
                    6 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `t1`
                    6 Query     SET SESSION character_set_results = 'binary'
                    6 Query     use `test`
                    6 Query     select @@collation_database
                    6 Query     SHOW TRIGGERS LIKE 't1'
                    6 Query     SET SESSION character_set_results = 'utf8'
                    6 Query     ROLLBACK TO SAVEPOINT sp
                    6 Query     show table status like 't2'
                    6 Query     SET SQL_QUOTE_SHOW_CREATE=1
                    6 Query     SET SESSION character_set_results = 'binary'
                    6 Query     show create table `t2`
                    6 Query     SET SESSION character_set_results = 'utf8'
                    6 Query     show fields from `t2`
                    6 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `t2`
                    6 Query     SET SESSION character_set_results = 'binary'
                    6 Query     use `test`
                    6 Query     select @@collation_database
                    6 Query     SHOW TRIGGERS LIKE 't2'
                    6 Query     SET SESSION character_set_results = 'utf8'
                    6 Query     ROLLBACK TO SAVEPOINT sp
                    6 Query     RELEASE SAVEPOINT sp

原理:

更改当前会话隔离级别为rr
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
开始事务(并生成一致性快照)
START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
释放表锁
UNLOCK TABLES
设置一个savepoint
SAVEPOINT sp
查看数据库下的表
show tables
对t1表进行操作,获得表信息、建表语句及数据
show create table `t1`
SET SESSION character_set_results = 'utf8'
show fields from `t1`
SELECT /*!40001 SQL_NO_CACHE */ * FROM `t1`
回滚到savepoint sp
ROLLBACK TO SAVEPOINT sp
对其他表重复该过程
最后释放savepoint
RELEASE SAVEPOINT sp

整个备份过程,没有任何锁。RR隔离级别保证在事务中只读取本事务之前的一致性的数据 。
rollback to savepoint sp,保证了对数据库中的数据没有影响。 
时间: 2024-10-31 04:15:48

mysqldump原理及实践的相关文章

学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践

原文 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践 感谢大家在上一篇 学一点Git--20分钟git快速上手 里的踊跃发言.这里再次分享干货, 简单介绍mysql双机,多机异地热备简单原理实战. 双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步.对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一 致. 这样做的好处多. 1. 可以做灾备,其中一个坏了可以切换到另一个. 2. 可以做负载均衡,可以将请求分摊到其中任何一台上

《 C++程序设计:原理与实践(进阶篇.》导读

本节书摘来自华章出版社< C++程序设计:原理与实践(进阶篇)>一书中作者[美] 本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) 著 刘晓光 李忠伟 王刚 译     前 言 Programming: Principles and Practice Using C++, Second Edition 该死的鱼雷!全速前进. --Admiral Farragut 程序设计是这样一门艺术,它将问题求解方案描述成计算机可以执行的形式.程序设计中很多工作都花费在寻找求解方案以及对其求精上

c++-关于《C++程序设计原理与实践》第3章例子的一个问题

问题描述 关于<C++程序设计原理与实践>第3章例子的一个问题 本人菜鸟,现正在学习C++.<C++程序设计原理与实践>第3章有一个例子,代码如下: #include #include #include #include #include using namespace std; inline void keep_window_open(){ char ch; cin >> ch; } int main() //C++ Programs start by executi

推荐系统——从原理到实践,还有福利赠送!

之前流水账似的介绍过一篇机器学习入门的文章,大致介绍了如何学习以及机器学习的入门方法并提供了一些博主自己整理的比较有用的资源.这篇就尽量以白话解释并介绍机器学习在推荐系统中的实践以及遇到的问题... 也许很多点在行家的眼里都是小菜一碟,但是对于刚刚接触机器学习来说,还有很多未知等待挑战. 所以读者可以把本篇当做是机器学习的玩具即可,如果文中有任何问题,还请不吝指教. 本篇将会以下面的步骤描述机器学习是如何在实践中应用的: 1 什么是推荐系统? 2 机器学习的作用 3 机器学习是如何使用的? 4

源代码-C++程序设计原理与实践

问题描述 C++程序设计原理与实践 #include "std_lib_facilities.h" int main() { cout<<"Hello,world!n"; return 0; } 我下了源代码,放到那里才能猜VC98编译时不出错?最好详细点,带有图解 解决方案 ...大哥,都什么年代了还用98

RocketMQ的原理与实践

备注: 1.如果您此前未接触过RocketMQ,请先阅读附录部分,以便了解RocketMQ的整体架构和相关术语 2.文中的MQServer与Broker表示同一概念 分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一款高性能.高吞吐量的消息中间件,它是怎样来解决这两个问题的?RocketMQ 有哪些关键特性?其实现原理是怎样的? 关键特性以及其实现

深入解析SQL Server并行执行原理及实践(下)

谈完并行执行的原理,咱们再来谈谈优化,到底并行执行能给我们带来哪些好处,我们又应该注意什么呢,下面展开.   Amdahl's  Law    再谈并行优化前我想有必要谈谈阿姆达尔定律,可惜老爷子去年已经驾鹤先去了.     其中  P:可以并行的百分比 N:算法并行计算使用的"CPU"    这里我们举个简单的例子,我们来做一份大餐,如图1-1所示:   图1-1   土豆泥,荷兰豆,鸡排还有整体组合各需十分钟.在这里前三个食材是可以共同执行的,也就是说4个步骤中3步可并行 P=3/

《新一代SDN——VMware NSX 网络原理与实践》——导读

**前言**当企业需要搭建一个"云"的时候,无论它是公有云还是私有云,其基础架构一定涉及网络.计算和存储这三大块.NIST对云计算的定义中,明确提出了云中资源需要实现"按需自助服务".对于计算和存储,我们通过最早由VMware主导的服务器虚拟化技术,已经很好地实现了这样的要求,而之前对于网络的"按需自助服务",则一直实现得不理想,这是因为传统物理网络很难在虚拟化环境中进行资源的调配.因此,传统网络阻碍了数据中心的自动化实现,我们需要通过创新,用一

《网络安全原理与实践》一导读

前言 网络安全原理与实践本书旨在帮助读者深入理解如今网络中实施的各种网络安全规则.特性和协议.本书使用Cisco安全实施作为讲解的基础,其目标如下所示. 在较高的层次上完整讨论了与实施网络安全相关的所有主题. 深入.详细地讨论了网络安全实施背后的协议运行机制. 讨论了构成不同网络产品.特性和实施基础的安全规则. 讨论以提高网络安全性为目标的网络设计的有用因素. 理解建立和维护安全网络的操作需求. 讨论网络安全必需的网络维护和故障排错技术. 本书旨在从较高的层次上讨论各种主题.但是,为了保持讨论的