生產環境從 MySQL 5.1 升級 5.5.36 的實戰記錄,含依賴安裝、編譯參數、資料遷移、mysql_upgrade 失敗應對。
# 安裝依賴 yum install -y autoconf* automake* zlib* libxml* ncurses-devel* libgcrypt* libtool* openssl* cmake # 備份舊資料目錄 # 停止服務 service mysql stop
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 make && make install
rm -rf /etc/my.cnf cp support-files/my-huge.cnf /etc/my.cnf service mysql start
FATAL ERROR: Upgrade failed Got error: 1064: You have an error in your SQL syntax ... near 'FOR UPGRADE'
/usr/local/mysql/bin/mysql_upgrade -S /var/data/mysql.sock -uroot -p 失敗。mysqld 直接掛載舊 datadir 並加 --skip-grant-tables 啟動:/usr/local/mysql/bin/mysqld --datadir=/usr/local/mysql/var/ --user=mysql --skip-grant-tables &
mysql_upgrade 成功。mysqladmin shutdown 停止,修正 my.cnf 參數適配 5.5,正常啟動。關鍵命令:/usr/local/mysql/bin/mysqld --datadir=/path/to/old/data --user=mysql --skip-grant-tables &
利用新版本二進制直接掛載舊資料目錄、跳過權限檢查,讓 mysql_upgrade 在相容模式下完成系統表結構升級,再正規啟動。