# MySQL怎么開啟或禁用GTID模式
## 一、GTID模式概述
### 1.1 什么是GTID
GTID(Global Transaction Identifier,全局事務標識符)是MySQL 5.6版本引入的重要特性,它為每個事務分配一個全局唯一的標識符。GTID的格式為:
source_id:transaction_id
其中:
- `source_id` 是產生事務的服務器UUID
- `transaction_id` 是一個遞增的序列號
例如:`3E11FA47-71CA-11E1-9E33-C80AA9429562:23`
### 1.2 GTID的優勢
1. **簡化復制配置**:不再需要指定binlog文件和位置
2. **故障恢復更簡單**:自動識別已執行的事務
3. **一致性保證**:確保從庫不會重復應用事務
4. **主從切換更可靠**:輕松識別主從同步狀態
### 1.3 GTID的局限性
1. 對非事務引擎(如MyISAM)支持有限
2. 某些特定操作(如臨時表)在GTID模式下有特殊要求
3. 版本兼容性問題(MySQL 5.6+才完全支持)
## 二、開啟GTID模式
### 2.1 準備工作
#### 環境檢查
```sql
SHOW VARIABLES LIKE '%gtid%';
SHOW VARIABLES LIKE '%binlog%';
SHOW VARIABLES LIKE '%log_slave_updates%';
binlog_format=ROW
(建議)在my.cnf或my.ini配置文件中添加以下參數:
[mysqld]
# 基本GTID配置
server_id = 1 # 必須唯一
gtid_mode = ON # 開啟GTID
enforce_gtid_consistency = ON # 強制GTID一致性
# Binlog相關配置
log_bin = mysql-bin
binlog_format = ROW # 建議使用ROW格式
log_slave_updates = ON # 從庫記錄binlog
binlog_group_commit_sync_delay = 100
binlog_group_commit_sync_no_delay_count = 10
SET @@GLOBAL.read_only = ON;
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
-- 觀察錯誤日志,確保沒有警告后再繼續
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
-- 確保返回值為0
SET @@GLOBAL.GTID_MODE = ON;
STOP SLAVE;
CHANGE MASTER TO
MASTER_AUTO_POSITION = 1;
START SLAVE;
SET @@GLOBAL.read_only = OFF;
SHOW VARIABLES LIKE 'gtid_mode';
SHOW VARIABLES LIKE 'enforce_gtid_consistency';
-- 查看已執行的GTID集合
SELECT @@GLOBAL.GTID_EXECUTED;
STOP SLAVE;
-- 獲取當前執行位置
SHOW MASTER STATUS;
CHANGE MASTER TO
MASTER_AUTO_POSITION = 0,
MASTER_LOG_FILE = 'mysql-bin.000123',
MASTER_LOG_POS = 456789;
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
-- 確保返回值為0
SET @@GLOBAL.GTID_MODE = OFF;
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = OFF;
從my.cnf或my.ini中移除或注釋GTID相關配置:
# gtid_mode = ON
# enforce_gtid_consistency = ON
systemctl restart mysql
ERROR 1788 (HY000): Statement violates GTID consistency
解決方案: 1. 修改應用SQL,避免使用CREATE TEMPORARY TABLE和DROP TEMPORARY TABLE 2. 或將這些操作放在事務外部
解決方案:
-- 使用事務內臨時表
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = OFF;
-- 執行臨時表操作
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
解決方案:
-- 在從庫上執行
SET GTID_NEXT='aaa-bbb-ccc:123';
BEGIN; COMMIT;
SET GTID_NEXT='AUTOMATIC';
START SLAVE;
STOP SLAVE;
SET @@GLOBAL.SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
binlog_group_commit_sync_delay
值(微秒)binlog_group_commit_sync_no_delay_count
gtid_executed
表大小-- GTID狀態監控
SHOW GLOBAL STATUS LIKE '%gtid%';
-- 復制延遲監控
SHOW SLAVE STATUS\G
--set-gtid-purged
參數gtid_purged
設置GTID模式顯著簡化了MySQL復制的管理和維護工作,但切換過程需要謹慎操作。本文詳細介紹了GTID模式的啟用和禁用步驟,以及常見問題的解決方案。在生產環境中實施時,建議:
通過合理配置和使用GTID,可以大幅提高MySQL復制環境的可靠性和可維護性。
附錄:常用GTID相關命令參考
-- 查看GTID執行情況
SELECT @@GLOBAL.GTID_EXECUTED, @@GLOBAL.GTID_PURGED;
-- 重置GTID執行歷史
RESET MASTER;
-- 跳過特定GTID
STOP SLAVE;
SET GTID_NEXT='aaa-bbb-ccc:123';
BEGIN; COMMIT;
SET GTID_NEXT='AUTOMATIC';
START SLAVE;
版本兼容性說明: - MySQL 5.6.5+:基本GTID支持 - MySQL 5.7.6+:改進的GTID性能 - MySQL 8.0:進一步增強GTID可靠性 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。