MySQL 升級 (5.1→5.5→5.6→5.7→8.0) 涉及數據文件格式、系統表結構、優化器行為、保留字、默認參數、複製協議等深層變更。**未經充分測試直接生產升級是重大事故隱患**。本文系統梳理升級必要性、三大升級路徑、關鍵兼容性檢查、分級驗證流程、Percona 工具輔助、降級預案,構建「零驚險」升級體系。
| 路徑 | 適用場景 | 優點 | 缺點 | 風險 |
|---|---|---|---|---|
| 邏輯導出/導入 (mysqldump/mydumper) | **跨大版本 (5.1→5.6, 5.5→8.0)**、異構遷移、數據整理 | 最乾淨、重建表消除碎片、天然兼容、可並行導入 | **耗時長** (TB 級需天)、需雙倍磁盤空間、需應用停寫 | 低 (數據重建) |
| 就地升級 | **同大版本小版本 (5.7.30→5.7.40)**、原地二進制替換 | 快、無數據拷貝、保留權限/配置 | **不支援跨大版本**、系統表結構變更依賴 mysql_upgrade、潛在隱性 Bug | 中 (需完整回滾預案) |
| 原地跨大版本 (二進制替換 + mysql_upgrade) | 極少數情況、極大庫無停寫窗口 | 理論最快 | **極高風險**:數據字典不兼容、Redo Log 格式變更、優化器行為突變,**官方強烈不建議** | **極高** |
# 0. 停止應用寫入 (讀可選)
# 1. 導出用戶權限 (pt-show-grants)
wget percona.com/get/pt-show-grants
perl pt-show-grants --user=root --ask-pass --flush > /root/grants.sql
# 2. 導出業務數據 (排除系統庫)
mysql -BNe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql','performance_schema','information_schema','sys')" | tr '\n' ' ' > /root/dbs.txt
mysqldump --routines --events --single-transaction --databases $(cat /root/dbs.txt) > /root/full_dump.sql
# 大庫建議 mydumper --threads=8 --compress --rows=1000000
# 3. 停庫、備份舊數據目錄
systemctl stop mysql
mv /var/lib/mysql /var/lib/mysql-5.7 # 保留回滾
# 4. 安裝新版本 (yum/apt 或二進制包)
# 二進制包需初始化:mysqld --initialize-insecure --datadir=/var/lib/mysql
# 5. 導入權限
mysql -uroot < /root/grants.sql
# 6. 導入數據 (調大包限制)
mysql -e "SET GLOBAL max_allowed_packet=1G;"
mysql -uroot -p --max-allowed-packet=1G < /root/full_dump.sql
# 或 myloader -d /backup/dir -t 8
# 7. 執行 mysql_upgrade (就地升級必跑,邏輯導入可選但建議跑一次檢查)
mysql_upgrade -uroot -p
# 8. 驗證、啟動應用、監控
SELECT * FROM information_schema.KEYWORDS WHERE RESERVED=1; 對比表/列名。innodb_file_per_table=ON (5.6+)、sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION (5.7+)、character_set_server=utf8mb4 (8.0+)。mysql.user 權限列變化 (8.0 全局權限表拆分)、information_schema 視圖調整。binlog_format=ROW 強制 (RC 隔離級別)、從庫版本不能高於主庫。# 1. 升級前:XtraBackup 全量備份 + Binlog 位點記錄
xtrabackup --backup --target-dir=/backup/full_$(date +%F) --slave-info
# 2. 降級腳本 (測試過可運行)
#!/bin/bash
systemctl stop mysql
mv /var/lib/mysql /var/lib/mysql-failed-$(date +%F)
mv /var/lib/mysql-5.7 /var/lib/mysql # 還原舊數據目錄
systemctl start mysql
# 應用連接舊版本驗證
# 3. 關鍵:降級後 Binlog 位點可能不連續,需重新搭建從庫或用備份恢復主從
MySQL 升級是系統工程,而非命令執行。遵循「邏輯導出跨大版本、就地升級小版本、分級驗證、備份降級雙保險」,才能在享受新版本紅利的同時守住數據安全底線。