当时用mysqldump配置主从的时候,要设置--single-transaction,这个参数将保证备份的数据库处于一致的状态
一般的备份语句如下:
mysqldump -uroot -S /data/3306/data/mysql.sock -p --all-databases --triggers --routines --events -e --single-transaction --quick --master-data=2 --set-gtid-purged=ON --max_allowed_packet=2G --net_buffer_length=16M --skip_tz-utc> /app/all.sql
打开general_log查看导致执行了那些语句
2021-07-05T16:25:16.158271+08:00 6 Connect root@localhost on using Socket
2021-07-05T16:25:16.158589+08:00 6 Query /*!40100 SET @@SQL_MODE='' */
--为了后续操作先进行flush table
--flush table的官方定义为Closes all open tables, forces all tables in use to be closed, and flushes the query cache and
prepared statement cache. FLUSH TABLES also removes all query results from the query cache, like the RESET QUERY CACHE statement。
2021-07-05T16:25:16.158895+08:00 6 Query FLUSH /*!40101 LOCAL */ TABLES
--如果flush table成功,表示这个时候没有任何session阻塞了备份(长查询,长事务都会阻塞备份)
--这时对整个数据库加read锁
2021-07-05T16:25:16.461454+08:00 6 Query FLUSH TABLES WITH READ LOCK
--成功后设置隔离级别为可重复读
2021-07-05T16:25:16.461663+08:00 6 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
--开启一个事务,并且设置WITH CONSISTENT SNAPSHOT为快照级别。如果只是可重复读,那么在事务开始时还没dump数据时,这时其他线程修改并提交了数据,那么这时第一次查询得到的结果是其他线程提交后的结果,而WITH CONSISTENT SNAPSHOT能够保证在事务开启的时候,第一次查询的结果就是事务开始时的数据A,即使这时其他线程将其数据修改为B,查的结果依然是A
2021-07-05T16:25:16.461767+08:00 6 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2021-07-05T16:25:16.461983+08:00 6 Query SHOW VARIABLES LIKE 'gtid\_mode'
2021-07-05T16:25:16.462788+08:00 6 Query SELECT @@GLOBAL.GTID_EXECUTED
--上面的操作保证了对本事务来说,数据库现在是一致性的状态,这时可以放心的获取binlog的位置,将来cahnge master就从这个位置开始
2021-07-05T16:25:16.462960+08:00 6 Query SHOW MASTER STATUS
2021-07-05T16:25:16.463092+08:00 6 Query UNLOCK TABLES
--锁被释放
--后续的操作都不会再加任何锁定
2021-07-05T16:25:16.463253+08:00 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 IS NOT NULL GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
2021-07-05T16:25:16.465204+08:00 6 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
2021-07-05T16:25:16.465808+08:00 6 Query SHOW DATABASES
2021-07-05T16:25:16.466316+08:00 6 Query SHOW VARIABLES LIKE 'ndbinfo\_version'
2021-07-05T16:25:16.466849+08:00 6 Init DB mysql
2021-07-05T16:25:16.466976+08:00 6 Query SHOW CREATE DATABASE IF NOT EXISTS `mysql`
2021-07-05T16:25:16.467107+08:00 6 Query SAVEPOINT sp
2021-07-05T16:25:16.467226+08:00 6 Query show tables
2021-07-05T16:25:16.467542+08:00 6 Query show table status like 'columns\_priv'
总结:
1.--single-transaction会短暂加全局读锁,用来保证数据库处于一致性状态。
2.获取锁定会被其他长查询,长事务都会阻塞,所以备份最好在数据库不繁忙的 时候进行。
3.后续的数据导出不会加任何锁定,不影响应用执行。