MySQL 升級(jí)到8.4版本的完整流程及操作方法
本指南詳細(xì)介紹了將 MySQL 升級(jí)到 8.4 版本的完整流程、注意事項(xiàng)和操作方法。
一、升級(jí)前準(zhǔn)備 (3.1 Before You Begin)
在開始升級(jí)之前,必須仔細(xì)審閱本節(jié)信息并執(zhí)行所有推薦的操作:
- 理解升級(jí)過程:了解升級(jí)期間可能發(fā)生的情況。請(qǐng)參閱第 3.4 節(jié)“MySQL 升級(jí)過程升級(jí)的內(nèi)容”。
- 備份數(shù)據(jù):創(chuàng)建完整的數(shù)據(jù)庫備份以保護(hù)您的數(shù)據(jù)。此備份必須包含
mysql系統(tǒng)數(shù)據(jù)庫,該數(shù)據(jù)庫存儲(chǔ)了 MySQL 數(shù)據(jù)字典表和其他系統(tǒng)表。
- 備份數(shù)據(jù):創(chuàng)建完整的數(shù)據(jù)庫備份以保護(hù)您的數(shù)據(jù)。此備份必須包含
- 重要提示:
- 不支持從 MySQL 8.4 降級(jí)到 MySQL 8.3,或從一個(gè) MySQL 8.4 版本降級(jí)到更早的 MySQL 8.4 版本。
- 唯一支持的降級(jí)替代方案是恢復(fù)升級(jí)前創(chuàng)建的備份。
- 因此,在啟動(dòng)升級(jí)過程之前備份數(shù)據(jù)是絕對(duì)必要的。
- 檢查升級(jí)路徑:審閱第 3.2 節(jié)“升級(jí)路徑”,確保您計(jì)劃的升級(jí)路徑是受支持的。
- 審閱變更:審閱第 3.5 節(jié)“MySQL 8.4 中的變更”,了解升級(jí)前需要注意的變更。某些變更可能需要您采取行動(dòng)。
- 審閱廢棄和移除功能:審閱第 1.4 節(jié)“自 MySQL 8.0 以來 MySQL 8.4 的新變化”中關(guān)于廢棄和移除功能的信息。如果您使用了這些功能中的任何一項(xiàng),升級(jí)可能需要相應(yīng)更改。
- 審閱配置變量變更:審閱第 1.5 節(jié)“自 8.0 以來 MySQL 8.4 中新增、廢棄或移除的服務(wù)器和狀態(tài)變量及選項(xiàng)”。如果您使用了廢棄或已移除的變量,升級(jí)可能需要更改配置。
- 查閱發(fā)行說明:查閱 MySQL 8.4 的發(fā)行說明,了解修復(fù)、變更和新功能信息。
- 復(fù)制環(huán)境:如果使用了復(fù)制,審閱第 19.5.3 節(jié)“升級(jí)或降級(jí)復(fù)制拓?fù)?rdquo;。
- 遵循最佳實(shí)踐:審閱第 3.3 節(jié)“升級(jí)最佳實(shí)踐”并相應(yīng)地進(jìn)行規(guī)劃。
二、升級(jí)路徑 (3.2 Upgrade Paths)
注意:
- 在嘗試降級(jí)之前,請(qǐng)確保了解 MySQL 長(zhǎng)期支持 (LTS) 和創(chuàng)新版本的發(fā)布模型。
- 建議在執(zhí)行升級(jí)之前,使用 MySQL Shell 的升級(jí)檢查器工具 (
util.checkForServerUpgrade()) 檢查升級(jí)兼容性。 - 復(fù)制拓?fù)涞纳?jí)遵循第 19.5.3 節(jié)“升級(jí)或降級(jí)復(fù)制拓?fù)?rdquo;中描述的滾動(dòng)升級(jí)方案,該方案使用支持的單一服務(wù)器升級(jí)方法之一來升級(jí)每個(gè)單獨(dú)的服務(wù)器。
- 月度快速更新 (MRU) 和熱修復(fù)在此文檔中也視為發(fā)布。
表:MySQL 服務(wù)器的升級(jí)路徑
| 升級(jí)路徑 | 路徑示例 | 支持的升級(jí)方法 |
|---|---|---|
| 在同一個(gè) LTS 或 Bugfix 系列內(nèi) | 8.0.37 到 8.0.41 或 8.4.0 到 8.4.4 | 原地升級(jí)、邏輯導(dǎo)出導(dǎo)入、復(fù)制、MySQL 克隆 |
| 從 LTS/Bugfix 系列到下一個(gè) LTS 系列 | 8.0.37 到 8.4.x LTS | 原地升級(jí)、邏輯導(dǎo)出導(dǎo)入、復(fù)制 |
| 從 LTS/Bugfix 到下一個(gè) LTS 系列之前的創(chuàng)新版 | 8.0.34 到 8.3.0 或 8.4.0 到 9.0.0 | 原地升級(jí)、邏輯導(dǎo)出導(dǎo)入、復(fù)制 |
| 從創(chuàng)新系列到下一個(gè) LTS 系列 | 8.3.0 到 8.4 LTS | 原地升級(jí)、邏輯導(dǎo)出導(dǎo)入、復(fù)制 |
| 從創(chuàng)新系列到下一個(gè) LTS 系列之后的創(chuàng)新版 | 不允許 | 需要兩步:8.3.0 到 8.4 LTS,然后 8.4 LTS 到 9.x 創(chuàng)新版 |
| 在同一個(gè)創(chuàng)新系列內(nèi) | 8.1.0 到 8.3.0 | 原地升級(jí)、邏輯導(dǎo)出導(dǎo)入、復(fù)制 |
| 從 MySQL 5.7 到 LTS 或創(chuàng)新版 | MySQL 5.7 到 8.4 | 不能跳過 Bugfix 或 LTS 系列。例如,需先將 MySQL 5.7 升級(jí)到 MySQL 8.0,再將 MySQL 8.0 升級(jí)到 MySQL 8.4。 |
三、升級(jí)最佳實(shí)踐 (3.3 Upgrade Best Practices)
MySQL 支持在次要版本之間(LTS 系列內(nèi))升級(jí)和跨主版本(跨 LTS 系列)升級(jí)。升級(jí)可提供最新的功能、性能和安全性修復(fù)。
為確保成功升級(jí)到最新的 MySQL 8.4 版本,我們推薦以下最佳實(shí)踐:
- 決定升級(jí)的主版本或次版本:
- 了解 MySQL 發(fā)布模型中 LTS(長(zhǎng)期支持)和創(chuàng)新版本的區(qū)別。LTS 版本提供 8 年以上的支持,適用于生產(chǎn)環(huán)境。創(chuàng)新版本為用戶提供最新的功能和能力。
- 次要版本升級(jí)通常較簡(jiǎn)單,而主版本升級(jí)需要戰(zhàn)略規(guī)劃和額外的升級(jí)前測(cè)試。本指南對(duì)主版本升級(jí)尤其有用。
- 決定升級(jí)類型:
- 原地升級(jí) (In-place):替換 MySQL 服務(wù)器軟件包。
- 邏輯升級(jí) (Logical):將 SQL 從舊的 MySQL 實(shí)例導(dǎo)出并導(dǎo)入到新的實(shí)例。
- 復(fù)制拓?fù)渖?jí) (Replication):考慮每個(gè)服務(wù)器在拓?fù)渲械慕巧?/li>
- 審查支持的平臺(tái):
- 如果您的當(dāng)前操作系統(tǒng)不被新版本的 MySQL 支持,則計(jì)劃升級(jí)操作系統(tǒng),否則不支持原地升級(jí)。
- 查看當(dāng)前支持的平臺(tái)列表:https://www.mysql.com/support/supportedplatforms/database.html
- 了解 MySQL 服務(wù)器變更:
- 每個(gè)主版本都會(huì)帶來新功能、行為變更、廢棄項(xiàng)和移除項(xiàng)。了解這些變更對(duì)現(xiàn)有應(yīng)用的影響至關(guān)重要。
- 參閱:第 3.5 節(jié) “MySQL 8.4 中的變更”。
- 運(yùn)行升級(jí)檢查器并修復(fù)不兼容問題:
- 使用 MySQL Shell 的升級(jí)檢查器工具 (
util.checkForServerUpgrade()) 檢測(cè)數(shù)據(jù)庫版本之間必須解決的升級(jí)前不兼容問題。 - 連接到現(xiàn)有的 MySQL 服務(wù)器,并選擇計(jì)劃升級(jí)到的目標(biāo) MySQL 服務(wù)器版本。該工具將報(bào)告升級(jí)前需要解決的問題(例如數(shù)據(jù)類型、存儲(chǔ)引擎等的不兼容性)。
- 當(dāng)升級(jí)檢查器不再報(bào)告任何問題時(shí),您已準(zhǔn)備好升級(jí)。
- 使用 MySQL Shell 的升級(jí)檢查器工具 (
- 在測(cè)試環(huán)境中運(yùn)行應(yīng)用程序:
- 完成升級(jí)檢查器的要求后,下一步在目標(biāo) MySQL 服務(wù)器上測(cè)試您的應(yīng)用程序。
- 檢查 MySQL 錯(cuò)誤日志和應(yīng)用程序日志中的錯(cuò)誤和警告。
- 對(duì)應(yīng)用程序和工作負(fù)載進(jìn)行基準(zhǔn)測(cè)試:
- 建議通過比較應(yīng)用程序和工作負(fù)載在 MySQL 新舊版本上的性能表現(xiàn)來進(jìn)行基準(zhǔn)測(cè)試。通常,較新的 MySQL 版本會(huì)增加功能并提高性能,但在某些情況下,特定查詢?cè)谏?jí)后可能會(huì)變慢。
- 可能導(dǎo)致性能下降的原因包括:
- 先前的服務(wù)器配置對(duì)新版本不是最優(yōu)的
- 數(shù)據(jù)類型變更
- 多字節(jié)字符集支持需要更多存儲(chǔ)空間
- 存儲(chǔ)引擎變更
- 索引被刪除或更改
- 更強(qiáng)的加密
- 更強(qiáng)的認(rèn)證
- SQL 優(yōu)化器變更
- 新版本的 MySQL 需要更多內(nèi)存
- 物理或虛擬硬件變慢(計(jì)算或存儲(chǔ))
- 有關(guān)信息及可能的緩解技術(shù),請(qǐng)參閱 驗(yàn)證性能下降。
- 并行運(yùn)行新舊 MySQL 版本:
- 為最小化風(fēng)險(xiǎn),最好在運(yùn)行升級(jí)系統(tǒng)的同時(shí)保持當(dāng)前系統(tǒng)運(yùn)行(并行運(yùn)行)。
- 進(jìn)行最終的測(cè)試升級(jí):
- 在升級(jí)生產(chǎn)系統(tǒng)之前,進(jìn)行練習(xí)和全面測(cè)試升級(jí)流程。
- 檢查 MySQL 備份:
- 在執(zhí)行升級(jí)之前,確認(rèn)存在完整的備份并且可用。
- 升級(jí)生產(chǎn)服務(wù)器:
- 完成上述步驟后,即可進(jìn)行生產(chǎn)環(huán)境升級(jí)。
- 企業(yè)支持:
- 如果您是 MySQL 企業(yè)版客戶,還可以聯(lián)系 MySQL 支持團(tuán)隊(duì)專家咨詢?nèi)魏螁栴}。
四、MySQL 升級(jí)過程升級(jí)的內(nèi)容 (3.4 What the MySQL Upgrade Process Upgrades)
安裝新版本的 MySQL 可能需要升級(jí)現(xiàn)有安裝的以下部分:
mysql系統(tǒng)模式:包含存儲(chǔ) MySQL 服務(wù)器運(yùn)行時(shí)所需信息的表(參見第 7.3 節(jié) “mysql系統(tǒng)模式”)。mysql模式表分為兩大類:- 數(shù)據(jù)字典表:存儲(chǔ)數(shù)據(jù)庫對(duì)象元數(shù)據(jù)。
- 系統(tǒng)表(即剩余的非數(shù)據(jù)字典表):用于其他操作目的。
- 其他模式:包括一些內(nèi)置的、可視為服務(wù)器“擁有”的模式,以及其他用戶模式:
performance_schema、INFORMATION_SCHEMA、ndbinfo和sys模式。- 用戶模式。
有兩個(gè)不同的版本號(hào)與可能需要升級(jí)的部分相關(guān)聯(lián):
- 數(shù)據(jù)字典版本:適用于數(shù)據(jù)字典表。
- 服務(wù)器版本(又稱 MySQL 版本):適用于系統(tǒng)表和其他模式中的對(duì)象。
升級(jí)過程發(fā)生在兩個(gè)步驟:
- 步驟 1:數(shù)據(jù)字典升級(jí):
- 升級(jí)
mysql模式中的數(shù)據(jù)字典表、Performance Schema、INFORMATION_SCHEMA和ndbinfo。 - 由服務(wù)器在啟動(dòng)時(shí)自動(dòng)執(zhí)行(除非使用
--upgrade=NONE選項(xiàng)禁止)。 - 如果數(shù)據(jù)字典過期但被禁止升級(jí),服務(wù)器將無法啟動(dòng)并報(bào)錯(cuò)退出。
- 使用
--upgrade服務(wù)器選項(xiàng)控制自動(dòng)升級(jí)行為:--upgrade=AUTO(或無選項(xiàng)):升級(jí)所有過期的內(nèi)容(步驟 1 和 2)。--upgrade=NONE:不升級(jí)任何內(nèi)容,但如果數(shù)據(jù)字典必須升級(jí)則退出報(bào)錯(cuò)。--upgrade=MINIMAL:僅升級(jí)數(shù)據(jù)字典、Performance Schema 和INFORMATION_SCHEMA(步驟 1)。注意:此選項(xiàng)后無法啟動(dòng)組復(fù)制,且其他功能可能受限。--upgrade=FORCE:升級(jí)步驟 1 的內(nèi)容,并強(qiáng)制升級(jí)其他所有內(nèi)容(步驟 2)。啟動(dòng)時(shí)間可能較長(zhǎng)。
- 升級(jí)
- 步驟 2:服務(wù)器升級(jí):
- 升級(jí)
mysql模式中的系統(tǒng)表(剩余的非數(shù)據(jù)字典表)、sys模式和用戶模式。 - 安裝或升級(jí)
sys模式(如果存在同名用戶模式會(huì)報(bào)錯(cuò))。 - 將系統(tǒng)表升級(jí)到當(dāng)前結(jié)構(gòu)(包括幫助表,不包括時(shí)區(qū)表)。
- 更改
mysql.db,mysql.tables_priv,mysql.columns_priv,mysql.procs_priv表主鍵列順序以提升性能(對(duì)擁有大量用戶和權(quán)限的系統(tǒng)可能耗時(shí))。 - 使用
CHECK TABLE ... FOR UPGRADE檢查并處理所有用戶模式中的所有表(可能耗時(shí)且鎖表)。 - 將所有檢查和修復(fù)過的表標(biāo)記為當(dāng)前的 MySQL 版本號(hào)。
- 注意:升級(jí)過程不會(huì)升級(jí)時(shí)區(qū)表的內(nèi)容。升級(jí)時(shí)區(qū)表需手動(dòng)操作,參見第 7.1.15 節(jié) “MySQL 服務(wù)器時(shí)區(qū)支持”。
- 升級(jí)
五、MySQL 8.4 中的變更 (3.5 Changes in MySQL 8.4)
在升級(jí)到 MySQL 8.4 之前,請(qǐng)審閱以下部分描述的變更,以識(shí)別適用于您當(dāng)前 MySQL 安裝和應(yīng)用程序的變更:
- MySQL 8.4 中的不兼容變更:
- 空間索引:升級(jí)到 MySQL 8.4.4 或更高版本時(shí),建議在升級(jí)前刪除所有空間索引,升級(jí)完成后再重新創(chuàng)建它們?;蛘?,您也可以在升級(jí)后立即(但在使用包含這些索引的表之前)刪除并重新創(chuàng)建此類索引。更多信息參見第 13.4.10 節(jié) “創(chuàng)建空間索引”。
- 移除
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()函數(shù):MySQL 8.0 中已廢棄的WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()SQL 函數(shù)在 8.4 中已移除;嘗試調(diào)用它現(xiàn)在會(huì)導(dǎo)致語法錯(cuò)誤。請(qǐng)改用WAIT_FOR_EXECUTED_GTID_SET()。 authentication_fido和authentication_fido_client在某些平臺(tái)上不再可用:由于服務(wù)器捆綁的libfido2庫升級(jí)到需要 OpenSSL 1.1.1 或更高版本的 1.13.0,authentication_fido和authentication_fido_client認(rèn)證插件在 Enterprise Linux 6, Enterprise Linux 7, Solaris 11 或 SUSE Enterprise Linux 12 上不再可用。- 命令行選項(xiàng)禁止設(shè)置為
NULL:在命令行上將服務(wù)器變量設(shè)置為 SQLNULL是不支持的。在 MySQL 8.4 中,明確禁止將任何此類變量設(shè)置為NULL,嘗試這樣做將被拒絕并報(bào)錯(cuò)。特定變量(如basedir,datadir,plugin_dir等)除外。參見第 7.1.8 節(jié) “服務(wù)器系統(tǒng)變量”。 - 更多變更信息請(qǐng)參閱第 1.4 節(jié) “自 MySQL 8.0 以來 MySQL 8.4 的新變化”。
- 變更的服務(wù)器默認(rèn)值:
- 下表列出了 MySQL 8.4 與 MySQL 8.0 相比,系統(tǒng)變量默認(rèn)值發(fā)生變化的項(xiàng)目。雖然新默認(rèn)值適用于大多數(shù)用例,但在特定場(chǎng)景或需要兼容舊配置時(shí)可能需要調(diào)整。
| 分類 | 系統(tǒng)變量 | 舊默認(rèn)值 | 新默認(rèn)值 |
|---|---|---|---|
| InnoDB 變更 | innodb_adaptive_hash_index | ON | OFF |
innodb_buffer_pool_in_core_file | ON | OFF | |
innodb_buffer_pool_instances | innodb_buffer_pool_size < 1GB: 1; 否則: 8 | innodb_buffer_pool_size <= 1GB: 1; 否則: MIN( 0.5 * (innodb_buffer_pool_size / innodb_buffer_pool_chunk_size), 0.25 * number_of_cpus) | |
innodb_change_buffering | all | none | |
innodb_doublewrite_files | innodb_buffer_pool_instances * 2 | 2 | |
innodb_doublewrite_pages | innodb_write_io_threads 的值 | 128 | |
innodb_flush_method | fsync | 支持則 O_DIRECT,否則 fsync | |
innodb_io_capacity | 200 | 10000 | |
innodb_io_capacity_max | MIN(2 * innodb_io_capacity, 2000) | 2 * innodb_io_capacity | |
innodb_log_buffer_size | 16777216 (16MB) | 67108864 (64MB) | |
innodb_numa_interleave | OFF | ON | |
innodb_page_cleaners | 4 | innodb_buffer_pool_instances 的值 | |
innodb_parallel_read_threads | 4 | MIN(number_of_cpus / 8, 4) | |
innodb_purge_threads | 4 | 如果 number_of_cpus <= 16: 1; 否則: 4 | |
innodb_use_fdatasync | OFF | ON | |
| 組復(fù)制變更 | group_replication_consistency | EVENTUAL | BEFORE_ON_PRIMARY_FAILOVER |
group_replication_exit_state_action | READ_ONLY | OFFLINE_MODE | |
| 臨時(shí)表變更 | temptable_max_mmap | 1073741824 (1GB) | 0 |
temptable_max_ram | 1073741824 (1GB) | 總內(nèi)存的 3% (范圍 1-4 GB) | |
temptable_use_mmap | ON | OFF |
- 有關(guān) MySQL 8.4 中新增的選項(xiàng)或變量,請(qǐng)參閱 MySQL 服務(wù)器版本參考中的“MySQL 8.4 的選項(xiàng)和變量變更”。
- 性能模式
variables_info表顯示了每個(gè)系統(tǒng)變量的設(shè)置來源及其取值范圍。
六、準(zhǔn)備安裝進(jìn)行升級(jí) (3.6 Preparing Your Installation for Upgrade)
在升級(jí)到最新的 MySQL 8.4 版本之前,通過執(zhí)行以下初步檢查,確保您當(dāng)前的 MySQL 8.3 或 MySQL 8.4 服務(wù)器實(shí)例已做好升級(jí)準(zhǔn)備:
提示: 考慮使用 MySQL Shell 升級(jí)檢查器工具 (util.checkForServerUpgrade()) 來驗(yàn)證 MySQL 服務(wù)器實(shí)例是否已準(zhǔn)備好升級(jí)。您可以指定計(jì)劃升級(jí)到的目標(biāo) MySQL 服務(wù)器版本(從 MySQL Server 8.0.11 到與當(dāng)前 MySQL Shell 版本號(hào)匹配的 MySQL Server 版本號(hào))。該工具執(zhí)行與指定目標(biāo)版本相關(guān)的自動(dòng)檢查,并建議您應(yīng)手動(dòng)進(jìn)行的其他相關(guān)檢查。升級(jí)檢查器適用于 MySQL 的所有 Bugfix、Innovation 和 LTS 版本。MySQL Shell 安裝說明請(qǐng)參閱 此處。
初步檢查(必須不存在以下問題):
- 運(yùn)行升級(jí)兼容性檢查:
如果
mysqlcheck -u root -p --all-databases --check-upgrade
mysqlcheck報(bào)告任何錯(cuò)誤,請(qǐng)糾正這些問題。具體包括:- 沒有使用廢棄數(shù)據(jù)類型或函數(shù)的表。
- 沒有孤立的
.frm文件。 - 觸發(fā)器沒有缺失或空的定義者 (
DEFINER) 或無效的創(chuàng)建上下文(由SHOW TRIGGERS或INFORMATION_SCHEMA.TRIGGERS表中的character_set_client,collation_connection,Database Collation屬性指示)。任何此類觸發(fā)器必須導(dǎo)出并重新導(dǎo)入以修復(fù)問題。
- 檢查不支持分區(qū)的存儲(chǔ)引擎:查詢報(bào)告的任何表必須更改為使用 InnoDB 或使其變?yōu)榉欠謪^(qū)表:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';- 更改存儲(chǔ)引擎:
ALTER TABLE table_name ENGINE = INNODB;(參見第 17.6.1.5 節(jié) “將表從 MyISAM 轉(zhuǎn)換到 InnoDB”)。 - 移除分區(qū):
ALTER TABLE table_name REMOVE PARTITIONING;
- 更改存儲(chǔ)引擎:
- 檢查保留關(guān)鍵字沖突:MySQL 8.4 中的一些新保留關(guān)鍵字可能使之前用作標(biāo)識(shí)符的詞變得非法。修復(fù)方法是使用反引號(hào)
`引用標(biāo)識(shí)符。參見第 11.2 節(jié) “模式對(duì)象名稱” 和第 11.3 節(jié) “關(guān)鍵字和保留詞”。 - 檢查與數(shù)據(jù)字典表沖突的用戶表:查詢報(bào)告的任何表必須刪除或重命名 (
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE LOWER(TABLE_SCHEMA) = 'mysql' AND LOWER(TABLE_NAME) IN ( 'catalogs', 'character_sets', 'check_constraints', 'collations', 'column_statistics', 'column_type_elements', 'columns', 'dd_properties', 'events', 'foreign_key_column_usage', 'foreign_keys', 'index_column_usage', 'index_partitions', 'index_stats', 'indexes', 'parameter_type_elements', 'parameters', 'resource_groups', 'routines', 'schemata', 'st_spatial_reference_systems', 'table_partition_values', 'table_partitions', 'table_stats', 'tables', 'tablespace_files', 'tablespaces', 'triggers', 'view_routine_usage', 'view_table_usage' );RENAME TABLE)。這也可能需要更改使用這些受影響表的應(yīng)用程序。 - 檢查過長(zhǎng)的外鍵約束名 (超過 64 字符):對(duì)于約束名超過 64 字符的表,刪除該約束并使用不超過 64 字符的約束名重新添加 (
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1), INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1) FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN WHERE LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);ALTER TABLE ... DROP FOREIGN KEY ..., ADD CONSTRAINT ... FOREIGN KEY ...)。 - 檢查 SQL 模式:
sql_mode系統(tǒng)變量中不能定義已廢棄的 SQL 模式。嘗試使用已廢棄的 SQL 模式會(huì)阻止 MySQL 8.4 啟動(dòng)。應(yīng)修改使用已廢棄 SQL 模式的應(yīng)用程序以避免它們。參見服務(wù)器變更中移除的 SQL 模式。 - 確保正常關(guān)機(jī):僅升級(jí)已正確關(guān)閉的 MySQL 服務(wù)器實(shí)例。如果實(shí)例意外關(guān)閉,請(qǐng)重啟該實(shí)例并使用
innodb_fast_shutdown=0關(guān)閉它后再進(jìn)行升級(jí)。 - 檢查視圖列名長(zhǎng)度:不能有顯式定義列名超過 64 字符的視圖(MySQL 5.7 允許最多 255 字符)。為避免升級(jí)錯(cuò)誤,應(yīng)在升級(jí)前修改此類視圖。識(shí)別方法:使用
SHOW CREATE VIEW或查詢INFORMATION_SCHEMA.VIEWS表檢查視圖定義。 - 檢查 ENUM/SET 元素長(zhǎng)度:不能有單個(gè)
ENUM或SET列元素超過 255 字符或 1020 字節(jié)長(zhǎng)度的表或存儲(chǔ)過程。在 MySQL 8.4 之前,ENUM或SET列元素的最大組合長(zhǎng)度為 64K。在 MySQL 8.4 中,單個(gè)ENUM或SET列元素的最大字符長(zhǎng)度為 255,最大字節(jié)長(zhǎng)度為 1020(支持多字節(jié)字符集)。在升級(jí)到 MySQL 8.4 之前,修改任何超出新限制的ENUM或SET列元素。否則會(huì)導(dǎo)致升級(jí)失敗。 - 移除廢棄功能:您的 MySQL 8.3 安裝不能使用 MySQL 8.4 不支持的功能。例如:
- 審閱 MySQL 8.4 中移除的功能和已移除的服務(wù)器啟動(dòng)選項(xiàng)及系統(tǒng)變量(參見第 1.5 節(jié))。如果使用了其中任何一項(xiàng),升級(jí)需要更改配置。
lower_case_table_names變更注意事項(xiàng):- 如果您打算在升級(jí)時(shí)將
lower_case_table_names設(shè)置更改為1,請(qǐng)確保在升級(jí)前模式和表名都是小寫的。否則,由于模式或表名字母大小寫不匹配,可能會(huì)導(dǎo)致失敗。 - 使用以下查詢檢查包含大寫字符的模式和表名:
SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE TABLE_NAME COLLATE utf8mb4_bin <> LOWER(TABLE_NAME) COLLATE utf8mb4_bin;
- 注意:不建議在升級(jí)時(shí)更改
lower_case_table_names設(shè)置。如果lower_case_table_names=1,升級(jí)過程會(huì)檢查表和模式名是否全為小寫字符。如果發(fā)現(xiàn)包含大寫字符的表或模式名,升級(jí)過程將因錯(cuò)誤而失敗。
- 如果您打算在升級(jí)時(shí)將
升級(jí)失敗處理:
如果升級(jí)到 MySQL 8.4 因上述任何問題失敗,服務(wù)器將回滾對(duì)數(shù)據(jù)目錄的所有更改。在這種情況下,應(yīng)刪除所有重做日志文件 (ib_logfile*),在現(xiàn)有數(shù)據(jù)目錄上重新啟動(dòng) MySQL 8.3 服務(wù)器以解決錯(cuò)誤。修復(fù)錯(cuò)誤后,執(zhí)行慢速關(guān)閉 (innodb_fast_shutdown=0),然后再次嘗試升級(jí)。
七、Unix/Linux 上基于二進(jìn)制或軟件包的安裝升級(jí) (3.7)
升級(jí)方法取決于平臺(tái)和初始安裝方式:
1. 原地升級(jí) (In-Place Upgrade)
原地升級(jí)涉及關(guān)閉舊服務(wù)器,用新的二進(jìn)制文件或軟件包替換舊的,然后在現(xiàn)有數(shù)據(jù)目錄上重啟新服務(wù)器。
步驟:
- 審閱第 3.1 節(jié)信息。
- 按照第 3.6 節(jié)完成安裝準(zhǔn)備檢查。
- XA 事務(wù):如果使用 InnoDB 的 XA 事務(wù),升級(jí)前運(yùn)行
XA RECOVER檢查未提交的 XA 事務(wù)。如果有結(jié)果,使用XA COMMIT或XA ROLLBACK提交或回滾這些事務(wù)。 - 關(guān)機(jī)設(shè)置:如果通常配置
innodb_fast_shutdown=2(冷關(guān)機(jī)),請(qǐng)配置為執(zhí)行快速或慢速關(guān)機(jī):SET GLOBAL innodb_fast_shutdown = 1; -- 快速關(guān)機(jī) SET GLOBAL innodb_fast_shutdown = 0; -- 慢速關(guān)機(jī) (推薦用于跨版本升級(jí))
- 關(guān)閉舊服務(wù)器:
mysqladmin -u root -p shutdown
- 升級(jí) MySQL 二進(jìn)制文件或軟件包:
- 二進(jìn)制安裝:解壓新的 MySQL 二進(jìn)制分發(fā)包 (參見 獲取并解壓分發(fā)版)。
- 軟件包安裝:安裝新軟件包 (注意:如果最初安裝了多個(gè) RPM 包,需升級(jí)所有包,而不僅僅是服務(wù)器包)。對(duì)于 Yum/APT/SLES 倉庫安裝,請(qǐng)使用相應(yīng)的包管理器命令 (如
sudo yum update mysql-server,sudo apt-get install mysql-server)。 - 注意:對(duì)于使用 systemd 的平臺(tái) (RPM/Debian 包安裝),使用
systemctl管理服務(wù) (systemctl stop mysqld,systemctl start mysqld),而不是mysqld_safe。
- 啟動(dòng) MySQL 8.4 服務(wù)器 (使用現(xiàn)有數(shù)據(jù)目錄):
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir & # 或者對(duì)于 systemd 系統(tǒng) sudo systemctl start mysqld
- 如果有加密的 InnoDB 表空間,使用
--early-plugin-load選項(xiàng)加載密鑰環(huán)插件。
- 如果有加密的 InnoDB 表空間,使用
- 自動(dòng)升級(jí):
- 服務(wù)器啟動(dòng)時(shí)自動(dòng)檢測(cè)數(shù)據(jù)字典表是否存在。如果不存在,則在數(shù)據(jù)目錄中創(chuàng)建它們,用元數(shù)據(jù)填充,然后繼續(xù)正常啟動(dòng)序列。
- 此過程升級(jí)所有數(shù)據(jù)庫對(duì)象的元數(shù)據(jù)(數(shù)據(jù)庫、表空間、系統(tǒng)和用戶表、視圖、存儲(chǔ)程序)并移除以前用于元數(shù)據(jù)存儲(chǔ)的文件(如
.frm文件)。 - 失敗處理:如果此步驟失敗,服務(wù)器回滾更改。需刪除重做日志文件,重啟舊版服務(wù)器修復(fù)錯(cuò)誤,慢速關(guān)機(jī)后重試升級(jí)。
- 此步驟還根據(jù)需要升級(jí)
mysql系統(tǒng)數(shù)據(jù)庫,更新 Performance Schema、INFORMATION_SCHEMA、sys數(shù)據(jù)庫,并檢查所有用戶數(shù)據(jù)庫與當(dāng)前 MySQL 版本的兼容性。 - 注意:此過程不會(huì)升級(jí)時(shí)區(qū)表。升級(jí)時(shí)區(qū)表需手動(dòng)操作,參見第 7.1.15 節(jié)。
2. 邏輯升級(jí) (Logical Upgrade)
邏輯升級(jí)涉及使用 mysqldump 等工具從舊實(shí)例導(dǎo)出 SQL,安裝新服務(wù)器,然后將 SQL 導(dǎo)入到新實(shí)例。
步驟:
- 審閱第 3.1 節(jié)信息。
- 從舊安裝導(dǎo)出數(shù)據(jù):重要提示: 如果表包含生成列,請(qǐng)使用 MySQL 5.7.9 或更高版本附帶的
mysqldump -u root -p --add-drop-table --routines --events --all-databases --force > data-for-upgrade.sql
mysqldump??梢允褂?INFORMATION_SCHEMA.COLUMNS表識(shí)別帶有生成列的表。 - 關(guān)閉舊服務(wù)器:
mysqladmin -u root -p shutdown
- 安裝 MySQL 8.4:參見第 2 章 “安裝 MySQL”。
- 初始化新數(shù)據(jù)目錄:記下屏幕上顯示或?qū)懭脲e(cuò)誤日志的臨時(shí) ‘root’@‘localhost’ 密碼。
mysqld --initialize --datadir=/path/to/8.4-datadir
- 啟動(dòng) MySQL 8.4 服務(wù)器 (使用新數(shù)據(jù)目錄):
mysqld_safe --user=mysql --datadir=/path/to/8.4-datadir & # 或者對(duì)于 systemd 系統(tǒng) sudo systemctl start mysqld
- 重置 root 密碼:
mysql -u root -p Enter password: **** <- 輸入臨時(shí) root 密碼 mysql> ALTER USER USER() IDENTIFIED BY 'your new password';
- 將導(dǎo)出的 SQL 導(dǎo)入新服務(wù)器:注意:如果啟用了 GTID (
mysql -u root -p --force < data-for-upgrade.sql
gtid_mode=ON) 且轉(zhuǎn)儲(chǔ)文件包含系統(tǒng)表,不建議加載轉(zhuǎn)儲(chǔ)文件。mysqldump為非事務(wù)性的 MyISAM 系統(tǒng)表發(fā)出 DML 指令,這在啟用 GTID 時(shí)是不允許的。另外,將啟用 GTID 的服務(wù)器轉(zhuǎn)儲(chǔ)加載到另一個(gè)啟用 GTID 的服務(wù)器會(huì)生成不同的事務(wù) ID。 - 執(zhí)行剩余升級(jí)操作:
- 關(guān)閉服務(wù)器,然后使用
--upgrade=FORCE選項(xiàng)重啟以執(zhí)行剩余的升級(jí)任務(wù):
mysqladmin -u root -p shutdown mysqld_safe --user=mysql --datadir=/path/to/8.4-datadir --upgrade=FORCE & # 或者對(duì)于 systemd 系統(tǒng) (需在配置文件中設(shè)置 upgrade=FORCE 或命令行傳遞) sudo systemctl stop mysqld sudo mysqld --user=mysql --datadir=/path/to/8.4-datadir --upgrade=FORCE &
- 使用
--upgrade=FORCE重啟會(huì)強(qiáng)制進(jìn)行步驟 2 的升級(jí)任務(wù)(升級(jí)系統(tǒng)表、sys模式、檢查用戶模式中的所有對(duì)象)。 - 注意:此過程不會(huì)升級(jí)時(shí)區(qū)表。
- 關(guān)閉服務(wù)器,然后使用
3. MySQL 集群升級(jí) (MySQL Cluster Upgrade)
MySQL 集群升級(jí)遵循常規(guī)滾動(dòng)升級(jí)方案 (MGM 節(jié)點(diǎn) -> 數(shù)據(jù)節(jié)點(diǎn) -> API 節(jié)點(diǎn)/MySQL 服務(wù)器)。升級(jí)每個(gè) mysqld 有兩個(gè)步驟:
- 導(dǎo)入數(shù)據(jù)字典:使用
--upgrade=MINIMAL選項(xiàng)啟動(dòng)新的mysqld以升級(jí)數(shù)據(jù)字典但不升級(jí)系統(tǒng)表。服務(wù)器必須能連接到 NDB 集群才能完成此階段。 - 升級(jí)系統(tǒng)表:不使用
--upgrade=MINIMAL選項(xiàng)重啟每個(gè)mysqld。
八、使用 MySQL Yum 倉庫升級(jí) (3.8)
適用于支持的 Yum-based 平臺(tái) (參見第 2.5.1 節(jié))。
- 選擇目標(biāo)系列:
- 默認(rèn)情況下,MySQL Yum 倉庫會(huì)將 MySQL 更新到您安裝時(shí)選擇的發(fā)布軌道中的最新版本(例如,8.0.x 安裝不會(huì)自動(dòng)更新到 8.4.x)。
- 要更新到另一個(gè)發(fā)布系列,必須首先禁用當(dāng)前選定的子倉庫,并為目標(biāo)系列啟用子倉庫。編輯
/etc/yum.repos.d/mysql-community.repo文件中的子倉庫條目。 - 一般規(guī)則:從一個(gè) Bugfix 系列升級(jí)到另一個(gè)時(shí),應(yīng)升級(jí)到下一個(gè) Bugfix 系列,而不是跳過一個(gè)。例如,從 MySQL 5.7 升級(jí)到 8.4,應(yīng)先升級(jí)到 MySQL 8.0,再升級(jí)到 8.4。
- MySQL Yum 倉庫不支持原地降級(jí)。降級(jí)請(qǐng)參見第 4 章。
- 升級(jí) MySQL:注意:MySQL 服務(wù)器在通過 Yum 更新后總是會(huì)重啟。
sudo yum update mysql-server # 非 dnf 系統(tǒng) sudo dnf upgrade mysql-server # dnf 系統(tǒng) # 或者更新整個(gè)系統(tǒng) sudo yum update # 非 dnf 系統(tǒng) sudo dnf upgrade # dnf 系統(tǒng) # 升級(jí)特定組件 (先列出:`sudo yum list installed | grep "^mysql"`) sudo yum update package-name # 非 dnf 系統(tǒng) sudo dnf upgrade package-name # dnf 系統(tǒng)
- 升級(jí)共享客戶端庫:
- 使用舊的共享客戶端庫編譯的應(yīng)用程序在更新后應(yīng)繼續(xù)工作。
- 如果重新編譯應(yīng)用程序并動(dòng)態(tài)鏈接到更新后的庫,則需要在部署這些應(yīng)用程序的系統(tǒng)上也部署 MySQL 提供的新共享庫包。為此,請(qǐng)?jiān)谶@些系統(tǒng)上添加 MySQL Yum 倉庫并安裝最新的共享庫。
九、使用 MySQL APT 倉庫升級(jí) (3.9)
在 Debian 和 Ubuntu 平臺(tái)上,使用 MySQL APT 倉庫執(zhí)行原地升級(jí)。具體步驟參見 使用 MySQL APT 倉庫升級(jí) MySQL。
十、使用 MySQL SLES 倉庫升級(jí) (3.10)
在 SUSE Linux Enterprise Server (SLES) 平臺(tái)上,使用 MySQL SLES 倉庫執(zhí)行原地升級(jí)。具體步驟參見 使用 MySQL SLES 倉庫升級(jí) MySQL。
十一、在 Windows 上升級(jí) (3.11)
升級(jí)方法取決于現(xiàn)有安裝方式:
1. 使用 MSI 安裝程序升級(jí)
- 下載并執(zhí)行最新的 MySQL Server MSI。
- 雖然不支持直接跨系列升級(jí),但“自定義安裝”選項(xiàng)允許指定安裝位置(否則默認(rèn)安裝到
C:\Program Files\MySQL\MySQL Server 8.4\)。 - 運(yùn)行捆綁的 MySQL 配置器 (MySQL Configurator) 來配置新安裝。
參考鏈接:https://dev.mysql.com/doc/refman/8.4/en/upgrading.html
到此這篇關(guān)于MySQL 升級(jí)到8.4版本的完整流程及操作方法的文章就介紹到這了,更多相關(guān)mysql8.4版本升級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在linux系統(tǒng)中使用通用包安裝Mysql的步驟
本文詳細(xì)介紹了在Linux系統(tǒng)上安裝MySQL 8.0的完整流程,包括下載校驗(yàn)安裝包、解壓部署、創(chuàng)建用戶與數(shù)據(jù)目錄、初始化數(shù)據(jù)庫、配置系統(tǒng)服務(wù)等步驟,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-10-10
MySQL中EXPLAIN命令的使用場(chǎng)景及作用解讀
這篇文章主要介紹了MySQL中EXPLAIN命令的使用場(chǎng)景及作用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-08-08
MySQL數(shù)據(jù)庫中外鍵(foreign?key)用法詳解
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫中外鍵(foreign?key)的相關(guān)資料,MySQL 外鍵約束可以用來保證表與表之間的關(guān)系完整性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
MySQL表設(shè)計(jì)和聚合函數(shù)以及正則表達(dá)式示例詳解
聚合函數(shù)在數(shù)據(jù)庫管理和分析中有著廣泛的應(yīng)用場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于MySQL表設(shè)計(jì)和聚合函數(shù)以及正則表達(dá)式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-07-07
SQL筆記之?dāng)?shù)據(jù)庫結(jié)構(gòu)優(yōu)化方式
這篇文章主要介紹了SQL筆記之?dāng)?shù)據(jù)庫結(jié)構(gòu)優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
MySql中 is Null段判斷無效和IFNULL()失效的解決方案
這篇文章主要介紹了MySql中 is Null段判斷無效和IFNULL()失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
MySQL全文索引在數(shù)據(jù)庫中的應(yīng)用和優(yōu)勢(shì)(模糊查詢不用like+%)
全文索引技術(shù)可以有效地從大量文本中檢索信息,適用于搜索引擎和電商平臺(tái)等場(chǎng)景,InnoDB從MySQL5.6開始支持全文索引,使用倒排索引實(shí)現(xiàn),全文檢索分為自然語言搜索、布爾搜索和查詢擴(kuò)展搜索三種模式,全文索引提高了模糊查詢的效率,優(yōu)化了基于文本的搜索查詢2024-09-09

