请帮助我理解为什么需要READ锁来保持数据一致性,而使用MyISAM表和InnoDB表进行备份时,备份时不需要READ锁。
答案 0 :(得分:1)
造成这种差异的原因是myisam既没有事务,也没有行级锁定。只有表级锁定可用。虽然innodb支持事务和行级锁,但提供了表锁的替代方法。但是,您可以选择在备份之前读取锁定innodb表,这取决于您。
正如backup methods上的mysql手册在myisam上说的那样:
FLUSH TABLES tbl_list WITH READ LOCK;
你只需要一个读锁;这使其他客户能够继续 在制作文件的副本时查询表格 数据库目录。需要刷新以确保全部活动 在开始备份之前,索引页将写入磁盘。
在innodb上,您不必锁定整个表以获得一致的数据读取,因为使用适当的事务隔离模式并使用单个事务,这由innodb引擎确保。结果就像你锁定表一样,但你有更好的并发性。
同样,上述链接文档解释了:
对于InnoDB表,可以使用mysqldump的--single-transaction选项执行不对表进行锁定的在线备份。
有关单一交易选项的文档包含更多详细信息:
此选项将事务隔离模式设置为REPEATABLE READ,并在转储数据之前向服务器发送START TRANSACTION SQL语句。它仅对InnoDB等事务表有用,因为它在发出START TRANSACTION时转储了数据库的一致状态,而没有阻塞任何应用程序。
使用此选项时,您应该记住只有InnoDB 表以一致的状态转储。例如,任何MyISAM或 使用此选项时转储的MEMORY表可能仍会更改状态。
正在进行--single-transaction转储,以确保有效 转储文件(正确的表格内容和二进制日志坐标),没有 其他连接应使用以下语句:ALTER TABLE, CREATE TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE。一致的 read不与这些语句隔离,因此在表上使用它们 要转储可以导致mysqldump执行的SELECT 检索表内容以获取不正确的内容或失败。