Error number: MY-013100; Symbol: ER_RPL_GTID_UNSAFE_STMT_ON_TEMPORARY_TABLE; SQLSTATE: HY000
Message: Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context. These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.
错误说明
MY-013100,ER_RPL_GTID_UNSAFE_STMT_ON_TEMPORARY_TABLE 错误是MySQL在执行过程中报出的,这个错误主要指的是MySQL在处理带有GTID的MySQL复制时,会报出的一个错误。表明在复制的主服务器和备份服务器之间在不安全的语句操作临时表,这是非常不安全的。
SQLSTATE码是 HY000,这是MySQL的最高级判定错误。在MySQL 5.7以上,会在执行不安全语句操作临时表时报出此错误, MyISAM临时表,和其他表类型将会以普通模式进行操作,这样会导致GTID复制不安全,产生此错误。
常见案例
当用户在执行delete或者update等语句操作临时表时,就会出现此错误。以其它mysql引擎临时表为例,比如说MyISAM类型的临时表,更新语句update语句会导致复制变为不安全,此时gtid会报出此错误。
解决方法
1. 首先确定错误报出的原因是因为不安全语句操作临时表,所以应该避免在临时表上执行不安全的更新或删除操作。比如说可以把不安全的更新操作改成从临时表中查询,然后存储在临时变量中,再进行更新操作。
2. 由于复制的不安全是由于MyISAM类型的临时表导致的,因此可以把MyISAM类型的临时表改成其他的类型,如InnoDB,其它内存类型的表,比如MEMORY,Federated等类型的表。这样也可以解决复制不安全的问题。
3. 如果想要把复制变为安全,可以使用函数SKIP_GTID()函数,该函数应用于复制会话,可以让用户对复制进行控制,如果在该复制会话中不想使用GTID,可以用这个函数作为复制的转换。
总结,MY-013100 ER_RPL_GTID_UNSAFE_STMT_ON_TEMPORARY_TABLE是MySQL在执行带GTID复制时出现的错误,该错误主要是由于用户在复制的主服务器和备份服务器之间在不安全的语句操作临时表,应通过避免不安全的操作语句和临时表类型,使用SKIP_GTID函数来解决复制不安全问题。