1 mysqldump导出数据主要有两种控制:一种是导出的全过程都加锁 lock-all-tables, 另一种则是不加。前者会在导出开始时执行 FLUSH TABLES WITH READ LOCK; 也就是加全局读锁,会阻塞其它写操作,以保证导出是一致性的;因此只有在导出测试数据时或导出时没有业务连接操作时可不加 lock-all-tables . 至于说一致性导出的另一种方式 single-transaction, 则是有适用范围的,见下边。 2 single-transaction 选项和 lock-all-tables 选项是二选一的,前者是在导出开始时设置事务隔离状态并使用一致性快照开始事务,而后马上unlock tables,然后执行导出,导出过程不影响其它事务或业务连接,但只支持类似innodb多版本特性的引擎,因为必须保证即使导出期间其它操作(事务点t2)改变了数据,而导出时仍能取出导出开始的事务点t1时的数据。而lock-all-tables则一开始就 FLUSH TABLES WITH READ LOCK; 加全局读锁,直到dump完毕。 -- 关于一致性快照,简单地说,就是通过回滚段能记录不同的事务点的各版本数据 -- single-transaction 的流程如下: SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ SHOW MASTER STATUS -- 这一步就是取出 binlog index and position UNLOCK TABLES ...dump... 3 master_data 选项开启时默认会打开lock-all-tables,因此同时实现了两个功能,一个是加锁,一个是取得log信息。 master_data取1和取2的区别,只是后者把 change master ... 命令注释起来了,没多大实际区别; 4 当master_data和 single_transaction 同时使用时,先加全局读锁,然后设置事务一致性和使用一致性快照开始事务,然后马上就取消锁,然后执行导出。过程如下 FLUSH TABLES WITH READ LOCK SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ SHOW MASTER STATUS -- 这一步就是取出 binlog index and position UNLOCK TABLES ...dump... 5 总结,了解了这些选项作用后,使用起来就明确了. 如果需要binlog信息则使用 master_data; 如果不想阻塞同时表是innodb引擎可使用 single-transaction 取得一致性快照(取出的数据是导出开始时刻事务点的状态) 如果表不支持多版本特性,则只能使用 lock-all-tables 阻塞方式来保证一致性的导出数据。 当然,如果能保证导出期间没有任何写操作,可不加或关闭 lock-all-tables 博主注:当同时指定 --lock-all-tables和--single-transaction参数时,后者不会生效,因为前者会自动关闭--single-transaction和--lock-tables参数,具体可以查看man mysqldump中有详细说明 --lock-all-tables, -x Lock all tables across all databases. This is achieved by acquiring a global read lock for the duration of the whole dump. This option automatically turns off --single-transaction and --lock-tables.
转载于:https://blog.51cto.com/kusorz/1783684