首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 錯誤處理:ERROR 1786 (HY000) — ENFORCE_GTID_CONSISTENCY 禁止 CREATE TABLE ... SELECT 解決方案

     編輯:MySQL 綜合教學

啟用 GTID 一致性模式(ENFORCE_GTID_CONSISTENCY=ON)後,執行 CREATE TABLE ... SELECT 會報錯 ERROR 1786 (HY000)。本文解析原因、驗證參數狀態、給出修改配置重啟的標準修復流程。

一、報錯現場

CREATE TABLE lgmnr_bak SELECT * FROM lgmnr;
ERROR 1786 (HY000): CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1

二、根因分析

  • ENFORCE_GTID_CONSISTENCY 要求所有寫入操作必須是「事務安全」且「可被 Binlog 精確記錄」的。
  • CREATE TABLE ... SELECT 屬於「DDL + DQL 混合」,在某些存儲引擎下不可回滾,Binlog 記錄格式(STATEMENT/ROW)可能導致主從不一致,故被禁止。
  • 同理禁止:CREATE TEMPORARY TABLE、事務中混用事務表與非事務表。

三、參數驗證

SHOW VARIABLES LIKE 'ENFORCE_GTID_CONSISTENCY';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| enforce_gtid_consistency | ON    |
+--------------------------+-------+

嘗試動態修改會報錯:

SET GLOBAL enforce_gtid_consistency = OFF;
ERROR 1238 (HY000): Variable 'enforce_gtid_consistency' is a read only variable

結論:該參數為只讀,必須修改配置文件並重啟實例生效。

四、標準修復流程

  1. 編輯 /etc/my.cnf,[mysqld] 區段:
    enforce_gtid_consistency = OFF(或註釋掉,默認 OFF)。
  2. 優雅重啟:
    mysqladmin -uroot -p shutdown
    mysqld_safe &
  3. 驗證:
    SHOW VARIABLES LIKE 'ENFORCE_GTID_CONSISTENCY'; -- OFF
    再次執行 CREATE TABLE ... SELECT 成功。

五、業務兼容建議

  • 若業務強依賴 CREATE TABLE ... SELECT,可暫時關閉 GTID 一致性,但**喪失 GTID 主從自動定位、故障轉移能力**。
  • 長期方案:重構為 CREATE TABLE new_tbl LIKE old_tbl; INSERT INTO new_tbl SELECT * FROM old_tbl; 兩步分離,符合 GTID 規範。
  • 若必須開啟 GTID(如使用 MGR/Orchestrator),請在開發規範中明確禁止 CREATE TABLE ... SELECT 及 CREATE TEMPORARY TABLE。

六、相關參數速查表

參數動態修改默認值作用
enforce_gtid_consistency否(只讀)OFF強制 GTID 一致性,禁止不安全語句
gtid_mode是(ONLINE/OFFLINE 狀態機)OFF啟用 GTID 複制模式
log_bin否OFF開啟 Binlog,GTID 前置條件
log_slave_updates否OFF從庫寫入自身 Binlog,鏈式複制必需

遇到 1786 錯誤,先確認業務是否真需要 GTID,再決定「改代碼」還是「改參數」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved