對于數(shù)據(jù)庫軟件來說,使用一段時間后,不可避免的要進行升級。這種升級主要是應對各種 安全漏洞,提高性能,新功能,bug等問題。對于熱門的MySQL數(shù)據(jù)庫,升級應該怎樣應對。
為什么要升級
1)基于安全考慮(安全漏洞)
2)基于性能和 穩(wěn)定性考慮:
MGR復制 ,并行復制writeset 等功能, 性能提升
3)新的功能:
Hash join ,窗口函數(shù),DDL即時,json 支持, MGR復制 ,直方圖 等
4)運維規(guī)劃:原始環(huán)境中版本太多,為統(tǒng)一管理版本。
5)版本bug:
5.7.高版本, 或 8.0版本基本已到穩(wěn)定期。
6)版本生命周期(8年)

升級場景
對于不同的場景,可以分為小版本升級,大版本升級,特點如下:
1) 同一個版本內(nèi)容,指最后小序列升級。一般修復bug,添加一些功能點。 比如:5.7.X中 5.7.21 升級到 5.7.30。
- 不改變數(shù)據(jù)文件,升級速度快;
- 不可以跨操作系統(tǒng),不可以跨大版本;
- 方式上in-place upgrade小版本升級方法;應對 5.7.x內(nèi);
2)跨大版本進行5.7.X 到 8.0.X 本身體系架構(gòu)有很大的變化。
- 適合不同操作系統(tǒng)的MySQL升級,升級速度慢;
- logical upgrade可跨機器、可跨操作系統(tǒng)。 跨平臺 比如:Linux→Win,CentOS→麒麟V10;
- 搭建高配置從庫,安裝新版本MySQL,配置從庫同步;
- 通過第三方工具,導出導入;
升級方案
在MySQL升級中,基本有三種方案可供參考:

1.搭建高版本從庫
搭建一個全新的高版本從庫。需要準備新的硬件 或則 原用選項的從庫。

MySQL支持從一個版本系列復制到更高版本系列。例如,可以從運行MySQL 5.6的源復制到運行MySQL 5.7的副本,從運行MySQL 5.7的源復制到運行MySQL 8.0的副本,以此類推。但是,如果源使用語句或依賴于在副本上使用的MySQL版本中不再支持的行為,那么從舊源復制到新副本時可能會遇到困難。例如,MySQL 8.0不再支持超過64個字符的外鍵名稱。

2.In-Place Upgrade
安裝新的mysql軟件,利用mysql_upgrade腳本來完成系統(tǒng)表的升級。從庫先升級,之后切換主庫。
需要兼容性測試。
- 新版本的安裝包替代老版本安裝包
- mysql_upgrade命令方式 (8.0 mysqld --upgrade)
- 在線升級,主節(jié)點切換確保session kill 掉

3.邏輯導入導出
采用mysqldump,mysqlpump,mydumper,navicate等工具
1.先導入表結(jié)構(gòu)
2.之后導入數(shù)據(jù)
3.用戶表
4.存儲過程,觸發(fā)器,視圖,event 等
5.blob,text,bit字段導入之后需要注意

4. MySQL5.7 到8.0滾動升級
Mysql8.0還是提供了很多方便,不像之前一樣5.6升級5.7那樣,可以通過mysql shell進行確認。
在MySQL 8中mysql_upgrade客戶端現(xiàn)已棄用。升級客戶端執(zhí)行的操作現(xiàn)在由服務器完成。
使用較舊的數(shù)據(jù)目錄啟動新的 MySQL 二進制文件。自動修復用戶表。升級后不需要重新啟動。


備注:5.7升級8.0還是新鮮的方式。但還是非常實用。
升級注意

-
1.innodb_fast_shutdown參數(shù):
0 :完成所有的 full purge 和 merge insert buffer 操作(如:做 InnoDB plugin 升級時)
1 :默認,不需要完成上述操作,但會刷新緩沖池中的臟頁
2 :不完成上述兩個操作,而是將日志寫入日志文件,下次啟動時,會執(zhí)行恢復操作 recovery
沒有正常地關(guān)閉數(shù)據(jù)庫(如:kill 命令)/innodb_fast_shutdown=2 時,需要進行恢復操作。 -
2.rpm安裝和tar安裝區(qū)別:
rpm路徑是固定的,所以在一個系統(tǒng)上只能安裝一個mysql版本。 -
3.字符集,排序順序,大小寫敏感需要更改注意
-
4.mysql_upgrade
-s, --upgrade-system-tables
Only upgrade the system tables, do not try to upgrade the data.
-f, --force
Force execution of SQL statements even if mysql_upgrade has already been executed for the current version of MySQL. -
5.升級之后驅(qū)動JDBC版本問題, mysql一些中間件 比如:1.5mycat兼容性問題:
https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-versions.html

升級檢查
不是升級完,就可以,還需要進行檢查工作:
- 1.升級完成,重啟數(shù)據(jù)庫:是否能正常啟動
- 2.檢查升級結(jié)果:select version();
- 3.時間是否正常獲取
- 4.Blob,text,字段檢查:容易截斷 丟失數(shù)據(jù)
- 5.存儲過程,觸發(fā)器,event 能否執(zhí)行檢查,define用戶
- 6.高可用切換演練
- 7.業(yè)務用戶是否能正常訪問
升級Error,Waring處理
mysql的error日志檢查是必不可少的過程。下面列了一些錯誤記錄:
1)innodb-file-format-check
[Warning] /usr/local/mysql-5.7/bin/mysqld: ignoring option ‘–innodb-file-format-check’ due to invalid value ‘Barracuda’
innodb-file-format-check 5.7不存在,需要注釋掉,配置參數(shù)。
2)Storing MySQL user name or password &found a zombie dump thread
[Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the ‘START SLAVE Syntax’ in the MySQL Manual for more information.
[Note] While initializing dump thread for slave with UUID
MASTER_HEARTBEAT_PERIOD參數(shù)導致:
#方法1:復制進程信息處理
change master to MASTER_HEARTBEAT_PERIOD =30;
#方案2:也可通過設(shè)置slave_net_timeout = 3600秒來解決問題
set global slave_net_timeout=3600;
3)Cannot Setup server variables.
如果執(zhí)行mysql_upgrade過程中出現(xiàn)如下錯誤,說明權(quán)限導致,在my.cnf中加入:skip-grant-tables跳過就行了,執(zhí)行完成后再去掉.

4)時間字段
1.timestamp字段默認值問題
Error Code: 1048. Column ‘create_time’ cannot be null explicit_defaults_for_timestamp=on下 不允許null值。
2.TIMESTAMP 范圍:‘1970-01-01 00:00:01’ UTC to ‘2038-01-19 03:14:07’
5)過濾[Warning] 信息
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
[Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
[Warning] InnoDB: Using innodb_file_format is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html
對于timestamp defaults,innodb_file_format 都是未來版本廢棄的參數(shù)
6)mysql8.0 小版本升級
[ERROR] [MY-011091] [Server] Data dictionary upgrade prohibited by the
command line option '--no_dd_upgrade'.
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
回退方案
回退方案是為了應急而制定,確保數(shù)據(jù)不丟失。
1.升級前進行備份
2.binlog切記不要進行清除和刪除,必要時要做好備份。
3.滾動升級應急處理方式:
從庫升級過程中出現(xiàn),升級無法進行的時候,不進行升級,保持原狀。觀察并解決問題,之后持續(xù)進行升級操作。
升級準備事項
有一句話說的好,那就是不打無準備之仗,這就告訴了不論做什么事情都要提前做好準備。升級也需要準備工作:
1)測試庫升級,應用驗證
2)數(shù)據(jù)庫升級,末知問題發(fā)生
3)my.cnf配置信息調(diào)整
4)不兼容的操作方法,影響復制
5)一個平穩(wěn)的過濾,列如先升級一個從庫,到所有從庫
6)最少停機時間,同樣生產(chǎn)數(shù)據(jù)恢復到環(huán)境,進行模擬升級,評估時間
7)怎樣進行數(shù)據(jù)驗證:行數(shù),表的數(shù)量 等等
8)考慮回滾方案
9)數(shù)據(jù)庫備份
10)操作命令文檔&步驟 準備
總結(jié)
版本升級,不是簡單的事情。需要花費一定的精力計劃,還需要各方面協(xié)調(diào)好。
準備工作必不可少,做事提前準備,很有必要,這樣可以讓事情做得更完美,做到不論碰到什么事情都能應對好。




