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

MySQL GTID 複制深度解析:原理、配置、故障修復與 MHA 整合

     編輯:Java 綜合教學

MySQL GTID 複制深度解析:原理、配置、故障修復與 MHA 整合

GTID 基礎概念

GTID (Global Transaction ID) = source_id:transaction_id,source_id 為 server_uuid,transaction_id 為遞增序號。例:e6954592-8dba-11e6-af0e-fa163e1cf111:1-5 表示連續事務範圍。

核心變量

  • gtid_executed:實例上已執行事務集合(含 binlog 事務)
  • gtid_purged:已清理 binlog 的事務集合(gtid_executed 子集)
  • gtid_next:會話級,控制下一事務 GTID 生成方式(AUTOMATIC/ANONYMOUS/顯式指定)

GTID 持久化

MySQL 5.6:binlog 事件 Previous_gtids_log_event(文件頭)+ Gtid_log_event(每事務前)。
MySQL 5.7+:新增系統表 mysql.gtid_executed,無需 log_bin/log_slave_updates 也能持久化。

配置 GTID 複制

# my.cnf
log_bin = /mysql/binlog/mysql_bin
log_slave_updates = true
gtid_mode = ON
enforce_gtid_consistency = true
relay_log_info_repository = TABLE
relay_log_recovery = ON

從庫執行:

CHANGE MASTER TO MASTER_HOST='node1', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1;

GTID 複制工作流程

  1. 從庫發送 slave_gtid_executed = UNION(gtid_executed, Retrieved_gtid_set)
  2. 主庫校驗:slave_gtid_executed ⊆ gtid_executed 且 gtid_purged ⊆ slave_gtid_executed
  3. 從最新 binlog 掃描,找到首個 Previous_gtids ⊆ slave_gtid_executed 的文件
  4. 發送 binlog 事件,跳過已在 slave_gtid_executed 中的事務

故障修復:跳過錯誤事務

單事務跳過(gtid_next)

SET GTID_NEXT='uuid:err_txn_id'; BEGIN; COMMIT; SET GTID_NEXT='AUTOMATIC'; START SLAVE;

批量跳過(gtid_purged)

RESET MASTER; SET GLOBAL gtid_purged='uuid:1-10'; START SLAVE;

前提: 主從數據已一致,僅需跳過復制報錯。

備份恢復與 GTID

  • mysqldump:導出含 SET @@GLOBAL.GTID_PURGED='...',恢復前 RESET MASTER
  • XtraBackup:備份目錄 xtrabackup_binlog_info 含 GTID,恢復後手動 SET GLOBAL gtid_purged 再 CHANGE MASTER ... AUTO_POSITION=1

MHA 整合(0.56+ 支持 GTID)

滿足三條件即為 GTID failover:所有節點 gtid_mode=1、Executed_Gtid_Set 非空、至少一節點 Auto_Position=1。

  • 不再從舊主拷貝 binlog,改由候選主連最新 relay log 節點補償
  • 支持 --wait_until_gtid_in_sync=1 加速切換
  • 可配置 binlog server 做日志補償(非 GTID 模式下被忽略)

Crash-Safe Slave 配置

模式必要配置
傳統relay_log_info_repository=TABLE, relay_log_recovery=ON, (MTS 需 sync_relay_log=1)
GTIDsync_binlog=1, innodb_flush_log_at_trx_commit=1, relay_log_recovery=ON(雙1是核心)

MySQL 5.7 可關閉 log_slave_updates,利用 mysql.gtid_executed 實時持久化避免雙1性能損耗。
MTS (slave_parallel_workers>1) 下 5.6 仍有 relay log 截斷導致啟動失敗 Bug (#83713),臨時方案:RESET SLAVE; CHANGE MASTER ...; START SLAVE;。

Master Crash-Safe

同樣需雙1。Crash 後檢查 Executed_Gtid_Set 一致性,一致則 AUTO_POSITION=1 接入新主;不一致則從新主拉備份重建。

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