MySQL 升級分為原地升級(替換二進制、保留數據目錄)與邏輯升級(導出導入)。本文詳述官方支援的升級路徑、原地升級步驟實錄、mysql_upgrade 作用、常見坑點與回滾預案。
| 類型 | 支援範例 | 說明 |
|---|---|---|
| 小版本升級 | 5.6.25 → 5.6.31 | 同大版本,風險最低 |
| 跨大版本(單級) | 5.5 → 5.6、5.6 → 5.7 | 需逐級升級,不可跳級 |
| 跨多級 | 5.1 → 5.6 | 不支援,必須 5.1→5.5→5.6 |
| 非 GA 版本 | 5.6.9 → 5.6.10 | 不支援,僅 GA 版本間升級 |
版本資訊查詢:MySQL 官方歸檔
-- 1. 關閉快速關閉,確保 change buffer 合併、purge 完成 SET GLOBAL innodb_fast_shutdown = 0; -- 值說明:0=慢關閉(執行 purge+merge),1=快關閉(預設,跳過),2=僅 flush log(恢復慢) -- 2. 完整備份(邏輯/物理均可) mysqldump -uroot -p --single-transaction -A -B | gzip > backup_$(date +%F).sql.gz
# 啟動新版 mysqld ./bin/mysqld_safe --defaults-file=/usr/test/mysql-5.6.32/my.cnf --user=mysql --ledir=/usr/test/mysql-5.6.32/bin & # 執行升級腳本(必須) ./bin/mysql_upgrade -uroot -p --socket=/data/mysql.sock
mysql_upgrade 做什麼?
CHECK TABLE + REPAIR TABLE# 邏輯升級流程 mysqldump -uroot -p --single-transaction -A -B --routines --triggers --events | gzip > full.sql.gz # 安裝新版 MySQL,初始化數據目錄 # 導入 gunzip < full.sql.gz | mysql -uroot -p # 執行 mysql_upgrade
| 問題 | 原因 | 解決 |
|---|---|---|
| 系統表結構不匹配 | 未執行 mysql_upgrade | 務必執行,若報錯檢查權限、表損壞 |
| 保留字衝突 | 新版新增保留字(如 RANK、GROUPS) | 升級前用 mysqlcheck --check-upgrade 掃描 |
| 預設值變更 | 如 5.7 sql_mode 預設含 ONLY_FULL_GROUP_BY | 測試應用相容性,或調整 sql_mode |
| InnoDB 頁面格式 | 5.7 預設 Barracuda,5.5 可能 Antelope | innodb_file_format=Barracuda,或重建表 |
| GTID 模式升級 | 5.6→5.7 GTID 實現有差異 | 升級前關閉 GTID,升級後重新配置 |
my.cnf 備份。總結:原地升級適合小版本、單級大版本,操作快、風險可控;邏輯升級通用性強、適合大跨度或架構變更。核心鐵律:升級前全量備份、升級後必跑 mysql_upgrade、生產前必在測試環境全流程演練。