我目前正在为一家运行mysql / php网站的公司工作(所有表格也使用MYISAM表类型)。
我们希望实现复制,但是我已经读过mysql文档和互联网上的其他地方,这会在写入二进制日志(从属dbs最终将从中读取)时锁定表。
这些锁会导致现场网站出现问题吗?另外,有没有办法在不必锁定表的情况下启用复制?
答案 0 :(得分:6)
如果将表类型更改为innodb,则使用行级锁定。此外,您的复制将更加稳定,因为更新将是事务性的。 MyISAM复制是一个长期的痛苦。
确保您的服务器版本匹配,并且务必在关闭从站之前关闭主服务器。关闭奴隶后,你可以立即重新启动主人,但你必须把它取下来。
另外,请确保为InnoDB使用适当的自动扩展选项。而且,当你在它的时候,你可能想要从float和double迁移到'decimal'(这意味着mysql 5.1。)这将为你节省一些复制麻烦。
这可能比你要求的要多一些。享受。
P.s。,是的,myisam锁可能会导致问题。此外,innodb比myisam慢,除非myisam阻止大量选择。
答案 1 :(得分:4)
根据我的经验,DBAing一个写得很大的站点,编写二进制日志不会在主上锁定或执行时出现可察觉的问题。如果要对其进行基准测试,只需打开二进制日志即可。我真的不认为表被锁定以将查询写入二进制日志。
slave 上的表锁定是另一回事。复制是串行的:每个查询在从属运行下一个查询之前运行完成。如此长时间的更新将导致复制暂时落后。如果您的应用程序打算使用复制进行横向扩展,则需要知道如何适应这种情况。
答案 2 :(得分:0)
myisam表类型的解决方案并不“更好”。但是,你可以顺其自然。
您可以做的最好的事情是确保您的slave和master在同一硬件上运行(FPU差异可能会产生复制错误),并确保您在MySQL服务器上运行相同的版本号。
以下链接可以回答您的问题。具体来说,如果没有删除,MyISAM表中的锁具有阻止写入的可能性较小。因此,在其中没有删除漏洞的表将在复制设置中执行得更快。
http://dev.mysql.com/doc/refman/5.1/en/internal-locking.html
您可以通过在计划的停机时间内定期进行DBA导出/导入来缓解“漏洞”的影响(特别是在批量删除之后)。另外,请确保您的从属数据库不会在主服务器仍在运行时停机。这将为您节省很多很多问题。