MySQL内部手册/.../ 不安全的语句

19.4.2安全声明

注:以下列表不完整;它没有考虑2010年或以后(大致)的变化。

语句可以标记为不安全的.如果binlog_format=MIXED,不安全的语句将以行格式记录,如果binlog_format= statement将生成警告。

以下类型的子语句目前被标记为不安全的:

  • 可能在slave上返回不同值的系统函数,包括:FOUND_ROWS, GET_LOCK, IS_FREE_LOCK, IS_USED_LOCK, LOAD_FILE, MASTER_POS_WAIT, RAND, RELEASE_LOCK, ROW_COUNT, SESSION_USER, SLEEP, SYSDATE, SYSTEM_USER, USER, UUID, UUID_SHORT。

    注意:以下非确定性函数未被标记为不安全:

    • CONNECTION_ID (Query_log_events包含连接号)

    • CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURTIME, LOCALTIME, LOCALTIMESTAMP, NOW, UNIX_TIMESTAMP, UTC_DATE, UTC_TIME, UTC_TIMESTAMP (Query_log_event包含时区和语句执行时的时间)

    • LAST_INSERT_ID(在Intvar_log_event中复制)

    还要注意,大多数浮点数学函数将返回与硬件相关的结果。我们不认为这样的函数不安全,因为我们只支持使用相同浮点数学的平台之间的复制。

  • 系统变量,一些例外列在混合二进制日志格式

  • UDF:由于我们无法控制UDF做什么,它可能正在做一些不安全的事情。

  • 从具有自动递增列的表的子语句进行更新。这是不安全的,因为Intvar_log_event只能保存一个表的自动增量值。

  • INSERT延迟,因为插入的行可能与并发执行的语句交错。

  • 使用LIMIT进行更新,因为没有指定检索行的顺序。

  • 引用系统日志表的语句,因为这些表的内容在主和从之间可能不同。

  • 非事务性读或写在事务中的事务性读或写之后执行(参见第19.4.3节,“记录事务”).

  • 读取或写入自日志表,以及在同一事务中读取或写入自日志表后执行的所有语句。

以下措施尚未实施: