【问题标题】:mysql replication - table locking?mysql 复制 - 表锁定?
【发布时间】:2008-10-22 15:52:00
【问题描述】:

我目前在一家拥有运行 mysql/php 的网站的公司工作(所有表也使用 MISAM 表类型)。

我们想实现复制,但我在 mysql 文档和 Internet 上的其他地方读到,这将在写入二进制日志(从属 dbs 最终从中读取)时锁定表。

这些锁是否会在写入量很大的实时站点上引起问题?另外,有没有一种方法可以在不必锁定表的情况下启用复制?

【问题讨论】:

    标签: mysql replication locking myisam


    【解决方案1】:

    如果您将表类型更改为 innodb,则会使用行级锁定。此外,您的复制将更加稳定,因为更新将是事务性的。 MyISAM 复制是一个长期的痛苦。

    确保您的服务器版本匹配,并且始终确保在关闭从属服务器之前关闭主服务器。您可以在关闭从属服务器后立即重新启动主服务器,但您必须将其关闭。

    此外,请确保为 InnoDB 使用适当的自动扩展选项。而且,当您使用它时,您可能希望从 float 和 double 迁移到“decimal”(这意味着 mysql 5.1)。这将为您省去一些复制方面的麻烦。

    这可能比您要求的要多一些。享受吧。

    P.s.,是的,myisam 锁可能会导致问题。此外,innodb 比 myisam 慢,除非 myisam 阻塞了一个巨大的选择。

    【讨论】:

    • 哦,你可以执行一些 SQL 来关闭主服务器上的复制,然后轮询从服务器上的状态,直到它们赶上,然后关闭它们。
    【解决方案2】:

    根据我在编写大量写入站点的 DBA 的经验,编写二进制日志不会在主服务器上增加可察觉的锁定或性能问题。如果您想对其进行基准测试,只需打开二进制日志即可。我真的不认为表被锁定以将查询写入二进制日志。

    slave 上的表锁定是另一回事。复制是串行的:每个查询在从属运行下一个查询之前运行完成。如此长的更新将导致复制暂时落后。如果您的应用程序打算使用复制进行横向扩展,它需要知道如何适应这种情况。

    【讨论】:

      【解决方案3】:

      myisam 表类型的解决方案并不是“更好”。但是,您可以忍受它。

      您能做的最好的事情是确保您的从属服务器和主服务器在相同的硬件上运行(FPU 差异会导致复制错误),以及确保您在 MySQL 服务器上运行相同的版本号。

      以下链接回答您的问题。具体来说,如果没有删除操作,MyISAM 表中的锁阻塞写入的机会较小。因此,其中没有删除孔的表在复制设置中的执行速度会更快。

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

      您可以通过在计划的停机时间(尤其是在批量删除之后)定期进行 DBA 导出/导入来减轻“漏洞”的影响。此外,请确保您的从数据库不会在主数据库仍在运行的情况下出现故障。这将为您节省很多很多问题。

      【讨论】:

      • 实际上,innodb 也可能发生 FPU 差异复制错误,任何使用 float 或 double 的表列。您将看到的确切错误(千分之一)是列宽差异错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多