我们可以通过打开general log,查看mysqldump全库备份时执行的命令来了解mysqldump背后的原理。
打开general log
mysql> set global general_log=on;
其中,general log的存放路径可通过以下命令查看
mysql> show variables like '%general_log_file%';
执行全库备份
# mysqldump --master-data=2 -R --single-transaction -A -phello > 3306_20160518.sql
其中
--master-data指定为2指的是会在备份文件中生成CHANGE MASTER的注释。具体在本例中,指的是
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql2-bin.000049', MASTER_LOG_POS=587;
如果该值设置为1,则生成的是CHANGE MASTER的命令,而不是注释。
-R 备份存储过程与函数
--single-transaction 获取InnoDB表的一致性备份。
-A 相当于--all-databases。
下面来看看general log中的内容
160518 11:00:59 14 Connect root@localhost on
14 Query /*!40100 SET @@SQL_MODE='' */
14 Query /*!40103 SET TIME_ZONE='+00:00' */
14 Query FLUSH /*!40101 LOCAL */ TABLES
14 Query FLUSH TABLES WITH READ LOCK
14 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
14 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
14 Query SHOW VARIABLES LIKE 'gtid\_mode'
14 Query SHOW MASTER STATUS
14 Query UNLOCK TABLES
14 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 GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE ORDER BY LOGFILE_GROUP_NAME
14 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
14 Query SHOW DATABASES
14 Query SHOW VARIABLES LIKE 'ndbinfo\_version'
其中,比较重要的有以下几点:
1. FLUSH /*!40101 LOCAL */ TABLES
Closes all open tables, forces all tables in use to be closed, and flushes the query cache.
2. FLUSH TABLES WITH READ LOCK
执行flush tables操作,并加一个全局读锁,很多童鞋可能会好奇,这两个命令貌似是重复的,为什么不在第一次执行flush tables操作的时候加上锁呢?