首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么MyISAM需要读锁而备份和Innodb不需要

为什么MyISAM需要读锁而备份和Innodb不需要
EN

Stack Overflow用户
提问于 2016-04-26 08:21:49
回答 1查看 837关注 0票数 0

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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检索表内容以获得不正确的内容或失败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36859234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档