目錄
- 前言
- 1. 升級概述
- 1.1 升級背景
- 1.2 升級目的
- 1.3 升級方法概述
- 1.4 升級策略與注意事項
- 2. 升級準備
- 2.1 備份工作
- 2.2 下載目標版本
- 2.3 停止 MySQL 服務
- 3. 替換二進制文件
- 3.1 解壓官方二進制包
- 3.2 替換核心二進制文件
- 3.3 更新共享庫
- 4. 執行升級并驗證
- 4.1 啟動 MySQL 服務
- 4.2 監控錯誤日志
- 4.3 執行 `mysql_upgrade`
- 4.4 重啟 MySQL 服務
- 4.5 驗證升級
- 5. 回滾方案
- 5.1 停止服務
- 5.2 恢復舊的二進制文件
- 5.3 啟動舊版本服務
- 5.4 終極恢復
- 6. 升級過程總結
- 7. 總結
前言
在日常的數據庫運維工作中,MySQL 是我們最常接觸的數據庫之一。隨著業務的不斷發展和對性能的要求越來越高,及時升級 MySQL 到最新版本是非常必要的。通常,很多開發和運維人員都習慣通過包管理工具(如 YUM/DNF)安裝 MySQL,這樣雖然方便,但也帶來了版本更新時二進制文件分散的問題。
本篇文章將講解如何使用官方的 MySQL 二進制包進行版本升級,特別是針對通過 YUM/DNF 安裝的 MySQL 5.7.32 升級到 5.7.44 的場景。本文提供了詳細的操作步驟、注意事項以及回滾方案,幫助你順利完成 MySQL 的升級。
1. 升級概述
1.1 升級背景
對于通過YUM/DNF安裝的MySQL,其特點是:
- 沒有單一的“安裝目錄”。二進制文件、庫文件、配置文件等被分散安裝到系統的標準目錄中。
mysqld
二進制文件通常在/usr/sbin/mysqld
。- 配置文件在
/etc/my.cnf
和/etc/my.cnf.d/
。 - 數據文件在
/var/lib/mysql
。 - 錯誤日志在
/var/log/mysqld.log
。
通過 YUM/DNF 安裝的 MySQL 版本會將 MySQL 的文件分散到多個系統目錄中,包括二進制文件、庫文件、配置文件和日志文件等。隨著 MySQL 版本的不斷發展,可能會出現某些功能和性能優化上的問題,導致用戶需要手動升級到新版本。在此場景下,我們采用“原地替換”的方式,將舊版本的二進制文件替換為官方二進制包中的新版本。
1.2 升級目的
- 修復安全漏洞
MySQL 5.7.32 可能存在一些已知的安全漏洞,升級到 5.7.44 可以修復這些漏洞,增強數據庫的安全性,防止潛在的攻擊。
- 提高性能和穩定性
新版本的 MySQL 通常包含了性能優化、bug 修復和一些系統級改進,有助于提升數據庫的響應速度和穩定性,尤其是在處理高并發、大數據量時。
- 兼容性和功能增強
通過升級,能夠享受新版本帶來的功能增強,比如更好的 JSON 支持、優化的查詢執行計劃、提升的備份和恢復功能等。
- 解決兼容性問題
升級后,可能修復了與其他軟件版本(如操作系統、應用程序等)的兼容性問題,避免由于版本差異導致的故障。
1.3 升級方法概述
本次升級的核心思想是用新版本的二進制包模擬集中式安裝,并覆蓋分散的舊版本二進制文件,保留原有配置和數據,使用系統原有的服務管理工具進行服務管理。我們將采用以下步驟來實現這一目標:
- 備份舊數據
- 解壓官方二進制包
- 替換 MySQL 二進制文件
- 啟動新版本并完成升級
1.4 升級策略與注意事項
策略:我們將解壓官方二進制包,并將其主要文件手動覆蓋到系統對應的分散目錄中(如 /usr/bin
, /usr/sbin
),同時保留所有舊的配置文件、數據目錄和服務管理方式。
重要警告:
- 此操作不可逆:直接用新文件覆蓋舊文件,難以直接回滾到舊的RPM安裝狀態。因此,備份是絕對必要的。
- 兼容性:5.7.32 -> 5.7.44 是小版本升級,極度平滑,此方法風險很低。
- 服務管理:升級后,你仍然使用
systemctl start mysqld
來管理服務,因為我們將保留原有的systemd
服務單元文件。
2. 升級準備
2.1 備份工作
在進行任何升級之前,備份是不可忽視的關鍵步驟。備份工作不僅僅是為了防止數據丟失,也是為了確保升級過程中萬一出現問題時可以進行恢復。
-
邏輯備份(最重要的備份):使用
mysqldump
工具備份所有數據庫及相關設置。mysqldump -u root -p --port=2020 --all-databases --events --routines --triggers --master-data=2 > /opt/full_backup_before_upgrade.sql
-
物理備份(包括數據目錄和配置文件):
systemctl stop mysqld tar -czvf /opt/mysql_data_backup.tar.gz /var/lib/mysql/ tar -czvf /opt/mysql_config_backup.tar.gz /etc/my.cnf /etc/my.cnf.d/
-
備份舊的二進制文件(關鍵!用于回滾):
mkdir /opt/mysql_old_bin_backup cp -p /usr/bin/mysql /usr/bin/mysqldump /usr/sbin/mysqld /opt/mysql_old_bin_backup/ 2>/dev/null || :
-
重新啟動 MySQL 服務:
systemctl start mysqld
2.2 下載目標版本
-
下載官方二進制包:你可以從 MySQL 官網https://downloads.mysql.com/archives/community/
下載適合你操作系統的版本,這里我們以 5.7.44 為例。上傳并放到/opt/
目錄中。
cd /opt wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz
2.3 停止 MySQL 服務
為了替換二進制文件,我們需要停止 MySQL 服務:
systemctl stop mysqld
3. 替換二進制文件
3.1 解壓官方二進制包
在替換文件之前,首先解壓下載的官方二進制包:
tar -xzf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz
cd mysql-5.7.44-linux-glibc2.12-x86_64
3.2 替換核心二進制文件
核心步驟是用新版本的二進制文件覆蓋系統中對應的舊版本文件。這里我們將逐個替換 MySQL 的二進制文件,以下是一些重要的文件:
-
替換
mysqld
守護進程:cp -p ./bin/mysqld /usr/sbin/mysqld.new mv /usr/sbin/mysqld.new /usr/sbin/mysqld chmod 755 /usr/sbin/mysqld
-
替換
mysql
客戶端:cp -p ./bin/mysql /usr/bin/mysql.new mv /usr/bin/mysql.new /usr/bin/mysql
-
替換
mysqldump
工具:cp -p ./bin/mysqldump /usr/bin/mysqldump.new mv /usr/bin/mysqldump.new /usr/bin/mysqldump
-
替換
mysql_upgrade
工具:cp -p ./bin/mysql_upgrade /usr/bin/mysql_upgrade.new mv /usr/bin/mysql_upgrade.new /usr/bin/mysql_upgrade
-
替換其他工具:你可以根據需要替換其他工具,如
mysqlcheck
,mysqladmin
等。cp -p ./bin/mysqlcheck /usr/bin/mysqlcheck.new mv /usr/bin/mysqlcheck.new /usr/bin/mysqlcheck
3.3 更新共享庫
在某些情況下,你可能需要更新 MySQL 使用的共享庫。你可以將新的庫文件復制到系統目錄,確保 mysqld
可以找到它們。
cp -p ./lib/* /usr/lib64/mysql/ || :
cp -p ./lib/* /usr/lib64/
4. 執行升級并驗證
4.1 啟動 MySQL 服務
啟動 MySQL 服務,觸發新版本的 mysqld
自動檢測并升級數據字典:
systemctl start mysqld
4.2 監控錯誤日志
使用以下命令查看 MySQL 啟動日志,確認新版本是否成功啟動:
tail -f /var/log/mysqld.log
當看到類似 MySQL 5.7.44
的版本信息時,表示升級成功。
4.3 執行 mysql_upgrade
MySQL 5.7 版本要求執行 mysql_upgrade
來升級系統表結構:
mysql_upgrade -u root -p --port=2020
當最后顯示 OK
時,表示 mysql_upgrade
執行成功。
4.4 重啟 MySQL 服務
重啟 MySQL 服務,使 mysql_upgrade
的更改生效:
systemctl restart mysqld
4.5 驗證升級
通過以下命令驗證 MySQL 版本和數據庫狀態:
mysql -u root -p --port=2020 -e "SELECT VERSION();"
mysql -u root -p --port=2020 -e "SHOW DATABASES;"
5. 回滾方案
如果升級過程中出現問題,我們可以通過回滾操作恢復到舊版本。
5.1 停止服務
首先停止 MySQL 服務:
systemctl stop mysqld
5.2 恢復舊的二進制文件
從備份中恢復舊版本的二進制文件:
cp -p /opt/mysql_old_bin_backup/mysqld /usr/sbin/
cp -p /opt/mysql_old_bin_backup/mysql /usr/bin/
cp -p /opt/mysql_old_bin_backup/mysqldump /usr/bin/
5.3 啟動舊版本服務
恢復后,可以啟動原來的 5.7.32 版本:
systemctl start mysqld
5.4 終極恢復
如果二進制回滾后仍無法啟動,可以使用物理備份恢復數據:
systemctl stop mysqld
rm -rf /var/lib/mysql/*
tar -xzf /opt/mysql_data_backup.tar.gz -C /
systemctl start mysqld
6. 升級過程總結
對于分散安裝的MySQL升級到官方二進制包,流程如下:
- 備份:邏輯備份 + 物理備份 + 二進制文件備份。
- 停服務:
systemctl stop mysqld
。 - 換文件:用新版本二進制包中的文件,逐個替換系統目錄 (
/usr/sbin/
,/usr/bin/
) 中的舊文件。 - 再啟動:啟動服務完成自動數據字典升級。
- 跑工具:必須執行
mysql_upgrade
。 - 再重啟:使更改生效。
- 做驗證。
這種方法既享受了官方最新二進制包的好處,又保留了原有系統的配置和服務管理方式,是此類升級場景下的最優解。
7. 總結
本文詳細介紹了通過官方二進制包將 MySQL 5.7.32 升級到 5.7.44 的操作步驟,涵蓋了備份、替換二進制文件、執行升級和回滾方案等內容。通過這種“替換式”升級方法,我們能夠在保留原有配置和數據的同時,順利完成 MySQL 的版本升級。在進行升級時,請務必遵循每個步驟,確保備份工作完善,以便在出現問題時能夠及時恢復。