跨大版本升級(5.1 → 5.7)涉及存儲格式、優化器、權限表、SQL 模式等核心變更。本文提供生產級標準化流程:OS 版本確認、RPM 徹底清理、官方二進制包部署、mysql_upgrade 元數據遷移、配置參數對齊、驗證清單與回滾預案。
# 1. OS 版本
cat /etc/redhat-release # CentOS 6/7
uname -m # x86_64
# 2. 當前 MySQL 版本與安裝方式
mysql -V
rpm -qa | grep -i mysql # RPM 包列表
# 3. 數據目錄大小與引擎分布
du -sh /var/lib/mysql
mysql -e "SELECT ENGINE, COUNT(*) FROM information_schema.TABLES GROUP BY ENGINE"
# 4. 備份(必須)
mysqldump --all-databases --single-transaction --master-data=2 --flush-logs > /backup/full_$(date +%F).sql
# 或物理備份:xtrabackup --backup --target-dir=/backup/xtra_$(date +%F)
# 1. 停止服務
service mysqld stop
# 2. 卸載所有 mysql 相關包(--nodeps 強制忽略依賴)
rpm -qa | grep mysql | xargs rpm -e --nodeps
# 3. 清理殘留 libs
rpm -qa | grep mysql-libs | xargs rpm -e --nodeps
# 4. 刪除數據目錄(備份後可選,升級建議保留)
# mv /var/lib/mysql /var/lib/mysql_5.1_bak
# 1. 下載(針對 OS 版本選擇 Generic Linux Glibc 2.12+ x86_64)
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz
# 2. 解壓並鏈接
tar zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql
# 3. 創建用戶與目錄
groupadd mysql; useradd -r -g mysql -s /sbin/nologin mysql
mkdir -p /data/mysql/{data,logs,tmp}
chown -R mysql:mysql /usr/local/mysql /data/mysql
# 4. 初始化數據目錄(5.7.6+)
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
# 生成隨機 root 密碼在 error log 中,或用 --initialize-insecure 免密
# 5. 配置文件 /etc/my.cnf 關鍵段
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
port=3306
pid-file=/data/mysql/logs/mysqld.pid
log-error=/data/mysql/logs/error.log
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
innodb_buffer_pool_size=4G
innodb_log_file_size=512M
innodb_flush_log_at_trx_commit=1
sync_binlog=1
gtid_mode=ON
enforce_gtid_consistency=ON
# 1. 啟動服務
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
service mysqld start
# 2. 升級系統表(關鍵步驟,修復權限表、help 表、時區表結構)
/usr/local/mysql/bin/mysql_upgrade -uroot -p --force
# --force 強制檢查所有表,即使版本號一致
# 3. 重置 root 密碼(若用 initialize-insecure)
mysql -uroot -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongP@ssw0rd!'; FLUSH PRIVILEGES;"
| 5.1 參數 | 5.7 對應/建議 | 備註 |
|---|---|---|
default-character-set | character-set-server=utf8mb4 | 5.1 無 utf8mb4 |
table_cache | table_open_cache | 重命名 |
query_cache_size | 建議關閉 query_cache_type=0 | 5.7 已棄用,8.0 移除 |
innodb_additional_mem_pool_size | 移除 | 5.7 不再需要 |
log_slow_queries | slow_query_log=1 + slow_query_log_file | 重命名 |
max_connections | 保持或調大 | 配合 thread_cache_size |
mysql -V 顯示 5.7.xSELECT * FROM mysql.user 含 authentication_string 列SHOW REPLICA STATUS\G Seconds_Behind_Master=0若直接跳 5.7 風險過大,可先升 5.5(RPM 源安裝),穩定運行一周後再升 5.7:
# 添加 Remi/EPEL 源
rpm -Uvh https://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# 安裝 5.5
yum --enablerepo=remi,remi-test install mysql mysql-server
# 升級系統表
mysql_upgrade -uroot -p
# 重啟驗證
service mysqld restart
大版本升級是系統工程,而非命令堆砌。標準化流程 = 完整備份 + 環境隔離 + 參數對齊 + 系統表升級 + 多維驗證 + 秒級回滾,才能在業務零感知下完成核心基礎設施換心手術。