目錄
1.升級內容
1.1 mysql系統庫
1.2.其他庫
2.步驟
2.1 步驟1:數據字典庫升級。
2.2 步驟2:服務器升級。
3.mysql_upgrade
3.1 執行正常升級(根據需要執行步驟1和2):
3.2 必要時僅執行步驟1:
3.3 根據需要執行步驟1,并強制執行步驟2
3.4 注意事項
本文主要對現有版本數據庫進行升級時升級的內容進行解釋。開發人員可以跳過,更面向于DBA,
以下內容來自Mysql8.0官方文檔。
安裝新版本的MySQL可能需要升級現有安裝的以下部分:
1.升級內容
1.1 mysql系統庫
其中包含存儲mysql服務器運行時所需信息的表(請參閱第7.3節“mysql系統架構”)。mysql模式表分為兩大類:
-數據字典表,用于存儲數據庫對象元數據。
-系統庫(即剩余的非數據字典表),用于其他操作目的。
1.2.其他庫
其中一些是內置的,可能被視為服務器“擁有”,而另一些則不是:
-performance_schema、INFORMATION_SCHEMA、ndbinfo和sys庫。
-用戶表。
兩個不同的版本成員與可能需要升級的安裝部分相關聯:
-數據字典版本。這適用于數據字典表。
-服務器版本,也稱為MySQL版本。這適用于其他數據庫實例中的系統表和對象。
在這兩種情況下,適用于現有MySQL安裝的實際版本都存儲在數據字典中,并且當前預期版本被編譯為MySQL的新版本。當實際版本低于當前預期版本時,與該版本相關聯的安裝部分必須升級到當前版本。如果兩個版本都表示需要升級,則必須首先進行數據字典升級。
作為剛才提到的兩個不同版本的反映,升級分為兩個步驟:
2.步驟
2.1 步驟1:數據字典庫升級。
升級內容
-Mysql庫中的數據字典表。如果實際的數據字典版本低于當前的預期版本,則服務器會創建具有更新定義的數據字典表,將持久化元數據復制到新表,用新表原子替換舊表,并重新初始化數據字典。
-performance_schema, INFORMATION_SCHEMA, ndbinfo
博主PS:就是說數據庫自帶的這兩表的數據字典信息。
2.2 步驟2:服務器升級。
此步驟包括所有其他升級任務。如果現有MySQL安裝的服務器版本低于新安裝的MySQL版本,則必須升級其他所有內容:
-mysql庫中的系統表(剩余的非數據字典表)。
-sys庫。
-用戶的庫。
數據字典升級(步驟1)是服務器的責任,它在啟動時根據需要執行此任務,除非使用阻止它執行此任務的選項進行調用。選項為--upgrade=NONE(自MySQL 8.0.16起),--no dd upgrade(自MySQL 8.0.16起)。
如果數據字典已過期,但服務器無法升級,則服務器不會運行,而是退出并返回錯誤。例如
[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.
3.mysql_upgrade
MySQL 8.0.16中對步驟2的責任進行了一些更改:
在MySQL 8.0.16之前,mysql_upgrade?升級了Performance Schema、INFORMATION_SCHEMA和步驟2中描述的對象。DBA應該在啟動服務器后手動調用mysql_upgrade。
從MySQL 8.0.16開始,服務器執行之前由MySQL_upgrade處理的所有任務。盡管升級仍然是一個兩步操作,但服務器同時執行這兩個操作,從而簡化了過程。
根據要升級到的MySQL版本,就地升級和邏輯升級中的說明指示服務器是否執行所有升級任務,或者在服務器啟動后是否也必須調用mysql_upgrade。
注意:
由于服務器從MySQL 8.0.16開始升級Performance Schema,?INFORMATION_SCHEMA
和步驟2中描述的對象,因此mysql_upgrade是不需要的,并且從該版本開始不推薦使用;它也許在MySQL的未來版本中被刪除。
3.1 mysql_upgrade
盡管可能需要不同的命令選項來實現特定的效果,但在MySQL 8.0.16之前和之后,步驟2期間發生的事情的大多數方面都是相同的。
從MySQL 8.0.16開始
--upgrade-server選項控制服務器是否以及如何在啟動時執行自動升級:
如果為配置或配置--upgrade=AUTO:
服務器將升級它確定為過期的任何內容(步驟1和2)。
如果配置--upgrade=NONE:
則服務器不進行任何升級(跳過步驟1和2),但如果必須升級數據字典,則服務器也會退出并返回錯誤。使用過期的數據字典運行服務器是不可能的;服務器堅持要么升級,要么退出。
配置--upgrade=MINIMAL:
服務器將根據需要升級數據字典、Performance Schema和INFORMATION_SCHEMA(步驟1)。請注意,使用此選項進行升級后,無法啟動組復制,因為復制內部所依賴的系統表不會更新,而且在其他方面功能可能也會明顯減少。
配置--upgrade=FORCE:
服務器將根據需要升級數據字典、Performance Schema和INFORMATION_SCHEMA(步驟1),并強制升級其他所有內容(步驟2)。由于服務器會檢查所有模式中的所有對象,因此使用此選項預計服務器啟動需要更長的時間。
如果服務器認為不需要執行步驟2的操作,則FORCE可用于強制執行這些操作。FORCE與AUTO的一個不同之處在于,使用FORCE,服務器會重新創建系統表,如幫助表或時區表(如果丟失)。
以下列表顯示了MySQL 8.0.16之前的升級命令以及MySQL 8.0.16及更高版本的等效命令:
3.1 執行正常升級(根據需要執行步驟1和2):
MySQL 8.0.16之前:mysqld后面跟著mysql_upgrade
截至MySQL 8.0.16:mysqld
3.2 必要時僅執行步驟1:
在MySQL 8.0.16之前:不可能執行步驟1中描述的所有升級任務,同時排除步驟2中描述的任務。但是,您可以避免升級用戶庫和sys庫,使用mysqld,然后使用--upgrade-system-tables和----skip-sys-schema選項升級mysql_upgrade。
自MySQL 8.0.16起:mysqld--升級=MINIMAL
3.3 根據需要執行步驟1,并強制執行步驟2
MySQL 8.0.16之前:mysqld后跟mysql_upgrade --force
自MySQL 8.0.16起:mysqld--upgrade=FORCE
在MySQL 8.0.16之前,某些mysql_upgrade選項會影響它執行的操作。下表顯示了從MySQL 8.0.16開始使用哪個服務器-升級選項值來實現類似的效果。(這些不一定是完全等效的,因為給定的--upgrade選項值可能會產生額外的影響。)
mysql_upgrade Option | Server Option |
---|---|
--skip-sys-schema | --upgrade=NONE?or?--upgrade=MINIMAL |
--upgrade-system-tables | --upgrade=NONE?or?--upgrade=MINIMAL |
--force | --upgrade=FORCE |
關于升級步驟2期間發生的情況的其他注意事項:
3.4 注意事項
步驟2 安裝sys庫(如果未安裝),否則將升級到當前版本。如果sys庫存在,但沒有版本視圖,則會發生錯誤,假設其不存在表示用戶創建的庫:
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庫檢查,請執行以下操作:
從MySQL 8.0.16開始:使用--upgrade=NONE或--upgrade=MINIMAL選項啟動服務器。
在MySQL 8.0.16之前:調用mysql_upgrade使用--skip-sys schema選項。
步驟2 升級系統表以確保它們具有當前結構。無論服務器還是mysql_upgrade執行該步驟,都是如此。關于幫助表和時區表的內容,mysql_upgrade不加載任何一種類型的表,而服務器加載幫助表,但不加載時區表。(也就是說,在MySQL 8.0.16之前,服務器只在數據目錄初始化時加載幫助表。從MySQL 8.0.16開始,它在初始化和升級時加載幫助表格。)加載時區表的過程取決于平臺,需要DBA進行決策,因此無法自動完成。?
從MySQL 8.0.30開始,當步驟2升級MySQL模式中的sys庫時,MySQL.db、MySQL.tables_priv、MySQL.columns_priv和MySQL.procs_priv表主鍵中的列順序被更改為將主機名和用戶名列放在一起。將主機名和用戶名放在一起意味著可以使用索引查找,這提高了CREATE user、DROP user和RENAME user語句的性能,以及具有多個權限的多個用戶的ACL檢查的性能。刪除并重新創建索引是必要的,如果系統具有大量用戶和權限,則可能需要一些時間。
要防止對表進行檢查,請執行以下操作:
從MySQL 8.0.16開始:使用--upgrade=NONE或--upgrade=MINIMAL選項啟動服務器。
在MySQL 8.0.16之前:使用--upgrade system tables選項調用mysql_upgrade。
要強制對表進行檢查,請執行以下操作:
從MySQL 8.0.16開始:使用--upgrade=FORCE選項啟動服務器。
在MySQL 8.0.16之前:使用--force選項調用mysql_upgrade。
步驟2 將MySQL版本號保存在數據目錄中名為?mysql_upgrade_info
的文件中。
要忽略mysql_upgrade_info文件并執行檢查,請執行以下操作:
從MySQL 8.0.16開始:使用--upgrade=FORCE選項啟動服務器。
在MySQL 8.0.16之前:使用--force選項調用mysql_upgrade。
筆記
mysql_upgrade_info文件已棄用;期望它在MySQL的未來版本中被刪除。
步驟2 用當前MySQL版本號標記所有檢查和修復的表。這樣可以確保下次對相同版本的服務器進行升級檢查時,可以確定是否需要再次檢查或修復給定的表。
博主PS:本文主要在于升級現有的數據庫。但實際生產環境對數據庫版本的升級是很少見的,因此本文的知識點只作為真正需要升級數據庫時的文檔查閱。或面向專業DBA運維人員備忘查閱。對日常開發人員用處不大。