17.1.2.3 Determination of Safe and Unsafe Statements in Binary Logging 确定安全和不安全的语句在Binary logging里

语句的”安全” 在MySQL 复制,值得是语句以及它的影响是否可以被复制正确的使用基于语句的格式,

如果语句是正确的,我们指的的是语句是安全的,否则我们认为是不安全的。

在一般情况下, 一个语句是安全的如果确定的话, 如果不是就是吧u安全的。

然而,某些不确定的函数可以导致不安全(see Nondeterministic functions not considered unsafe, later in this section)

此外,使用浮点数据类型函数是依赖硬件的 总是认为不安全的。

安全和不安全语句的处理,一个语句是不同的处理依赖语句是否安全,相对于2进制的格式。

当使用基于行的记录时,对待安全或者不安全的语句没有区别。

当使用混合格式记录时,语句比较作为安全是记录的使用基于行的格式,语句被认为是安全的是使用基于语句格式的记录。

当使用基于语句记录时, 语句标记为不安全的 会产生警告的效果,安全的语句通常被记录:

每个语句标记为不安全产生一个警告,以前,如果大量的这样的语句被执行在Master上,

这个会导致产生大量的错误日志,为了防止这种情况,MySQL 提供一个告警的抑制机制 (introduced in MySQL 5.6.7),

主要表现如下:

最近50个ER_BINLOG_UNSAFE_STATEMENT 警告已经生成超过50次在任何50秒周期内,

告警被激活时,这会导致这样的告警不会写入到错误日志。代替的是,对于这种类型的每50次告警,

一个注意 最后的警告被重复N次在最后的S秒被写入到错误日志。

语句认为是不安全的,下列特性的语句被认为是不安全的:

语句包含下面的系统函数,在slave上可能返回不同的值:

这些函数包括:

FOUND_ROWS(), GET_LOCK(), IS_FREE_LOCK(), IS_USED_LOCK(), LOAD_FILE(), MASTER_POS_WAIT(), PASSWORD(), RAND(),

RELEASE_LOCK(), ROW_COUNT(), SESSION_USER(), SLEEP(), SYSDATE(), SYSTEM_USER(), USER(), UUID(), and UUID_SHORT

().

不确定的韩式不认为是不安全的,监管那些韩式不不确定,他们人就认为是安全:

CONNECTION_ID(), CURDATE(), CURRENT_DATE(), CURRENT_TIME(), CURRENT_TIMESTAMP(), CURTIME(),, LAST_INSERT_ID(),

LOCALTIME(), LOCALTIMESTAMP(), NOW(), UNIX_TIMESTAMP(), UTC_DATE(), UTC_TIME(), and UTC_TIMESTAMP()

系统变量引用,很多的系统变量是不能被正确的复制使用基于语句格式的。

UDF,既然我们无法控制UDF做什么,我们必须假设它是执行不安全的语句:

触发器或者存储过程更新一个表有一个AUTO_INCREMENT 列,这是不安全的因为更新记录的顺序在master和slave上可能不同。

延迟插入语句,这个语句被认为是不安全的 因为插入的记录可能交织并发执行的语句。