整个过程,没有任何锁。RR隔离级别保证在事务中只读取本事务之前的一致性的数据。 rollback to savepoint sp; 保证了对数据库中的数据没有影响。
4)--master-data 的实现:
先执行:mysqldump -uroot -p --databases gs --master-data=1 > gs_l.sql,在查看general.log:
151022 14:57:45 6 Connect root@localhost on 6 Query /*!40100 SET @@SQL_MODE='' */ 6 Query /*!40103 SET TIME_ZONE='+00:00' */ 6 Query FLUSH /*!40101 LOCAL */ TABLES 6 Query FLUSH TABLES WITH READ LOCK 6 Query SHOW VARIABLES LIKE 'gtid\_mode' 6 Query SHOW MASTER STATUS
发现了 --lock-all-tables一样,就多了一句:show master status;
5)--single-transaction 和 --master-data 结合使用:
先执行:mysqldump -uroot -p --databases gs --master-data=1 > gs_l.sql,在查看general.log:
151022 15:00:56 7 Connect root@localhost on 7 Query /*!40100 SET @@SQL_MODE='' */ 7 Query /*!40103 SET TIME_ZONE='+00:00' */ 7 Query FLUSH /*!40101 LOCAL */ TABLES 7 Query FLUSH TABLES WITH READ LOCK 7 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ 7 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ 7 Query SHOW VARIABLES LIKE 'gtid\_mode' 7 Query SHOW MASTER STATUS 7 Query UNLOCK TABLES ...... 7 Init DB gs 7 Query SHOW CREATE DATABASE IF NOT EXISTS `gs` 7 Query SAVEPOINT sp 7 Query show create table `tb1` 7 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `tb1` 7 Query ROLLBACK TO SAVEPOINT sp 7 Query show create table `user` 7 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `user` 7 Query ROLLBACK TO SAVEPOINT sp 7 Query RELEASE SAVEPOINT sp 7 Quit
发现 --single-transaction 单独使用 与 --single-transaction 和 --master-data 结合使用 的区别如下图:
--single-transaction 和 --master-data 结合使用时,在导出开始,会短暂的持有一个全局的读锁,锁定时:刷新数据到磁盘、设置隔离级别为RR、开始事务、输出 binary log 的位置和文件名,然后解锁。这样就保证了:show master status 输出的 binary log 的位置和文件名 和 后面 导出的数据是同一个时间点的(同一个lsn),所以才能使用该备份 和 利用 change master to 构造一个 slave,成功的连接上 master.
可以看到这里使用了两次 flush tables:
FLUSH /*! 40101 LOCAL */ TABLES
FLUSH TABLES WITH READ LOCK
其原因是 第一次 flush 是不需要锁表的,第一次将所有数据刷新到磁盘之后,第二次 FLUSH TABLES WITH READ LOCK 时就会只有很少量的数据需要刷新到磁盘,所以第一次 flush 是为了尽量的 减少 第二次 fush 持有锁的时间。
11. mysqldump 与 锁
1)--lock-tables 会在整个导出过程 lock read local 所有的表。该锁不会阻止其它session读和插入,但是显然阻塞了update。