三、MySQL系列 - MySQL各版本升級最佳實踐
一、升級前注意事項
在開始之前,你要意識到這是一個很慎重的操作,將一步跨過一個重要的MySQL版本。也就是說,這是有風險的。用二進制文件升級是不建議的,而且這樣直接跨越一個重要版本也是不安全的,所以你絕不能這樣5.0->5.5,5.1->5.6,或者5.0->5.6做。有一個問題是,MySQL版本不是所有改變都前向兼容的。新版本中介紹的一些改變可能不僅會影響數據如何處理,還會影響服務器行為包括SQL語句和MySQL服務器和內部存儲引擎(此處不知標准否)。另一個問題是MySQL5.0與5.6版本之間的變化,一些默認的設置變量被改變了,這可能會導致結果完全不一樣或者行為完全不同。例如:MySQL5.5的默認存儲引擎是InnoDB,MySQL5.6的存儲引擎InnoDB將可以為每個數據庫表創建單獨表空間(separate tablespace),還有GTID復制(GTID replication)也被引入。有太多細節這里就不一一列舉了,所有這些改變都被描述在MySQL的“升級文檔”中,詳情可以查看升級文檔
二、兩種升級方式
- 通常情況下,有兩中升級方式:
- 直接升級:安裝好新版本數據庫后,利用已經存在的數據文件夾,同時運行mysql_upgrade腳本來升級。
- SQL 導出: 從一個較老版本的mysql把數據導出,然后恢復到新版本的數據庫中。(利用mysqldump工具)。
相比之下,第二種方式更安全些,但是這也會使得升級的過程要慢一些。
理論上講,最安全的方式是:- 導出所有用戶的權限
- 導出所有數據並恢復到新版本數據庫中
- 恢復用戶權限到新數據庫中
三、具體步驟
- 獲取用戶和權限信息. 該操作會備份所有用戶的權限.
$ wget percona.com/get/pt-show-grants;
$ perl pt-show-grants --user=root --password=root --flush > /root/grants.sql
- dump 數據庫實例的所有信息(除去mysql, information_schema 和performance_schema數據庫).
$ mysql -uroot -proot -BNe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql', 'performance_schema', 'information_schema')" | tr 'n' ' ' > /root/dbs-to-dump.sql
$ mysqldump --routines --events --single-transaction --databases $(cat /root/dbs-to-dump.sql) > /root/full-data-dump.sql
- 停止數據庫
$ service mysql stop
or
$ /etc/init.d/mysql stop
- 移動舊數據庫(5.5版本)的數據目錄(假設是/var/lib/mysql,此處應該改為你自己的數據目錄)
$ mv /var/lib/mysql/ /var/lib/mysql-55
- 安裝5.6版本(按照正常安裝流程). 如果你不是用的yum/apt-get方式安裝的,你需要執行 mysql_install_db 和mysql_upgrade兩個命令.
- 將在1)操作中導出的用戶信息導入到新數據庫中.
mysql -uroot < /root/grants.sql
- 將2)導出的數據導入到新數據庫.
$ mysql -e "SET GLOBAL max_allowed_packet=1024*1024*1024";
$ mysql -uroot -p --max-allowed-packet=1G < /root/full-data-dump.sql;
四、MySQL官方文檔步驟