之所以要使用START TRANSACTION WITH CONSISTENT SNAPSHOT,因为每个表的备份时间并不相同,这就要求在对第一张表进行备份的期间,对第二个表进行的操作,并不会反映到第二张表开始备份时执行的SELECT操作中。(注:mysqldump备份的底层实现即是select * from tab)。而这用START TRANSACTION就无法实现。
5. SHOW MASTER STATUS
这个是由--master-data决定的,记录了开始备份时,binlog的状态信息,包括MASTER_LOG_FILE和MASTER_LOG_POS
6. UNLOCK TABLES
释放锁。
因为我的数据库中只有以下四个库
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.03 sec)
备份的时候可以发现只备份了mysql和test,并没有备份information_schema和performance_schema。
下面来看看备份mysql和test的日志输出信息,
因日志输出信息太多,在这里,只选择test库的日志信息。test库中一共有两张表test和test1。
14 Init DB test 14 Query SHOW CREATE DATABASE IF NOT EXISTS `test` 14 Query SAVEPOINT sp 14 Query show tables 14 Query show table status like 'test' 14 Query SET SQL_QUOTE_SHOW_CREATE=1 14 Query SET SESSION character_set_results = 'binary' 14 Query show create table `test` 14 Query SET SESSION character_set_results = 'utf8' 14 Query show fields from `test` 14 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `test` 14 Query SET SESSION character_set_results = 'binary' 14 Query use `test` 14 Query select @@collation_database 14 Query SHOW TRIGGERS LIKE 'test' 14 Query SET SESSION character_set_results = 'utf8' 14 Query ROLLBACK TO SAVEPOINT sp 14 Query show table status like 'test1' 14 Query SET SQL_QUOTE_SHOW_CREATE=1 14 Query SET SESSION character_set_results = 'binary' 14 Query show create table `test1` 14 Query SET SESSION character_set_results = 'utf8' 14 Query show fields from `test1` 14 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `test1` 14 Query SET SESSION character_set_results = 'binary' 14 Query use `test` 14 Query select @@collation_database 14 Query SHOW TRIGGERS LIKE 'test1' 14 Query SET SESSION character_set_results = 'utf8' 14 Query ROLLBACK TO SAVEPOINT sp 14 Query RELEASE SAVEPOINT sp 14 Query use `test` 14 Query select @@collation_database 14 Query SET SESSION character_set_results = 'binary' 14 Query SHOW FUNCTION STATUS WHERE Db = 'test' 14 Query SHOW CREATE FUNCTION `mycat_seq_currval` 14 Query SHOW PROCEDURE STATUS WHERE Db = 'test' 14 Query SET SESSION character_set_results = 'utf8' 14 Quit
从上述输出可以看出:
1. 备份的核心是SELECT /*!40001 SQL_NO_CACHE */ * FROM `test1`语句。
该语句会查询到表test1的所有数据,在备份文件中会生成相应的insert语句。
其中SQL_NO_CACHE的作用是查询的结果并不会缓存到查询缓存中。
2. SHOW CREATE DATABASE IF NOT EXISTS `test`,show create table `test1`
生成创库语句和创表语句。
3. SHOW TRIGGERS LIKE 'test1'
可以看出,如果不加-R参数,默认是会备份触发器的。
4. SHOW FUNCTION STATUS WHERE Db = 'test'
SHOW CREATE FUNCTION `mycat_seq_currval`
SHOW PROCEDURE STATUS WHERE Db = 'test'
用于备份存储过程和函数。
5. 设置SAVEPOINT,然后备份完每个表后再回滚到该SAVEPOINT。
不知道为什么要这么设置,感觉这样完全没必要,
因为前面通过START TRANSACTION WITH CONSISTENT SNAPSHOT开启的事务只能通过commit或者rollback来结束,而不是ROLLBACK TO SAVEPOINT sp。
总结:
1. mysqldump的本质是通过select * from tab来获取表的数据的。