2)--lock-all-tables 它请求发起一个全局的读锁,会阻止对所有表的写入操作(insert,update,delete),以此来确保数据的一致性。备份完成后,该会话断开,会自动解锁。
3)--single-transaction 和 --master-data 结合使用时,也是在开始时,会短暂的请求一个全局的读锁,会阻止对所有表的写入操作。
4)--single-transaction 单独使用,不会有任何锁。但是测试表明: 它也需要对备份的表持有 metadata lock 的共享锁。
而我们知道,一般的事务,持有的是 行锁,还有 metadata lock 的共享锁。所以实际上,mysqldump不论你使用哪些选项,都不会阻塞事务的执行。
因为它们对锁的申请,没有任何排它性。而不像DDL一样需要持有 metadata lock 上的独占锁(排它锁)。当然DDL也会阻塞mysqldump。
mysqldump 一定需要表上的 metadata lock 共享锁。然后,要么需要所有备份表上的local读锁(lock table tb1 read local),要么需要的是所有备份表上的全局读锁(FLUSH TABLES WITH READ LOCK;)。