概述:之前介绍了在 mysql 下使用增加 --single-transaction参数 使得在mysqldump备份时对innodb不锁表进行完成,我们可以在导出的sql文件中看到,增加了该参数后,在dump表前(配合 --skip-opt参数),确实没有lock tables操作了,那么这样会不会确实不完全不锁表呢? 实际上答案是否定的,接下来我们来看看,使用general_log来观察到底mysql dump时是怎样执行与完成备份操作的。
1、首先我们打开 general_log 记录参数,保存到指定文件,我们可以在mysql终端执行 > set global general_log=on;进行开启,当然,我们也可以在[mysqld] 下增加:general_log = 1 ;进行开启 。


2、确认开启 general_log 后,我们再执行mysqldump操作:
3、观察 /tmp/general.log , 如下 :


2021-05-18T05:52:16.737375Z 40826 Connect root@localhost on using SSL/TLS
2021-05-18T05:52:16.737546Z 40826 Query /*!40100 SET @@SQL_MODE='' */
2021-05-18T05:52:16.737663Z 40826 Query /*!40103 SET TIME_ZONE='+00:00' */
2021-05-18T05:52:16.737788Z 40826 Query FLUSH /*!40101 LOCAL */ TABLES
2021-05-18T05:52:16.738981Z 40826 Query FLUSH TABLES WITH READ LOCK
2021-05-18T05:52:16.739073Z 40826 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2021-05-18T05:52:16.739143Z 40826 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2021-05-18T05:52:16.739246Z 40826 Query SHOW VARIABLES LIKE 'gtid\_mode'
2021-05-18T05:52:16.740817Z 40826 Query SHOW MASTER STATUS
2021-05-18T05:52:16.740910Z 40826 Query UNLOCK TABLES
2021-05-18T05:52:16.741063Z 40826 Query SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FRO
M INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GRO
UP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SE
LECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('ds'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NA
ME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
2021-05-18T05:52:16.758826Z 40826 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 FRO
M INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('ds')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
2021-05-18T05:52:16.766301Z 40826 Query SHOW VARIABLES LIKE 'ndbinfo\_version'
2021-05-18T05:52:16.767396Z 40826 Init DB ds
2021-05-18T05:52:16.767478Z 40826 Query SHOW CREATE DATABASE IF NOT EXISTS `ds`
2021-05-18T05:52:16.767559Z 40826 Query SAVEPOINT sp
2021-05-18T05:52:16.767641Z 40826 Query show tables
2021-05-18T05:52:16.767908Z 40826 Query show table status like '\_\_a\_admin'
2021-05-18T05:52:16.768299Z 40826 Query SET SQL_QUOTE_SHOW_CREATE=1/*!40102 ,SQL_MODE=concat(@@sql_mode, _utf8 ',NO_KEY_OPTI
ONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS') */
2021-05-18T05:52:16.768404Z 40826 Query SET SESSION character_set_results = 'binary'
2021-05-18T05:52:16.768478Z 40826 Query show create table `__a_admin`
2021-05-18T05:52:16.768606Z 40826 Query SET SESSION character_set_results = 'utf8'
2021-05-18T05:52:16.768697Z 40826 Query show fields from `__a_admin`
2021-05-18T05:52:16.769032Z 40826 Query show fields from `__a_admin`
2021-05-18T05:52:16.769350Z 40826 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `__a_admin`
2021-05-18T05:52:16.770102Z 40826 Query SET SESSION character_set_results = 'binary'
2021-05-18T05:52:16.770179Z 40826 Query use `ds`
2021-05-18T05:52:16.770252Z 40826 Query select @@collation_database
2021-05-18T05:52:16.770333Z 40826 Query SHOW TRIGGERS LIKE '\_\_a\_admin'
2021-05-18T05:52:16.770650Z 40826 Query SET SESSION character_set_results = 'utf8'
2021-05-18T05:52:16.770733Z 40826 Query ROLLBACK TO SAVEPOINT sp
不难发现, 其实执行mysqldump后,依然是有锁表操作的, 只不过时间非常短暂,并且不是备份表开启的锁,是开启事务 , 我们可以通过详细日志也能发现,而保障数据的一致性恰好是通过事务回滚来加以实现的。 另外,general_log 参数不建议在生产环境或大数据环境开启,因为它将记录所有数据库操作,所以数据量非常大,开启对性能和磁盘消耗都有一定影响。

