MySQL 遷移后無法快速導數(shù)據(jù)問題解決
背景
關于 5.6 升級到 5.7 之后,GTID 的相關功能的注意事項。
某金融公司有套系統(tǒng)最近剛遷移完,從 5.6 遷移到 5.7.30,并且在遷移前未開啟 GTID,遷移后開啟了 GTID 相關功能。業(yè)務按照以往的方式使用 CREATE TABLE ... SELECT ... 導數(shù)據(jù)的時候出現(xiàn)報錯:Error Code:1786 (HY000): Mysql Statement violates GTID consistency: CREATE TABLE ... SELECT。
問題原理
這個問題比較簡單,原因就是遷移后的 MySQL5.7 使用了 GTID,開啟了 enforce_gtid_consistency 參數(shù)(GTID 強一致性)。
為保證分布式事務的一致性,MySQL 使用 GTID 來唯一標識一個事務。在 GTID 模式下,DDL 和 DML 語句會自動產生不同的 GTID 來標識不同的事務操作。但是 CREATE TABLE ... SELECT ... 只生成了一個 GTID,將 DDL 和 DML 操作合并為一個事務執(zhí)行,這在語句執(zhí)行失敗時,會造成主從數(shù)據(jù)不一致。開啟 enforce_gtid_consistency 參數(shù)就是為了 GTID 事務的原子性。
官方文檔也有對 CREATE TABLE ... SELECT ... 這一操作的說明:

解決方案
為了安全,不建議關閉這個參數(shù)。
在 MySQL5.7 上可以用拆分成兩句 SQL 的方式,解決這個問題,比如:
#先創(chuàng)建表 CREATE TABLE ... LIKE... #再插入數(shù)據(jù) INSERT INTO ... SELECT ...
雖然之前的單條 SQL 能簡單快速的導數(shù)到另一張表,但為了安全可以適當麻煩一點。
MySQL 8.0
好消息是從 MySQL8.0.21 開始,支持原子 DDL 的存儲引擎允許使用 CREATE TABLE ... SELECT ... 語句了。

以上就是MySQL 遷移后無法快速導數(shù)據(jù)問題解決的詳細內容,更多關于MySQL遷移導數(shù)據(jù)的資料請關注腳本之家其它相關文章!
相關文章
MySQL與PHP的基礎與應用專題之數(shù)據(jù)控制
MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL?AB?公司開發(fā),屬于?Oracle?旗下產品。MySQL?是最流行的關系型數(shù)據(jù)庫管理系統(tǒng)之一,本系列將帶你掌握php與mysql的基礎應用,本篇帶你了解數(shù)據(jù)控制2022-02-02
SQL實現(xiàn)LeetCode(185.系里前三高薪水)
這篇文章主要介紹了SQL實現(xiàn)LeetCode(185.系里前三高薪水),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08
MySQL?數(shù)據(jù)庫的約束及數(shù)據(jù)表的設計原理
這篇文章主要介紹了MySQL?數(shù)據(jù)庫的約束及數(shù)據(jù)表的設計原理,數(shù)據(jù)庫中的約束即是對插入數(shù)據(jù)庫中的數(shù)據(jù)進行限定,為了保證數(shù)據(jù)的有效性和完整性,下面一起來了解具體的詳細內容,需要的小伙伴可以參考一下2021-12-12
mysql查詢優(yōu)化之100萬條數(shù)據(jù)的一張表優(yōu)化方案
這篇文章主要介紹了mysql查詢優(yōu)化之100萬條數(shù)據(jù)的一張表優(yōu)化方案,需要的朋友可以參考下2021-05-05

