MySQL复制-表锁定?

9
我目前在一家公司工作,该公司的网站运行mysql/php(所有表格也都使用MYISAM表格类型)。
我们想要实现复制,但我在mysql文档和互联网上的其他地方读到,这将在写入二进制日志时锁定表格(从中读取的从数据库)。
这些锁会对一个相当写入密集的现场造成问题吗?此外,有没有一种方法可以在不锁定表格的情况下启用复制?
3个回答

6
如果您将表类型更改为innodb,则使用行级锁定。此外,更新将是事务性的,因此您的复制将更加稳定。MyISAM复制会带来长期痛苦。
请确保您的服务器版本匹配,并始终确保在关闭从服务器之前关闭主服务器。您可以立即重新启动主服务器,但必须将其关闭。
此外,请确保为InnoDB使用适当的自动扩展选项。在此过程中,您可能需要远离浮点数和双精度转换为“十进制”(这意味着mysql 5.1)。这将为您节省一些复制头疼。
这可能比您要求的多一点。享受吧。
附注,是的,myisam锁可能会引起问题。此外,除非myisam阻塞了一个巨大的选择,否则innodb比myisam慢。

哦,可能有一些SQL可以在主服务器上执行以关闭复制,然后轮询从服务器的状态直到它们追上来,然后再关闭它们。 - Chris

4

根据我的经验,在管理写入量较大的网站时,在主服务器上编写二进制日志不会对锁定或性能造成任何可察觉的问题。如果您想进行基准测试,只需打开二进制日志记录。我真的不认为在将查询写入二进制日志时会锁定表。

然而,在从服务器上,表锁定则是另一回事。复制是串行的:每个查询在从服务器执行下一个查询之前必须完成。因此,长时间的更新将导致复制暂时滞后。如果您的应用程序计划使用复制进行扩展,则需要知道如何适应这种情况。


0

使用myisam表类型的解决方案并不是“更好的”。但是,你可以使用它。

最好的方法是确保你的从服务器和主服务器在相同的硬件上运行(FPU差异可能会导致复制错误),并确保你在MySQL服务器上运行相同的版本号。

以下链接回答了你的问题。具体来说,如果没有删除操作,MyISAM表中的锁定就不太可能阻止写入。因此,在复制设置中,没有删除空间的表将执行得更快。

http://dev.mysql.com/doc/refman/5.1/en/internal-locking.html

您可以通过在计划的停机时间(特别是在大量删除之后)定期进行 DBA 导出/导入来减轻“空洞”的影响。此外,请确保从数据库不会在主数据库仍在运行时关闭。这将为您节省许多问题。


实际上,FPU差异复制错误也可能发生在InnoDB上,任何使用float或double的表列都可能出现。你会看到的确切错误是列宽度差异错误(在成千上万次中的一次)。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接