首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 5.0 主從復制兼容性與升級策略(三):版本矩陣、升級路徑、已知限制全景圖

     編輯:MySQL 資料庫相關知識

前言

MySQL 復制跨版本兼容性直接關係到架構演進的平滑度。本文匯總 版本兼容性矩陣、3.23→4.0/4.1→5.0 升級操作手冊、復制特性支持邊界、字符集/事務/臨時表等已知限制,為版本升級與異構集群運維提供決策依據。

一、Binlog 格式演進與兼容性矩陣

Binlog 經歷三代:3.23 初版 → 4.0 改進 → 5.0 再改進。4.0.3+ 至 4.1.x 格式統一,互相兼容;4.0.0-4.0.2 為 Alpha 版,格式不兼容,嚴禁生產使用。

Master/Slave 版本兼容性表(✅=支持,❌=不支持)

Slave \ MasterMaster 版本
3.23.33+4.0.3+ / 4.1.x5.0.0
3.23.33+✅❌❌
4.0.3+ / 4.1.x✅✅❌
5.0.0✅✅✅

黃金法則:Slave 版本 ≥ Master 版本;生產環境強烈建議 主從同版本。

二、升級復制拓撲標準作業程序 (SOP)

場景 1:3.23 → 4.0 / 4.1

原則:先升 Slave,後升 Master

  1. 逐個 Slave:STOP SLAVE → 升級二進制 → 啟動 → START SLAVE
  2. 所有 Slave 升級完成並追平後,Master:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;  -- 記錄 File, Pos
# 等待所有 Slave 執行
SELECT MASTER_POS_WAIT('file', pos);  -- 在每個 Slave
STOP SLAVE;  -- 在每個 Slave

# 關閉 Master,升級二進制,啟動
# Master 新 Binlog 文件名記錄
SHOW MASTER STATUS;

# 每個 Slave 重新指向新 Binlog 起點
CHANGE MASTER TO MASTER_LOG_FILE='new-bin.000001', MASTER_LOG_POS=4;
START SLAVE;
⚠️ 升級後 嚴禁**重用舊 Binlog 文件**,會干擾 4.0/4.1 Slave 解析。

場景 2:3.23 / 4.0 / 4.1 → 5.0

關鍵差異:5.0 Master/Slave 能識別並處理舊格式 Binlog/Relay Log,無需手動 CHANGE MASTER 重置位點。

  1. 先升所有 Slave 至 5.0(舊 Relay Log 自動兼容,新生成 5.0 格式)
  2. 關閉 Master,升級至 5.0,啟動(舊 Binlog 自動兼容,新生成 5.0 格式)
💡 5.0 為 Alpha 版本(文檔寫作時),生產環境請使用 GA 版本(如 5.0.15+、5.1、5.5、5.6、5.7、8.0)。

降級警示

5.0 → 舊版本 無法自動降級:必須確保所有 5.0 格式 Binlog/Relay Log 已處理完畢並刪除,方可降級。

三、復制特性支持邊界(功能清單)

特性支持版本備註
AUTO_INCREMENT / LAST_INSERT_ID() / TIMESTAMP全版本正確復制
USER() / UUID() / LOAD_FILE()全版本在 Slave 執行時取 Slave 值,不可靠
CONNECTION_ID()< 4.1.1不可靠;≥4.1.1 正確復制
PASSWORD()≥ 4.1.1新算法;舊 Slave 需 Master 加 --old-passwords
FOREIGN_KEY_CHECKS≥ 4.0.14復制該變量
sql_mode / UNIQUE_CHECKS / SQL_AUTO_IS_NULL≥ 5.0.0復制該變量
SQL_SELECT_LIMIT / table_type所有版本不復制

四、字符集與校驗規則復制陷阱

  1. 全局字符集必須一致:--default-character-set、--default-collation Master/Slave 完全相同,否則可能出現 Duplicate Key 錯誤(Master 認為唯一,Slave 校驗規則不同導致衝突)。
  2. 會話級字符集修改:
    - Master < 4.1.3:禁止 使用 SET NAMES/CHARACTER SET(不記入 Binlog,Slave 解析錯誤)
    - Master ≥ 4.1.3 且 Slave ≥ 4.1.3:允許會話級修改,自動記入 Binlog 並復制
  3. 庫級字符集不一致:CREATE TABLE 必須 顯式指定 CHARSET/COLLATE,否則隱式繼承庫默認字符集導致 Bug #2326。

五、事務/非事務表混合復制限制

  • 事務表 → 非事務表:Slave 將 InnoDB 視為 MyISAM 可行,但 Slave 在 BEGIN/COMMIT 間崩潰會從 BEGIN 重放,導致數據不一致(TODO 修復)。
  • 用戶變量 (@var):3.23/4.0 復制錯誤;4.1+ 修復;5.0 變量不區分大小寫,跨版本復制需注意。
  • SSL 復制:≥ 4.1.1 Slave 支持 SSL 連接 Master。
  • DATA/INDEX DIRECTORY:CREATE TABLE 含目錄子句會復制到 Slave;Slave 無目錄/無權限會報錯。解決:Slave 啟用 sql_mode=NO_DIR_IN_CREATE 忽略該子句。

六、非確定性查詢與臨時表風險

  • 非確定性 UPDATE:如 UPDATE t SET a=a+1 WHERE b=1 LIMIT 1(無 ORDER BY),Master/Slave 執行順序可能不同 → 數據發散。優化器決定權,屬設計缺陷範疇。
  • DDL/維護命令 Binlog 記錄:
    - < 4.1.1:FLUSH/ANALYZE/OPTIMIZE/REPAIR TABLE 不記 Binlog
    - ≥ 4.1.1:默認記錄(除 NO_WRITE_TO_BINLOG/LOCAL)
    - 例外:FLUSH LOGS / FLUSH SLAVE / FLUSH TABLES WITH READ LOCK 永不記錄(復制會死鎖)
  • MEMORY (HEAP) 表:≥ 4.0.18 Master 會在用完後寫 DELETE FROM 通知 Slave 清空。
  • 臨時表復制:Slave 關閉時臨時表消失,重啟後重放失敗。
    規避:STOP SLAVE → 檢查 Slave_open_temp_tables=0 → mysqladmin shutdown。

七、循環復制與錯誤處理

A→B→C→A 環形拓撲

  • 需啟用 --log-slave-updates
  • Server ID 編碼在 Binlog 中,自動忽略自己產生的事件(除非 --replicate-same-server-id)
  • 前提:無主鍵衝突、無並發更新同一行、更新間有足夠時間間隔

SQL 線程報錯停止處理

  1. 連接 Slave 修復問題(如建表、權限)
  2. START SLAVE 重啟
  3. 若數據不一致:手工同步表 → START SLAVE
  4. 跳過錯誤:SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1/2; START SLAVE;

八、網絡斷開與非乾淨關機容錯

  • Slave 斷線自動重連(--master-connect-retry,默認 60s)
  • slave_net_timeout 判定網絡斷開(默認 3600s,可調小)
  • Master/Slave 非乾淨關機:
    - InnoDB + --innodb-safe-binlog 保證 Binlog/Redo Log 一致
    - MyISAM 可能損壞,建議 UPS + 定期 myisamchk

九、3.23 遺留問題在 4.0 已修復

  • LOAD DATA INFILE:文件存在即可正確復制
  • LOAD DATA LOCAL INFILE:不再被忽略
  • RAND():復制正常;3.23 需用 RAND(UNIX_TIMESTAMP()) 規避

總結

MySQL 復制跨版本兼容性遵循 「Slave 版本 ≥ Master 版本、同版本最穩、Binlog 向前兼容」。升級時 先升 Slave 後升 Master,5.0+ 簡化了位點重置。運維重點在於:字符集全局一致、會話級修改版本門檻、事務/非事務混合陷阱、臨時表關機風險、非確定性查詢發散。建議建立「升級預演環境 → 全鏈路驗證 → 生產滾動升級」標準化流程。

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