请帮助我理解为什么需要读锁来保持数据一致性,而使用MyISAM表和InnoDB表进行备份时不需要读锁。
发布于 2016-04-26 09:33:50
造成这种差异的原因是myisam既没有事务,也没有行级锁定。只有表级锁定可用。虽然innodb同时支持事务和行级锁,但它提供了表锁的替代方案。但是,您可以选择在备份之前读取锁定无害数据库表,这取决于您。
正如mysql关于备份方法的手册在myisam上说的那样:
具有读锁的同花顺表tbl_list; 您只需要一个读锁;这使其他客户端能够在数据库目录中复制文件时继续查询表。需要进行刷新,以确保在启动备份之前将所有活动索引页写入磁盘。
在innodb上,您不必锁定整个表才能获得数据的一致读取,因为使用适当的事务隔离模式和使用单个事务,这是由innodb引擎确保的。结果就像锁定了表一样,但是并发性更好。
同样,上述链接文件也解释了:
对于InnoDB表,可以使用mysqldump的--单事务选项执行不需要对表进行锁定的在线备份。
关于单事务选项的文档包含更多详细信息:
此选项将事务隔离模式设置为可重复读取,并在转储数据之前将开始事务SQL语句发送到服务器。它只对事务性表(如InnoDB )有用,因为在发出START事务时,它会转储数据库的一致状态,而不会阻塞任何应用程序。 在使用此选项时,应记住只有InnoDB表处于一致状态。例如,使用此选项时转储的任何MyISAM或内存表仍可能更改状态。 当一个单事务转储正在进行中时,为了确保一个有效的转储文件(正确的表内容和二进制日志坐标),其他任何连接都不应该使用以下语句: ALTER、CREATE、DROP、RENAME TABLE、TRUNCATE。一致的读取不会与这些语句分离,因此在要转储的表上使用它们会导致mysqldump执行的SELECT检索表内容以获得不正确的内容或失败。
https://stackoverflow.com/questions/36859234
复制相似问题