某金融公司有套系统最近刚迁移完,从 5.6 迁移到 5.7.30,并且在迁移前未开启 GTID,迁移后开启了 GTID 相关功能。业务按照以往的方式使用 CREATE TABLE ... SELECT ...
导数据的时候出现报错:Error Code:1786 (HY000): Mysql Statement violates GTID consistency: CREATE TABLE ... SELECT
。
这个问题比较简单,原因就是迁移后的 MySQL5.7 使用了 GTID,开启了 enforce_gtid_consistency
参数(GTID 强一致性)。
为保证分布式事务的一致性,MySQL 使用 GTID 来唯一标识一个事务。在 GTID 模式下,DDL 和 DML 语句会自动产生不同的 GTID 来标识不同的事务操作。但是 CREATE TABLE ... SELECT ...
只生成了一个 GTID,将 DDL 和 DML 操作合并为一个事务执行,这在语句执行失败时,会造成主从数据不一致。开启 enforce_gtid_consistency
参数就是为了 GTID 事务的原子性。
官方文档也有对 CREATE TABLE ... SELECT ...
这一操作的说明:
为了安全,不建议关闭这个参数。
在 MySQL5.7 上可以用拆分成两句 SQL 的方式,解决这个问题,比如:
#先创建表
CREATE TABLE ... LIKE...
#再插入数据
INSERT INTO ... SELECT ...
虽然之前的单条 SQL 能简单快速的导数到另一张表,但为了安全可以适当麻烦一点。
好消息是从 MySQL8.0.21 开始,支持原子 DDL 的存储引擎允许使用 CREATE TABLE ... SELECT ...
语句了。
本文关键字:#MySQL# #GTID# #事务#
技术分享 | 一个案例总结 MongoDB 与 Redis 主从同步问题
技术分享 | 如何避免 RC 隔离级别下的 INSERT 死锁
10月21日,OceanBase 社区走进 vivo 在深圳站举办,邀请大家共享主题为《国产数据库在多场景的应用实践与探索》的技术实践交流活动 ,与大家共同探讨国产数据库在不同行业、不同企业、不同应用场景下的实践经验和发展前景。此外,我们还邀请了国内数据库领域的技术专家和企业代表,他们将分享国产数据库的研发现状、应用案例,将为大家带来一场关于数据库领域的思考盛宴,带给您无限的启发。
爱可生解决方案架构师-刘世红,将在闪电演讲环节为大家带来《ActionDB助力企业国产数据库的升级》。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!