MySQL 8.4 參考手冊  /  升級 MySQL  /  MySQL 升級程序升級的內容

3.4 MySQL 升級程序升級的內容

安裝新版本的 MySQL 可能需要升級現有安裝的這些部分

  • mysql 系統架構,其中包含 MySQL 伺服器執行時所需資訊的資料表(請參閱 第 7.3 節「mysql 系統架構」)。mysql 架構資料表分為兩大類

    • 資料字典資料表,儲存資料庫物件中繼資料。

    • 系統資料表(也就是,其餘非資料字典資料表),用於其他操作用途。

  • 其他架構,其中一些是內建的,可能被視為伺服器「擁有」,而另一些則不是

與可能需要升級的安裝部分相關聯的兩個不同版本號碼

  • 資料字典版本。這適用於資料字典資料表。

  • 伺服器版本,也稱為 MySQL 版本。這適用於系統資料表和其他架構中的物件。

在這兩種情況下,適用於現有 MySQL 安裝的實際版本都儲存在資料字典中,而目前預期的版本則編譯到新版本的 MySQL 中。當實際版本低於目前預期的版本時,與該版本相關聯的安裝部分必須升級到目前版本。如果兩個版本都指出需要升級,則必須先進行資料字典升級。

為了反映剛才提到的兩個不同版本,升級分兩個步驟進行

  • 步驟 1:資料字典升級。

    此步驟升級

    • mysql 架構中的資料字典資料表。如果實際資料字典版本低於目前預期的版本,則伺服器會建立具有更新定義的資料字典資料表、將持久化的中繼資料複製到新資料表、以不可部分完成的方式將舊資料表取代為新資料表,並重新初始化資料字典。

    • Performance Schema、INFORMATION_SCHEMAndbinfo

  • 步驟 2:伺服器升級。

    此步驟包含所有其他升級任務。如果現有 MySQL 安裝的伺服器版本低於新安裝的 MySQL 版本,則必須升級所有其他內容

    • mysql 架構中的系統資料表(其餘非資料字典資料表)。

    • sys 架構。

    • 使用者架構。

資料字典升級(步驟 1)是伺服器的責任,伺服器會在啟動時視需要執行此任務,除非使用選項來阻止其執行此操作。該選項是 --upgrade=NONE

如果資料字典過時,但伺服器被阻止升級它,則伺服器不會執行,而是會出現錯誤並結束。例如

[ERROR] [MY-013381] [Server] Server shutting down because upgrade is
required, yet prohibited by the command line option '--upgrade=NONE'.
[ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.

--upgrade 伺服器選項控制伺服器是否以及如何在啟動時執行自動升級

  • 如果沒有選項或使用 --upgrade=AUTO,則伺服器會升級它認為已過期的任何內容(步驟 1 和 2)。

  • 使用 --upgrade=NONE,伺服器不會升級任何內容(略過步驟 1 和 2),但如果必須升級資料字典,也會出現錯誤並結束。無法在過時的資料字典下執行伺服器;伺服器堅持要麼升級它,要麼結束。

  • 使用 --upgrade=MINIMAL,伺服器會視需要升級資料字典、Performance Schema 和 INFORMATION_SCHEMA(步驟 1)。請注意,在使用此選項升級後,無法啟動群組複寫,因為複寫內部所依賴的系統資料表未更新,並且其他區域也可能會出現功能減少的情況。

  • 使用 --upgrade=FORCE,伺服器會視需要升級資料字典、Performance Schema 和 INFORMATION_SCHEMA(步驟 1),並強制升級所有其他內容(步驟 2)。由於伺服器會檢查所有架構中的所有物件,因此使用此選項時,預期伺服器啟動時間會更長。

FORCE 可用於強制執行步驟 2 動作,如果伺服器認為它們不是必要的。 FORCEAUTO 的不同之處在於,使用 FORCE 時,伺服器會重新建立系統資料表,例如說明資料表或時區資料表,如果它們遺失的話。

關於升級步驟 2 期間發生的其他注意事項

  • 步驟 2 會安裝 sys 架構(如果尚未安裝),否則會將其升級到目前版本。如果 sys 架構存在,但沒有 version 檢視,則會發生錯誤,因為假設它的不存在表示使用者建立的架構

    A sys schema exists with no sys.version view. If
    you have a user created sys schema, this must be renamed for the
    upgrade to succeed.

    若要在這種情況下升級,請先移除或重新命名現有的 sys 架構。然後再次執行升級程序。(可能需要強制執行步驟 2。)

    若要防止 sys 架構檢查,請使用 --upgrade=NONE--upgrade=MINIMAL 選項啟動伺服器。

  • 步驟 2 會升級系統資料表,以確保它們具有目前的結構,這包括說明資料表,但不包括時區資料表。載入時區資料表的程序與平台相關,需要 DBA 做出決策,因此無法自動完成。

  • 當步驟 2 升級 mysql 架構中的系統資料表時,mysql.dbmysql.tables_privmysql.columns_privmysql.procs_priv 資料表的主索引鍵中的資料行順序會變更,以將主機名稱和使用者名稱資料行放在一起。將主機名稱和使用者名稱放在一起表示可以使用索引查詢,這可以提高 CREATE USERDROP USERRENAME USER 陳述式,以及對具有多個權限的多個使用者進行 ACL 檢查的效能。如果系統有大量的使用者和權限,則必須捨棄並重新建立索引,這可能需要一些時間。

  • 步驟 2 會視需要處理所有使用者架構中的所有資料表。資料表檢查可能需要很長時間才能完成。每個資料表都會鎖定,因此在處理時其他會話無法使用。檢查和修復操作可能很耗時,尤其是對於大型資料表。資料表檢查使用 CHECK TABLE 陳述式的 FOR UPGRADE 選項。如需此選項的詳細資訊,請參閱 第 15.7.3.2 節「CHECK TABLE 陳述式」

    若要防止資料表檢查,請使用 --upgrade=NONE--upgrade=MINIMAL 選項啟動伺服器。

    若要強制資料表檢查,請使用 --upgrade=FORCE 選項啟動伺服器。

  • 步驟 2 會以目前的 MySQL 版本號碼標記所有已檢查和修復的資料表。這可確保下次使用相同版本的伺服器進行升級檢查時,可以確定是否需要再次檢查或修復給定的資料表。