AWS RDS 复制如何处理 curdate() 和其他日期敏感型命令?



看起来AWS通过在副本上执行与在主服务器上执行的相同命令来处理RDS MySQL复制。但是,由于数量庞大,我们的副本目前滞后了大约 24 小时。

复制过程如何处理以下命令:

create table x as select * from y where ts > curdate()

它需要做一些相当聪明的事情,否则在主副本和副本上创建的表会因为执行时curdate()具有不同的值而有所不同?

嗯,在这里回答我自己的问题。

https://dev.mysql.com/doc/refman/5.7/en/replication-rbr-safe-unsafe.html 的MySQL手册是这样说的:

声明被认为是不安全的。 包含以下内容的语句 特征被认为是不安全的:

包含可能返回不同 从属值。 这些函数包括 FOUND_ROWS()、GET_LOCK()、 IS_FREE_LOCK(), IS_USED_LOCK(), LOAD_FILE(), MASTER_POS_WAIT(), 密码(), 兰德(), RELEASE_LOCK(), ROW_COUNT(), SESSION_USER(), SLEEP()、SYSDATE()、SYSTEM_USER()、USER()、UUID() 和 UUID_SHORT()。

非确定性函数不被视为不安全。 虽然这些 函数不是确定性的,它们被视为安全的目的 日志记录和复制数量: CONNECTION_ID(), CURDATE(), CURRENT_DATE(), CURRENT_TIME(), CURRENT_TIMESTAMP(), CURTIME(),, LAST_INSERT_ID(), LOCALTIME(), LOCALTIMESTAMP(), NOW(), UNIX_TIMESTAMP()、UTC_DATE()、UTC_TIME() 和 UTC_TIMESTAMP()。

然后它说

有关更多信息,请参见第 16.4.1.15 节 "复制和系统 功能"。

该链接部分没有具体解释为什么curdate()是安全的,但它确实解释了NOW()是安全的,因为the binary log includes the timestamp. This means that the value as returned by the call to this function on the master is replicated to the slave。据推测,其他与日期相关的命令的工作方式相同。对我来说已经足够好了。

最新更新