升級必要性與風險
- 必要:新功能、效能提升、安全修補、Bug 修復
- 風險:不相容變更導致應用故障、效能退化、資料損壞
- 鐵律:無充分測試嚴禁直接生產升級
升級路徑規劃
| 類型 | 範例 | 推薦方式 | 風險 |
| 小版本 | 5.7.35 → 5.7.38 | 就地升級 + mysql_upgrade | 低 |
| 大版本 | 5.6 → 5.7、5.7 → 8.0 | 邏輯備份遷移 (mysqldump/mydumper) | 中 |
| 跨版本 | 5.6 → 8.0、5.5 → 8.0 | 分級升級:5.6→5.7→8.0,每級跑 mysql_upgrade | 高 |
大版本升級標準流程:邏輯備份遷移 (最安全)
前置準備
- 閱讀官方「升級」文檔,重點檢查 Incompatible Changes
- 調整
my.cnf:移除廢棄參數、添加新參數
- 停止應用寫入(唯讀模式或維護窗口)
- 備份驗證:確保現有備份可還原
步驟 1:導出權限
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-to-dump.txt
mysqldump --routines --events --single-transaction \
--databases $(cat /root/dbs-to-dump.txt) > /root/full-data-dump.sql
步驟 3:停止舊實例、備份資料目錄
systemctl stop mysqld
mv /var/lib/mysql /var/lib/mysql-5.7 # 保留舊目錄以便回滾
步驟 4:安裝新版本
- YUM/APT:
yum install mysql-community-server-8.0
- 二進制包:解壓 →
mysql_install_db → mysql_upgrade
步驟 5:導入權限
mysql -uroot < /root/grants.sql
步驟 6:導入資料
mysql -e "SET GLOBAL max_allowed_packet=1G;"
mysql -uroot -p --max-allowed-packet=1G < /root/full-data-dump.sql
步驟 7:驗證與啟用應用
- 核對表數量、行數、關鍵資料
- 執行應用煙霧測試
- 監控錯誤日誌、慢查詢、效能指標
小版本就地升級
# 1. 備份
# 2. 升級套件
yum update mysql-community-server # 或 apt-get upgrade
# 3. 執行升級腳本
mysql_upgrade -u root -p --force
# 4. 重啟
systemctl restart mysqld
跨大版本直接升級:強烈不建議
- 5.0 → 5.5、5.1 → 5.6、5.0 → 5.6 等
- 預設值變更多(引擎、GTID、表空間、認證插件)
- 不相容變更累積,極難排查
- 必須分級升級,每級執行
mysql_upgrade
升級前驗證清單
- 應用測試:測試環境完整跑回歸測試
- 配置對齊:新版
my.cnf 經過審查
- 關鍵 Bug 確認:檢查目標版本已知 Bug (如 8.0.16-8.0.20 間的臨時表 Bug)
- 工具支援:監控、備份、Proxy、驅動程式版本相容
- 降級預案:準備回滾腳本、驗證舊實例可啟動
Percona Toolkit 輔助升級
| 工具 | 用途 |
| pt-upgrade | 對比新舊版本查詢執行計畫、結果集差異 |
| pt-query-digest | 分析慢查詢在新版本表現 |
| pt-table-checksum | 主從一致性驗證 |
| pt-online-schema-change | 升級後線上 DDL 安全執行 |
升級部署拓撲策略
- Dev/QA 環境先升 → 完整測試
- Staging 環境升級 → 壓力測試
- 生產從庫逐個升級 (一個一個,觀察 24-48h)
- 主庫最後升級 (主從切換後升級舊主)
熱備份工具:Percona XtraBackup
# 完整備份
xtrabackup --backup --target-dir=/backup/full_$(date +%F) --user=root --password=pass
# 增量備份
xtrabackup --backup --target-dir=/backup/inc_$(date +%F) \
--incremental-basedir=/backup/full_20240101 --user=root --password=pass
# 還原準備
xtrabackup --prepare --target-dir=/backup/full_20240101
# 複製回 datadir
rsync -av /backup/full_20240101/ /var/lib/mysql/
總結
MySQL 升級看似簡單,實則暗藏風險。核心原則:邏輯備份遷移大版本、就地升級小版本、分級升級跨版本、全鏈路測試驗證、準備降級預案、從庫先升主庫後升。引入 Percona Toolkit 與 XtraBackup 可大幅降低風險與停機時間。
- 上一篇文章: Facebook 實戰:InnoDB 邏輯預讀大幅提升全表掃描速度 10-20 倍
- 下一篇文章: Linux cgroups 限制 MySQL Enterprise Backup I/O 佔用:防備份拖垮線上服務
Copyright ©
程式碼之家 All Rights Reserved