安裝新版本的 MySQL 可能需要升級現有安裝的這些部分
mysql
系統架構,其中包含 MySQL 伺服器執行時所需資訊的資料表(請參閱 第 7.3 節「mysql 系統架構」)。mysql
架構資料表分為兩大類資料字典資料表,儲存資料庫物件中繼資料。
系統資料表(也就是,其餘非資料字典資料表),用於其他操作用途。
其他架構,其中一些是內建的,可能被視為伺服器「擁有」,而另一些則不是
使用者架構。
與可能需要升級的安裝部分相關聯的兩個不同版本號碼
資料字典版本。這適用於資料字典資料表。
伺服器版本,也稱為 MySQL 版本。這適用於系統資料表和其他架構中的物件。
在這兩種情況下,適用於現有 MySQL 安裝的實際版本都儲存在資料字典中,而目前預期的版本則編譯到新版本的 MySQL 中。當實際版本低於目前預期的版本時,與該版本相關聯的安裝部分必須升級到目前版本。如果兩個版本都指出需要升級,則必須先進行資料字典升級。
為了反映剛才提到的兩個不同版本,升級分兩個步驟進行
步驟 1:資料字典升級。
此步驟升級
mysql
架構中的資料字典資料表。如果實際資料字典版本低於目前預期的版本,則伺服器會建立具有更新定義的資料字典資料表、將持久化的中繼資料複製到新資料表、以不可部分完成的方式將舊資料表取代為新資料表,並重新初始化資料字典。Performance Schema、
INFORMATION_SCHEMA
和ndbinfo
。
步驟 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 動作,如果伺服器認為它們不是必要的。 FORCE
與 AUTO
的不同之處在於,使用 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.db
、mysql.tables_priv
、mysql.columns_priv
和mysql.procs_priv
資料表的主索引鍵中的資料行順序會變更,以將主機名稱和使用者名稱資料行放在一起。將主機名稱和使用者名稱放在一起表示可以使用索引查詢,這可以提高CREATE USER
、DROP USER
和RENAME USER
陳述式,以及對具有多個權限的多個使用者進行 ACL 檢查的效能。如果系統有大量的使用者和權限,則必須捨棄並重新建立索引,這可能需要一些時間。步驟 2 會視需要處理所有使用者架構中的所有資料表。資料表檢查可能需要很長時間才能完成。每個資料表都會鎖定,因此在處理時其他會話無法使用。檢查和修復操作可能很耗時,尤其是對於大型資料表。資料表檢查使用
CHECK TABLE
陳述式的FOR UPGRADE
選項。如需此選項的詳細資訊,請參閱 第 15.7.3.2 節「CHECK TABLE 陳述式」。若要防止資料表檢查,請使用
--upgrade=NONE
或--upgrade=MINIMAL
選項啟動伺服器。若要強制資料表檢查,請使用
--upgrade=FORCE
選項啟動伺服器。步驟 2 會以目前的 MySQL 版本號碼標記所有已檢查和修復的資料表。這可確保下次使用相同版本的伺服器進行升級檢查時,可以確定是否需要再次檢查或修復給定的資料表。