當前不少系統的資料庫依舊是MySQL5.6,由於MySQL5.7及MySQL8.0在性能及安全方面有著很大的提升,因此需要升級資料庫。本文通過邏輯方式、物理方式原地升級來介紹MySQL5.6 升級至MySQL5.7的方法,並介紹其使用場景。 1. 邏輯方式升級 邏輯方式升級其實就是通過邏輯備份工具( ...
當前不少系統的資料庫依舊是MySQL5.6,由於MySQL5.7及MySQL8.0在性能及安全方面有著很大的提升,因此需要升級資料庫。本文通過邏輯方式、物理方式原地升級來介紹MySQL5.6 升級至MySQL5.7的方法,並介紹其使用場景。
1. 邏輯方式升級
邏輯方式升級其實就是通過邏輯備份工具(例如mysqldump工具)將資料庫、表、其他相關對象及數據邏輯備份成SQL腳本,再將其還原至MySQL5.7的實例中。
詳細步驟如下:
1.1 備份資料庫
當前資料庫的版本為MySQL5.6.27,現在準備備份
因為庫比較小,因此使用mysqldump進行備份即可。mysqldump備份的方法可以參考歷史文章進行瞭解
MySQL數據備份及還原(一) https://mp.weixin.qq.com/s/JbLThtgUq5RjkCuztSgBJg 或 https://www.cnblogs.com/gjc592/p/12505347.html
備份腳本:
/* 備份所有庫及相關對象 */ /usr/local/mysql/bin/mysqldump -uroot -p --socket=/app/data/mysql3307/tmp/mysql.sock --master-data=2 --default-character-set=utf8 --routines --triggers --events --flush-logs --flush-privileges --single-transaction --all-databases > all_db.sql
1.2 部署一套MySQL5.7實例
MySQL5.7 的部署歷史文章里也有,如果不太熟悉的同學可以參考如下鏈接文章
MySQL5.7安裝https://mp.weixin.qq.com/s/fbp-3hpMxrCc7R3_HQTchA 或 https://www.cnblogs.com/gjc592/p/9203711.html
安裝過程比較簡單,本文不再贅述。
1.3 數據導入MySQL5.7
將備份的MySQL5.6的數據導入到MySQL5.7 中即可。
1.4 應用場景
- 數據量小的情況下使用,此方式通常不會失敗
- 在跨大版本升級的時候使用較多,例如,從MySQL5.6(或更低版本)直接升級到8.0版本
- 不同MySQL分支之間升級
2. mysql_update方式升級
使用mysql_update方式升級時,時間相對較快,尤其是資料庫體量較大時,此方式可以原地直接升級。
步驟如下:
2.1 下載MySQL5.7
下載需要升級到的版本的資料庫,例如本次升級到MySQL5.7.25-28版本(percona分支),則下載對應安裝包,解壓後配置軟連接
2.2 修改配置文件
因MySQL5.6 的部分參數再MySQL5.7 中已經廢棄或者預設值發生變化,另外也為了使用MySQL5.7的新特性,需要添加對應的參數配置,例如:
- sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION # 保持和MySQL5.6一致
- innodb_large_prefix =OFF # 保持和MySQL5.6 一致
- log_timestamps=SYSTEM # 新增參數,如果不添加,預設日誌里採用UTC時間格式記錄,我們看上去可能不太方便
- secure_file_priv=/tmp # MySQL5.7對安全性做了很多提升,此參數不配置的話預設無法使用load file 及ELECT …OUTFILE等
- character_set_server= utf8 # 雖然建議使用utf8mb4字元集,但是如果需要保持和原庫一致,需要指定
當日,還有很多新特性的參數需要調整,在此不再一一列舉,需要的同學直接聯繫我 或者參考歷史文章配置即可
2.3 關閉MySQL5.6 實例
MySQL5.6的關閉可以使用停止服務的方式,也可以通過命令行方式,命令如下:
/* mysql5.6 關閉實例的方式需要使用mysqladmin */ /usr/local/mysql/bin/mysqladmin --socket=/app/data/mysql3307/tmp/mysql.sock -uroot -p shutdown
建議: 生產環境中,如果可以使用此方式升級,強烈建議先直接冷備一下整個資料庫的數據目錄,已防止升級失敗等情況出現。
2.4 使用MySQL5.7 啟動原庫
此時需要用MySQL5.7來啟動資料庫,啟動後日誌里會有一些報錯信息。
啟動資料庫
/usr/local/mysql5.7/bin/mysqld_safe --defaults-file=/app/data/mysql3307/etc/my.cnf &
日誌里內容如下,出現很多錯誤,其中也提示到需要使用mysql_upgrade進行修複:
2.5 升級資料庫
MySQL升級工具是mysql_upgrade,錯誤日誌里也提到了使用mysql_upgrade進行修複相應的錯誤。升級的方法如下:
/* 升級系統庫及業務庫 */ /usr/local/mysql5.7/bin/mysql_upgrade --socket=/app/data/mysql3307/tmp/mysql.sock -uroot -p
如果只需要升級系統庫,則加-s參數; 如果升級過程中有錯誤或者中斷後想再次升級 可以添加--force參數強制升級
/* 只升級系統庫 */ /usr/local/mysql5.7/bin/mysql_upgrade --socket=/app/data/mysql3307/tmp/mysql.sock -uroot -p -s /* 強制升級 */ /usr/local/mysql5.7/bin/mysql_upgrade --socket=/app/data/mysql3307/tmp/mysql.sock -uroot -p --force
2.6 後續工作
升級完成後建議再進行以下工作
- 重啟資料庫,以便所有功能生效;且重啟後再次查看資料庫日誌
- 修改環境變數及軟連接,以便預設使用MySQL5.7的相關命令
附: 升級後資料庫啟動日誌
2.7 使用場景
相同大版本之間的小版本升級
數據量較大,提前測試過兩個版本之間可以原地升級時再用。
3. 小結
MySQL的邏輯升級及mysql_upgrade的原地升級都有各自的應用場景。但是無論用哪種方式,都要註意以下幾點:
a) 在生產環境上進行升級操作之前一定需要先在測試環境中多次進行相同版本的升級測試工作;
b) 實際工作中,測試環境升級成功後需要經過相關業務的回歸測試,確保相關功能升級後能正常使用後再在生產環境進行升級,建議測試環境進行1個月以上的測試
c) 生產環境升級前一定要進行備份
d) 生產環境的升級順序建議是先升級從節點,再升級主節點或進行主從切換
以上就是MySQL5.6升級至MySQL5.7的2種主要方式,如有問題或建議,歡迎與我溝通或投稿(公眾號:資料庫乾貨鋪)。