Error number: MY-013098; Symbol: ER_RPL_GTID_UNSAFE_STMT_ON_NON_TRANS_TABLE; SQLSTATE: HY000
Message: Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
。
MY-013098; ER_RPL_GTID_UNSAFE_STMT_ON_NON_TRANS_TABLE; HY000是MySQL在执行非事务性表上的GTID(全局事务标识符)不安全的语句时报出的错误代码。 这条错误提示要求使用具有GTID的语句进行复制时,所有表必须存在于事务或是innodb引擎中,以满足GTID日志格式和数据完整性要求。
错误说明:
当在非事务表上运行具有GTID(全局事务标识符)的不安全语句时,将收到MY-013098; ER_RPL_GTID_UNSAFE_STMT_ON_NON_TRANS_TABLE; HY000的错误提示,表明使用具有GTID的语句进行复制时,需要所有表都在一个事务或innodb引擎中,以满足GTID日志格式和数据完整性的要求。
在MySQL的复制环境中,使用具有GTID的不安全语句(如 insert、update、delete、Create Table等)对非事务表(如MyISAM引擎表)中的数据进行操作时,可能会触发此错误:MY-013098; ER_RPL_GTID_UNSAFE_STMT_ON_NON_TRANS_TABLE; HY000。此外,当一个语句中存在多个表时,其中某个表为非事务表时,也会返回此错误。
解决方法:
需要注意的是,在使用MySQL复制时,需要在一个事务中使用GTID,或将表定义到innodb引擎中,以保证事务中对表的更改与GTID日志格式兼容。如,我们可以在使用insert、update、delete、Create Table等语句时,在操作之前显式的开启一个事务块:
Begin;
Insert into YourTableName …;
Commit;
也可以使用Alter Table命令将表的引擎更改为InnoDB,指定它们将运行在事务中:
Alter Table YourTableName engine = InnoDB;
我们还可以停用复制协调器(replication coordinator),也就是停止复制线程,以避免GTID不安全的语句在复制环境中执行:
STOP SLAVE;
重新开始复制后,请检查发生错误的语句,确保将它们运行在一个事务中,或者针对innodb引擎的表。