MySQL 復制跨版本兼容性直接關係到架構演進的平滑度。本文匯總 版本兼容性矩陣、3.23→4.0/4.1→5.0 升級操作手冊、復制特性支持邊界、字符集/事務/臨時表等已知限制,為版本升級與異構集群運維提供決策依據。
Binlog 經歷三代:3.23 初版 → 4.0 改進 → 5.0 再改進。4.0.3+ 至 4.1.x 格式統一,互相兼容;4.0.0-4.0.2 為 Alpha 版,格式不兼容,嚴禁生產使用。
| Slave \ Master | Master 版本 | ||
|---|---|---|---|
| 3.23.33+ | 4.0.3+ / 4.1.x | 5.0.0 | |
| 3.23.33+ | ✅ | ❌ | ❌ |
| 4.0.3+ / 4.1.x | ✅ | ✅ | ❌ |
| 5.0.0 | ✅ | ✅ | ✅ |
黃金法則:Slave 版本 ≥ Master 版本;生產環境強烈建議 主從同版本。
原則:先升 Slave,後升 Master
STOP SLAVE → 升級二進制 → 啟動 → START SLAVEFLUSH 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 解析。
關鍵差異:5.0 Master/Slave 能識別並處理舊格式 Binlog/Relay Log,無需手動 CHANGE MASTER 重置位點。
💡 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 | 所有版本 | 不復制 |
--default-character-set、--default-collation Master/Slave 完全相同,否則可能出現 Duplicate Key 錯誤(Master 認為唯一,Slave 校驗規則不同導致衝突)。SET NAMES/CHARACTER SET(不記入 Binlog,Slave 解析錯誤)CREATE TABLE 必須 顯式指定 CHARSET/COLLATE,否則隱式繼承庫默認字符集導致 Bug #2326。CREATE TABLE 含目錄子句會復制到 Slave;Slave 無目錄/無權限會報錯。解決:Slave 啟用 sql_mode=NO_DIR_IN_CREATE 忽略該子句。UPDATE t SET a=a+1 WHERE b=1 LIMIT 1(無 ORDER BY),Master/Slave 執行順序可能不同 → 數據發散。優化器決定權,屬設計缺陷範疇。FLUSH/ANALYZE/OPTIMIZE/REPAIR TABLE 不記 BinlogNO_WRITE_TO_BINLOG/LOCAL)FLUSH LOGS / FLUSH SLAVE / FLUSH TABLES WITH READ LOCK 永不記錄(復制會死鎖)DELETE FROM 通知 Slave 清空。STOP SLAVE → 檢查 Slave_open_temp_tables=0 → mysqladmin shutdown。--log-slave-updates--replicate-same-server-id)START SLAVE 重啟START SLAVESET GLOBAL SQL_SLAVE_SKIP_COUNTER=1/2; START SLAVE;--master-connect-retry,默認 60s)slave_net_timeout 判定網絡斷開(默認 3600s,可調小)--innodb-safe-binlog 保證 Binlog/Redo Log 一致myisamchkLOAD DATA INFILE:文件存在即可正確復制LOAD DATA LOCAL INFILE:不再被忽略RAND():復制正常;3.23 需用 RAND(UNIX_TIMESTAMP()) 規避MySQL 復制跨版本兼容性遵循 「Slave 版本 ≥ Master 版本、同版本最穩、Binlog 向前兼容」。升級時 先升 Slave 後升 Master,5.0+ 簡化了位點重置。運維重點在於:字符集全局一致、會話級修改版本門檻、事務/非事務混合陷阱、臨時表關機風險、非確定性查詢發散。建議建立「升級預演環境 → 全鏈路驗證 → 生產滾動升級」標準化流程。