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

MySQL 錯誤 1786 (HY000):ENFORCE_GTID_CONSISTENCY 禁止 CREATE TABLE ... SELECT 的解決方案

     編輯:MySQL 綜合教學

錯誤現象

在 MySQL 5.6.14 中執行 CREATE TABLE ... SELECT 時拋出錯誤:

ERROR 1786 (HY000): CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1

檢查變數確認已開啟:

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

原因解析

enforce_gtid_consistency=ON 時,MySQL 僅允許「事務安全且可被二進制日誌完整記錄」的語句執行。下列語句會破壞 GTID 一致性,因此被禁止:

  • CREATE TABLE ... SELECT
  • CREATE TEMPORARY TABLE
  • 同一事務/語句中同時更新事務表(InnoDB)與非事務表(MyISAM)

解決方法

方案一:關閉 enforce_gtid_consistency(需重啟)

  1. 編輯配置檔 /etc/my.cnf(或 /usr/local/mysql/my.cnf):
    [mysqld]
    enforce_gtid_consistency = OFF
    gtid_mode = OFF
  2. 重啟 MySQL 服務使配置生效:
    service mysql restart

注意: enforce_gtid_consistency 為唯讀變數,不支援動態修改:

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

方案二:改寫 SQL 避開限制(不重啟)

將 CREATE TABLE ... SELECT 拆分為兩步:

-- 1. 先建表結構
CREATE TABLE lgmnr_bak LIKE lgmnr;

-- 2. 再插入資料
INSERT INTO lgmnr_bak SELECT * FROM lgmnr;

此寫法符合 GTID 一致性要求,無需變更配置。

最佳實踐建議

  • 若業務必須使用 CREATE TABLE ... SELECT 或臨時表,評估是否真需開啟 GTID;若非嚴格需要 GTID 複製,可關閉相關參數。
  • 生產環境修改 GTID 參數請在維護窗口進行,並同步修改主從所有節點,避免複製中斷(參考 GTID_MODE 配置不一致案例)。
  • 開發規範中建議統一使用 CREATE TABLE LIKE + INSERT SELECT 模式,兼容 GTID 與非 GTID 環境。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved