下午的時(shí)候接到業(yè)務(wù)部門(mén)的一個(gè)需求,他們有一個(gè)業(yè)務(wù)對(duì)性能要求比較高,在測(cè)試環(huán)境已經(jīng)做了一些測(cè)試和優(yōu)化,想看看在MySQL新版本中是否有一定的提升,現(xiàn)在使用的數(shù)據(jù)庫(kù)版本是MySQL 5.5.19,想問(wèn)問(wèn)我能不能做下升級(jí)。
確實(shí),很少有業(yè)務(wù)部門(mén)對(duì)數(shù)據(jù)庫(kù)版本有一定的要求,對(duì)我來(lái)說(shuō)有點(diǎn)兒驚喜。本來(lái)要推到下周的事情,我就速戰(zhàn)速?zèng)Q吧。
升級(jí)數(shù)據(jù)庫(kù)版本,在商業(yè)數(shù)據(jù)庫(kù)中是一個(gè)大活,有一定的復(fù)雜性,記得在Oracle中是有一個(gè)特有的版本升級(jí)路線圖的,現(xiàn)在都19c了,相比路線圖更是復(fù)雜了不少。

回到這個(gè)需求,在MySQL中,常用的思路無(wú)非是兩種,一種是遷移式升級(jí),一種是字典升級(jí)。鑒于這是一個(gè)測(cè)試環(huán)境,上面的數(shù)據(jù)庫(kù)很多,數(shù)據(jù)量也不大,采用遷移式升級(jí)是比較推薦的,因?yàn)闃I(yè)務(wù)方對(duì)時(shí)間的要求比較寬松,1個(gè)小時(shí)以內(nèi)交付就行,所以我想試試字典升級(jí)的方式。
整個(gè)遷移的過(guò)程可以歸納為下面的幾個(gè)步驟:
1.多版本軟件部署
2.停庫(kù)備份
3.切換版本,啟動(dòng)數(shù)據(jù)庫(kù)
4.升級(jí)數(shù)據(jù)字典
5.重啟數(shù)據(jù)庫(kù)
我們來(lái)逐個(gè)說(shuō)一下。
源環(huán)境是MySQL 5.5.19,升級(jí)到Percona 5.7.16版本
- 多版本軟件部署
- 需要在同一臺(tái)服務(wù)器上部署多版本軟件,在這里就是5.7的軟件,這里使用二進(jìn)制的部署方式,目錄暫定為/usr/local/mysql_5.7
- 停庫(kù)備份
- 這應(yīng)該是最關(guān)鍵的一個(gè)步驟了,可以考慮多個(gè)層面的備份,比如目前的數(shù)據(jù)量不大,可以直接做目錄的復(fù)制,同時(shí)為了保險(xiǎn)起見(jiàn),再做一個(gè)邏輯備份,記得備份/etc/my.cnf
- 切換版本,啟動(dòng)數(shù)據(jù)庫(kù)
- 這個(gè)是風(fēng)險(xiǎn)高發(fā)階段,很可能數(shù)據(jù)庫(kù)啟動(dòng)出現(xiàn)問(wèn)題。
- 常見(jiàn)的問(wèn)題是參數(shù)不兼容,比如下面的參數(shù)是5.7版本中不識(shí)別的。
- thread_concurrency = 8
- innodb_additional_mem_pool_size = 32M
- innodb_thread_concurrency = 0
- 還有MySQL的啟動(dòng)方式,是用mysqld_safe --defaults-file總是提示如下的錯(cuò)誤。
mysqld_safe Adding '/usr/local/Percona-Server-5.7.16-10-linux.x86_64.ssl101/lib/mysql/libjemalloc.so.1' to LD_PRELOAD for mysqld
mysqld_safe ld_preload libraries can only be loaded from system directories (/usr/lib64, /usr/lib, /usr/local/mysql/lib)
[1]+ Exit 1 mysqld_safe --defaults-file=/data/mysql_4306/my.cnf
而使用service的方式啟動(dòng)就沒(méi)有問(wèn)題了,可以看到方式還是有較大的差異,在/etc/init.d下面的mysql文件里有這些變量的差異性補(bǔ)充,還有Percona和MySQL社區(qū)版的文件路徑差異
root 21395 1 0 15:25 pts/2 00:00:00 /bin/sh /usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/bin/mysqld_safe --datadir=/data/mysql_4306/data --pid-file=/data/mysql_4306/tmp/mysql.pid
4.升級(jí)數(shù)據(jù)字典
數(shù)據(jù)庫(kù)啟動(dòng)之后,算是處于一個(gè)臨界狀態(tài),用的MySQL 5.7的軟件,但是數(shù)據(jù)字典還是5.5版本的。可以使用自帶的mysql_upgrade來(lái)進(jìn)行升級(jí)。
mysql_upgrade --socket=/data/mysql_4306/tmp/mysql.sock --port=4306 -uroot -pxxxx
MySQL的字典升級(jí)難得之處就是對(duì)于字典的兼容性很好,沒(méi)有了版本間的復(fù)雜依賴,處理起來(lái)真是很清爽。
會(huì)輸出一些簡(jiǎn)單日志,類似下面的形式:
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv OK
mysql.db OK
mysql.engine_cost OK
mysql.event OK
mysql.func OK
mysql.general_log OK
mysql.gtid_executed OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.host OK
mysql.innodb_index_stats OK
mysql.innodb_table_stats OK
mysql.ndb_binlog_index OK
mysql.plugin OK
mysql.proc OK
mysql.procs_priv OK
mysql.proxies_priv OK
mysql.server_cost OK
mysql.servers OK
mysql.slave_master_info OK
mysql.slave_relay_log_info OK
mysql.slave_worker_info OK
mysql.slow_log OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
Upgrading the sys schema.
Checking databases.
。。。
liteApp.banner OK
litework.attributes
error : Partitioning upgrade required. Please dump/reload to fix it or do: ALTER TABLE `litework`.`attributes` UPGRADE PARTITIONING
litework.id_sequence OK
。。。
Repairing tables
Upgrading tables
`test`.`monitor_db`
Running : ALTER TABLE `test`.`monitor_db` FORCE
status : OK
Running : ALTER TABLE `litework`.`attributes` UPGRADE PARTITIONING
status : OK
。。。
Upgrade process completed successfully.
整個(gè)過(guò)程不超過(guò)2分鐘即可搞定。
5.重啟數(shù)據(jù)庫(kù)
升級(jí)之后需要做下基本的檢查,比如查看數(shù)據(jù)庫(kù)日志,查看sys庫(kù)是否正常等。
當(dāng)然在生產(chǎn)環(huán)境中的檢查和預(yù)案就要豐富一些了,總之一句話,升級(jí)是一件風(fēng)險(xiǎn)極高的任務(wù),一定要做好完整的備份,升級(jí)不成如何降級(jí),你有了余地才有了進(jìn)步的機(jī)會(huì)。