生產環境因業務需分區表功能(MySQL 5.5+ 支援),需將 CentOS 6.3 上的 MySQL 5.1.61 升級至 5.6.19。本文記錄從 RPM 下載、依賴衝突解決、服務啟動異常排查、密碼重置、數據導入編碼處理、PHP 連接庫兼容的完整遷移路徑。
# 1. 下載全套 RPM(Server、Client、Shared、Devel、Embedded) wget https://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.19-1.el6.i686.rpm-bundle.tar tar xf MySQL-5.6.19-1.el6.i686.rpm-bundle.tar # 2. 嘗試安裝 Server rpm -ivh MySQL-server-5.6.19-1.el6.i686.rpm # 報錯:file /usr/share/mysql/charsets/README from install of MySQL-server conflicts with file from package mysql-libs-5.1.61-4.el6.i686
解決:先移除舊共享庫(業務停機窗口操作):
rpm -e --nodeps mysql-libs-5.1.61-4.el6.i686 # 再裝 Server rpm -ivh MySQL-server-5.6.19-1.el6.i686.rpm # 成功
service mysqld start # 錯誤:Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' # 日誌顯示 /var/run/mysql/ 目錄不存在 mkdir -p /var/run/mysql chown mysql:mysql /var/run/mysql service mysqld start # 成功
# 5.6 首次啟動會生成隨機密碼寫入 ~/.mysql_secret
cat ~/.mysql_secret
# 登錄修改密碼
mysql -uroot -p'random_pass' -e "SET PASSWORD = PASSWORD('123456'); FLUSH PRIVILEGES;"
# 導出舊數據(指定編碼) mysqldump -uroot -p'oldpass' --default-character-set=latin1 --skip-set-charset db_name > /tmp/db.sql # 導入新庫(指定編碼) mysql -uroot -p'123456' --default-character-set=utf8 db_name < /tmp/db.sql
關鍵:舊庫實際存 latin1 但標註 utf8,導出時用 --default-character-set=latin1 防止雙重轉碼,導入時顯式指定 utf8。
yum install php-mysql # 又要求 mysql-libs,與 5.6 Server 衝突 # 解決:安裝官方提供的兼容包 rpm -ivh MySQL-shared-compat-5.6.19-1.el6.i686.rpm yum install php-mysql # 成功
MySQL-shared-compat 提供 libmysqlclient.so.16/18 符號鏈接,滿足 PHP/Perl/Python 老模組依賴,不覆蓋 5.6 的核心庫。
SHOW VARIABLES LIKE 'version'; 確認 5.6.19。CREATE TABLE t (id INT) PARTITION BY HASH(id) PARTITIONS 4; 驗證分區功能正常。EXPLAIN 執行計劃無退化。SHOW SLAVE STATUS 正常。innodb_log_file_size 單位變化)。mysqldump --all-databases + /var/lib/mysql 物理備份。MySQL-shared-compat 解決 90% 外部依賴衝突。此次升級耗時約 2 小時(含業務停機),核心風險點集中在「共享庫衝突」與「編碼遷移」,提前在測試環境全流程演練可將生產停機壓縮至 30 分鐘內。