MySQLdump备份原理

mysql常用备份工具:

1、MySQLdump、MySQLpump(逻辑备份)

2、xtrbackup(热备份)

MySQLdump解析:

1、打开general_log:

show variables like 'general_log';

set general_log = 1;

2、执行一次全备份:

mysqldump -uroot -p -A -R -E --triggers --single-transaction --master-data=2 > ~/test.sql

--single-transaction:获取到innodb的一致性快照备份。

-R:备份存储过程

-E:备份事件

--triggers:备份触发器

--master-data:生成change master to语句,注释过的

下面来看general_log生成的内容:

第一部分:

2019-04-22T14:02:01.905221+08:00            2 Query     show variables like '%gen%'
2019-04-22T14:02:04.129840+08:00            2 Quit
2019-04-22T14:03:28.584978+08:00            3 Connect   root@localhost on  using Socket
2019-04-22T14:03:28.585361+08:00            3 Query     /*!40100 SET @@SQL_MODE='' */
2019-04-22T14:03:28.586368+08:00            3 Query     /*!40103 SET TIME_ZONE='+00:00' */
2019-04-22T14:03:28.586926+08:00            3 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2019-04-22T14:03:28.587210+08:00            3 Query     START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2019-04-22T14:03:28.588251+08:00            3 Query     SHOW VARIABLES LIKE 'gtid\_mode'
2019-04-22T14:03:28.593981+08:00            3 Query     SELECT @@GLOBAL.GTID_EXECUTED
2019-04-22T14:03:28.594307+08:00            3 Query     UNLOCK TABLES
2019-04-22T14:03:28.595072+08:00            3 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 IS NOT NULL GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
2019-04-22T14:03:28.599645+08:00            3 Query     SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
2019-04-22T14:03:28.600894+08:00            3 Query     SHOW DATABASES
2019-04-22T14:03:28.605142+08:00            3 Query     SHOW VARIABLES LIKE 'ndbinfo\_version'
 

其中重要的几点:

1)SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

设置事物等级为可重复读,避免幻读和不可重复读

2)START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */

开启一个事物,并获取当前的快照,对innodb表有效,是由--single-transaction参数控制的

在开始事物的时候,对所有表执行一次select *操作,这样可以保证在备份时的任何时间点进行select * 操作获取到的数据和事物开启时是一致的。

3)SHOW VARIABLES LIKE 'gtid\_mode',SELECT @@GLOBAL.GTID_EXECUTED

检查gitd模式,生成change master to语句

4)UNLOCK TABLES

释放锁

第二部分:

2019-04-22T14:03:29.109716+08:00            3 Init DB   test
2019-04-22T14:03:29.109818+08:00            3 Query     SHOW CREATE DATABASE IF NOT EXISTS `test`
2019-04-22T14:03:29.109947+08:00            3 Query     SAVEPOINT sp
2019-04-22T14:03:29.110109+08:00            3 Query     show tables
2019-04-22T14:03:29.110344+08:00            3 Query     show table status like 'test'
2019-04-22T14:03:29.111653+08:00            3 Query     SET SQL_QUOTE_SHOW_CREATE=1
2019-04-22T14:03:29.111786+08:00            3 Query     SET SESSION character_set_results = 'binary'
2019-04-22T14:03:29.111912+08:00            3 Query     show create table `test`
2019-04-22T14:03:29.112092+08:00            3 Query     SET SESSION character_set_results = 'utf8'
2019-04-22T14:03:29.112229+08:00            3 Query     show fields from `test`
2019-04-22T14:03:29.112695+08:00            3 Query     show fields from `test`
2019-04-22T14:03:29.113138+08:00            3 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`
2019-04-22T14:03:29.113432+08:00            3 Query     SET SESSION character_set_results = 'binary'
2019-04-22T14:03:29.113601+08:00            3 Query     use `test`
2019-04-22T14:03:29.113747+08:00            3 Query     select @@collation_database
2019-04-22T14:03:29.113887+08:00            3 Query     SHOW TRIGGERS LIKE 'test'
2019-04-22T14:03:29.114582+08:00            3 Query     SET SESSION character_set_results = 'utf8'
2019-04-22T14:03:29.114717+08:00            3 Query     ROLLBACK TO SAVEPOINT sp
2019-04-22T14:03:29.114832+08:00            3 Query     RELEASE SAVEPOINT sp
2019-04-22T14:03:29.118072+08:00            3 Quit
过程解析:

1)Init DB   test

初始化test库

2)SAVEPOINT sp

对当前的库设置一个保存点

3)show create table `test`,show fields from `test`

生成建表语句

4) SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`

获取到test表的全部数据,并且生成相应的insert语句到文件中

5)SHOW TRIGGERS LIKE 'test'

查看触发器

6)ROLLBACK TO SAVEPOINT sp

如果在执行select * 语句之间的时候有DDL语句,如果不加ROLLBACK TO SAVEPOINT sp语句,会一直hang下去。执行ROLLBACK TO SAVEPOINT sp语句之后,可以执行DDL语句。

START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */的提交语句是COMMIT或ROLLBACK,日志里没有是因为MySQLdump在备份完成之后直接断开与mysql的连接,也不会对服务做出任何改变。

猜你喜欢

转载自blog.csdn.net/baijiu1/article/details/89452687