【问题标题】:binlog_format = STATEMENT and CURRENT_TIMESTAMP with MySQL replicationbinlog_format = STATEMENT 和 CURRENT_TIMESTAMP 与 MySQL 复制
【发布时间】:2010-05-18 22:07:52
【问题描述】:

当 binlog_format 设置为 STATEMENT 并且我们插入如下内容时,MySQL 从属实例是否可以为同一 ID 具有不同的行值:

insert into foo values(CURRENT_TIMESTAMP)

据我了解,slave 读取 SQL 语句并执行它,因此,如果复制滞后,可能会导致同一行的差异。对还是错?

我怎样才能避免这种情况?

谢谢。

【问题讨论】:

    标签: mysql replication


    【解决方案1】:

    您的方法在语句级复制中是完全安全的。 TIMESTAMP 被写入二进制日志,因此CURRENT_TIMESTAMP 的值将在主从之间保持一致,即使从属落后。出于同样的原因,您也可以安全地使用NOW() 函数。

    要避免的函数是SYSDATE(),它不会使用二进制日志中的TIMESTAMP,因此slave的值将代表语句在slave上运行的时间,而不是语句在master上运行的时间。

    【讨论】:

    • 好的。知道了。使用基于 STATEMENT 的复制时,所有非确定性函数(无论我们如何命名函数)都是不好的。如果我没看错的话,我们应该选择 MIXED 或 full ROW 复制。前者有我的偏好,因为它可以结合两个世界的优点。谢谢!
    • 在某些情况下,有一些方法可以使非确定性函数与语句级复制一起工作。我使用 MySQL 5.0,所以语句级复制是我唯一的选择。如果我想从一个非确定性函数中插入一个值,我只需先将它分配给一个局部变量,然后它就会被正确复制。例如,我使用set @uuid = uuid(); insert into test.uuids values(@uuid); 代替insert into test.uuids values(uuid()); 以在主数据库和从数据库上获得相同的值。
    猜你喜欢
    • 2011-06-26
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2014-12-12
    • 2011-06-21
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多