適用於小版本/大版本兼容升級,優點:快速、數據目錄不動、配置復用。風險:庫表結構不兼容、系統表缺失、權限表異常。
# 邏輯備份:結構+數據,含 Binlog 位點
mysqldump -uroot -p -A -F --master-data=2 --single-transaction --routines --triggers \
> /backup/mysql_upgrade_$(date +%F).sql
# 物理備份:數據目錄 + 安裝目錄 + 配置文件
tar -czf /backup/mysql5.0_datadir_$(date +%F).tar.gz /data/mysql_data
tar -czf /backup/mysql5.0_basedir_$(date +%F).tar.gz /usr/local/mysql
cp /etc/my.cnf /backup/my.cnf.bak
# 錯誤:mysqldump: Got error: 1556: You can't use locks with log tables.
# 原因:系統 PATH 中舊版 mysqldump 優先被調用
which mysqldump # 輸出 /usr/bin/mysqldump
# 修復:將新版 bin 目錄置於 PATH 最前
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
source /etc/profile
which mysqldump # 應輸出 /usr/local/mysql/bin/mysqldump
mysqladmin -uroot -p shutdown
# 或
systemctl stop mysqld
cd /usr/local
tar -xzf mysql-5.1.73-linux-x86_64-glibc23.tar.gz
rm -rf mysql/* # 清空舊版文件
mv mysql-5.1.73-linux-x86_64-glibc23/* mysql/
# 以 skip-grant-tables 啟動,避免權限表不匹配導致啟動失敗
mysqld_safe --skip-grant-tables --user=mysql &
# 執行系統表升級
mysql_upgrade -uroot -p --force
# 正常重啟
mysqladmin -uroot -p shutdown
systemctl start mysqld
# 檢查版本
mysql -uroot -p -e "SELECT VERSION();"
# 檢查系統表完整性
mysql -uroot -p -e "CHECK TABLE mysql.user, mysql.db, mysql.tables_priv, mysql.columns_priv;"
# 核心業務 SQL 冒煙測試
# 監控 error log 無異常
| 問題 | 現象 | 解決 |
|---|---|---|
| 系統表結構變更 | mysql.user 列數不匹配,啟動報錯 | 必須執行 mysql_upgrade --force |
| SQL_MODE 默認變化 | 應用報錯:Data truncated, Division by zero 等 | my.cnf 顯式設置 sql_mode='NO_ENGINE_SUBSTITUTION' 兼容舊行為 |
| 存儲過程/函數權限 | DEFINER 用戶不存在,調用失敗 | 重建或授權對應用戶 |
| 字符集排序規則 | utf8_general_ci vs utf8mb4_0900_ai_ci 排序不同 | 業務驗證排序邏輯,必要時 ALTER TABLE 轉換 |
| 插件兼容 | 舊版插件(如 auth_socket)在 5.1 無效 | 遷移至原生認證或升級插件 |