升級MySQL8.0的歷險記

freephp發表於2021-10-28

最近忙於Fighting的專案,所以筆耕有些鬆懈,實為不該。
剛好遇到需要從MySQL5.7.33升級到MySQL8.0.x的需求,於是記錄一下整個升級過程,踩坑而過。

背景梗概:本地docker容器中使用的MySQL是5.7.33(映象系統用的是ubuntu16.04),而新專案線上上使用了MySQL8.0。從線上匯出的sql檔案(表結構+資料)中有一種低版本MySQL不會用到的字元編碼,一匯入就報錯,遇到的字符集報錯如下所示:

 - Unknown collation: 'utf8mb4_0900_ai_ci'

一頓搜尋之後,我也冷靜了下來,有兩種思路,一種是被我稱為掩耳盜鈴式解決方法,一種是根治的辦法。
掩耳盜鈴,顧名思義,不解決本質問題,而是通過批量替換字符集的方式解決報錯,也就是把檔案中所有的utf8mb4_0900_ai_ci 替換為:utf8_general_ci。
第二種就是保持和線上的MySQL版本一致,這樣就能支援該字符集。
於是我採用第二種方法,升級我的docker容器中的MySQL,順便也可以打包一個新的映象。
升級的過程也有點坎坷,但邏輯是清晰地。

  • 1.先徹底解除安裝現有版本MySQL。可以使用如下命令:
#刪除mysql的資料檔案
sudo rm -R /var/lib/mysql/
#刪除mysql的配置檔案

sudo rm -R /etc/mysql/

#自動解除安裝mysql(包括server和client)
sudo apt-get autoremove mysql* --purge
sudo apt-get remove apparmor

記得一定要刪除配置檔案,因為有可能不相容。

  • 2.下載deb並按照MySQL8.x。

可以去官網下載,官網地址為https://dev.mysql.com/repo/apt

我們選擇最新的deb下載,網址為:
https://dev.mysql.com/get/mysql-apt-config_0.8.20-1_all.deb。在命令後使用wget命令進行下載,如下:

wget https://dev.mysql.com/get/mysql-apt-config_0.8.20-1_all.deb

下載完成之後使用dpkg命令並更新apt源,然後就可以進行安裝了,完整命令如下所示:

dpkg -i mysql-apt-config_0.8.20-1_all.deb
apt-get update
apt-get install -y mysql-server

在最後一個命令執行過程中,它會讓你輸入root密碼和一些基本配置,然後就可以完成安裝了。

因為是在ubuntu裡面安裝的MySQL,所以啟動方式為:

service mysql start

你可以使用命令檢視程式執行情況,正常的時候類似如需輸出:

/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock
  • 3.建立使用者和配置許可權。
    MySQL8.0.x實際使用的過程中發現使用者授權和之前版本有點不同,需要分三步:
  1. 建立使用者。
  2. 分配許可權。
  3. 重新整理許可權。
    具體的sql語句如下,順序也是嚴格的:
create user 'freephp'@'%' identified by '176serTTc8Cg';

grant all privileges on dev_database.* to 'freephp'@'%' with grant option;

flush privileges;

上面的sql解釋一下,第一句是建立一個名為freephp的使用者,密碼為176serTTc8Cg,%代表可以任意主機進行連線。
第二句的意思是把dev_database的所有許可權賦予使用者freephp。
第三句就是立即重新整理許可權,讓新建立的許可權生效。
自此歷險記大功告成,MySQL8.0的新特性還需要探索,下次再聊。

相關文章