为什么MyISAM需要在备份时使用读锁定而Innodb不需要

时间:2016-04-26 08:21:50

标签: mysql innodb myisam

请帮助我理解为什么需要READ锁来保持数据一致性,而使用MyISAM表和InnoDB表进行备份时,备份时不需要READ锁。

1 个答案:

答案 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   检索表内容以获取不正确的内容或失败。