问题:数据库偶尔有延迟问题, 经常对业务造成困扰。
环境:mysql5.7,mycat
目标:开启MTS
结果:开启失败,还原之前配置
失败原因:
: General error: 1785 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
以下是官方给出的解释:
https://dev.mysql.com/doc/refman/5.7/en/replication-options-gtids.html
https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-restrictions.html
- 涉及非事务性存储引擎的更新。 网上说的最多的问题。数据库主表和从表引擎不一致
- CREATE TABLE … SELECT使用基于 GTID 的复制时不允许使用语句。
- 临时表。 使用 GTID 时,事务、过程、函数和触发器内部不支持CREATE TEMPORARY TABLE和 DROP TEMPORARY TABLE语句 。
- 防止执行不受支持的语句。 为了防止执行会导致基于 GTID 的复制失败的语句,所有服务器必须–enforce-gtid-consistency在启用 GTID 时使用该 选项启动。
- 跳过交易。 sql_slave_skip_counter使用 GTID 时不支持。
- 忽略服务器。 CHANGE MASTER TO使用 GTID 时不推荐使用语句 的 IGNORE_SERVER_IDS 选项,因为已应用的事务将被自动忽略。
- GTID 模式和 mysqldump。 如果目标服务器的二进制日志中没有 GTID ,则可以将使用mysqldump制作的转储导入 到启用了 GTID 模式的 MySQL 服务器中。
- GTID 模式和 mysql_upgrade。 当服务器在启用 ( gtid_mode=ON)全局事务标识符 (GTID) 的情况下运行时,不要通过mysql_upgrade (–write-binlog 选项)启用二进制日志记录。
总结:
由于有专门的DBA,无法环境数据库真实环境,查问题,顾只能贴资料。
解决方案:
- 类似这种升级,需要提前规划好,就是搭建集群的时候一开始并开启相关配置避免这种问题
- 如果需要在当前环境升级,搭建一套虚拟环境模拟真实环境,然后先在测试环境上填坑。 完成后在尝试线上。失败后马上恢复,再把问题复现到测试环境,解决后,再线上尝试。我们的DBA大哥显然没这么做。