DBAtlas · 数据库运维图谱

1592: ER_BINLOG_UNSAFE_STATEMENT: Unsafe statement written to the binary log(不安全的语句被写入二进制日志)

MySQL

含义

在使用基于 STATEMENT 的 binlog 格式时,执行了结果不确定的语句(在副本上可能产生不同结果)。由于源与副本之间存在数据不一致的风险,MySQL 在将其写入 binlog 时发出警告。

原因

在 binlog_format=STATEMENT 下:UUID()、SYSDATE() 或 USER() 等不确定性函数(NOW() 在 STATEMENT 下可安全复制)、带 LIMIT 但没有 ORDER BY 的 UPDATE/DELETE、与 AUTO_INCREMENT 混用的 INSERT,或某些用户自定义/系统函数。这些语句不一定在每台服务器上产生相同结果。

解决方法

将 binlog 格式切换为基于行(推荐;自 MySQL 5.7.7 起 ROW 为默认值):在 my.cnf 中设置 binlog_format=ROW 或 SET PERSIST binlog_format = ROW;(binlog_format 变量自 8.0.34 起已弃用;更改对新会话生效)。ROW 格式可安全复制不确定性语句。如果必须保留 STATEMENT,用常量值替换不确定性函数/表达式,并为带 LIMIT 的 DML 添加确定性的 ORDER BY。

在 DBAtlas 中打开 →

同一数据库的其他条目