MySQL 大版本升級涉及存儲格式、優化器、權限系統等核心變更。本文記錄從 5.1 源碼編譯升級至 5.5.36 的全流程,含依賴準備、CMake 參數、配置文件遷移、mysql_upgrade 故障排查、數據驗證等關鍵步驟。
yum install -y autoconf* automake* zlib* libxml* ncurses-devel* libgcrypt* libtool* openssl*
yum install -y cmake
# 1. 完整邏輯備份
mysqldump -A -R -E --single-transaction --master-data=2 > /backup/full_$(date +%F).sql
# 2. 物理備份數據目錄
systemctl stop mysqld
tar czf /backup/datadir_$(date +%F).tar.gz /usr/local/mysql/var
# 3. 配置文件備份
cp /etc/my.cnf /backup/my.cnf.bak
service mysql stop
# 或 systemctl stop mysqld
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.5.36.tar.gz
tar xf mysql-5.5.36.tar.gz
cd mysql-5.5.36
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_DATADIR=/usr/local/mysql/var \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
-DMYSQL_USER=mysql \
-DEXTRA_CHARSETS=all \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
關鍵參數說明:
CMAKE_INSTALL_PREFIX:安裝根目錄MYSQL_DATADIR:數據目錄(掛載獨立磁盤時修改)WITH_SSL=system:使用系統 OpenSSL,避免 yaSSL 性能問題WITH_INNOBASE_STORAGE_ENGINE=1:顯式啟用 InnoDB(5.5 默認已內建)make -j$(nproc) && make install
# 編譯耗時 10-30 分鐘視 CPU 核心數而定
rm -f /etc/my.cnf
cp support-files/my-huge.cnf /etc/my.cnf
[mysqld]
# 基礎
datadir = /usr/local/mysql/var
socket = /tmp/mysqld.sock
port = 3306
user = mysql
# InnoDB 核心(重點調優)
innodb_buffer_pool_size = 4G # 物理內存 50-70%
innodb_log_file_size = 512M
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# 連接與緩存
max_connections = 2000
thread_cache_size = 200
table_open_cache = 4000
query_cache_type = 0 # 5.5+ 建議關閉
query_cache_size = 0
# 安全與日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
expire_logs_days = 7
max_binlog_size = 500M
# 字符集
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
service mysql start
# 或 /usr/local/mysql/bin/mysqld_safe --user=mysql &
/usr/local/mysql/bin/mysql_upgrade -uroot -p
# 輸入密碼,等待完成
作用:檢查/修復系統表結構、重建權限表、更新元數據兼容新版本。
現象:
Running 'mysqlcheck'...
Got error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOR UPGRADE' at line 1 when executing 'CHECK TABLE ... FOR UPGRADE'
FATAL ERROR: Upgrade failed
根因:舊版本密碼插件兼容性、權限表結構差異、連接參數缺失。
解決方案 A:指定 Socket 與認證
/usr/local/mysql/bin/mysql_upgrade -S /var/data/mysql.sock -uroot -p
解決方案 B:跳過權限表啟動修復(終極大招)
# 1. 跳過權限啟動
/usr/local/mysql/bin/mysqld --datadir=/usr/local/mysql/var --user=mysql --skip-grant-tables &
# 2. 另開終端執行升級
/usr/local/mysql/bin/mysql_upgrade -uroot -p
# 3. 關閉臨時實例
mysqladmin -uroot -p shutdown
# 4. 正常啟動
service mysql start
⚠️ 警告:--skip-grant-tables 期間無權限控制,務必在內網/防火牆隔離環境操作,完成後立即關閉。
cat /usr/local/mysql/var/mysql_upgrade_info
# 輸出:5.5.36
mysql -uroot -p -e "SELECT VERSION();"
| 檢查項 | 命令/方法 | 合格標準 |
|---|---|---|
| 版本號 | SELECT VERSION(); | 5.5.36 |
| 系統表結構 | DESC mysql.user; | 含 authentication_string 等新列 |
| 存儲引擎 | SHOW ENGINES; | InnoDB 默認、Support=YES |
| 字符集 | SHOW VARIABLES LIKE 'character_set%'; | utf8mb4 相關 |
| 業務查詢 | 核心 SQL 抽樣跑批 | 結果正確、耗時無明顯退化 |
| 主從同步 | SHOW SLAVE STATUS\G | Seconds_Behind_Master=0 |
| 錯誤日志 | tail -100 /var/log/mysql/error.log | 無 ERROR/[Warning] 關鍵異常 |
# 1. 停止新版本
service mysql stop
# 2. 恢復舊數據目錄
rm -rf /usr/local/mysql/var
tar xzf /backup/datadir_$(date +%F).tar.gz -C /
# 3. 恢復舊配置
cp /backup/my.cnf.bak /etc/my.cnf
# 4. 啟動舊版本(需保留舊二進制或重新安裝)
/usr/local/old_mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
--skip-grant-tables 修復,不可跳過大版本升級是 DBA 能力的綜合考驗。穩紮穩打、預案先行、驗證閉環,方能實現「業務無感、數據零損、性能提升」的完美升級。