util.checkForServerUpgrade()
函式是一個升級檢查工具,可讓您驗證 MySQL 伺服器執行個體是否已準備好進行升級。您可以選取計劃升級的目標 MySQL 伺服器版本,範圍從第一個 MySQL 伺服器 8.0 一般可用性 (GA) 版本 (8.0.11),到與目前 MySQL Shell 版本號碼相符的 MySQL 伺服器版本號碼。升級檢查工具會執行與指定目標版本相關的自動檢查,並建議您應該手動進行的其他相關檢查。
您可以使用升級檢查工具來檢查 MySQL 5.7 伺服器執行個體,以及 MySQL 8.x 版本系列內另一個 GA 狀態版本的 MySQL 8.x 伺服器執行個體,以找出升級的相容性錯誤和問題。如果您在未指定 MySQL 伺服器執行個體的情況下呼叫 checkForServerUpgrade()
,則會檢查目前連線至全域工作階段的執行個體。若要查看目前連線的執行個體,請發出 \status
命令。
升級檢查工具不支援檢查舊於 MySQL 5.7 的 MySQL 伺服器執行個體。
MySQL 伺服器僅支援從 5.7 開始的 GA 版本之間進行升級。不支援從非 GA 版本升級。如需有關支援的升級路徑的詳細資訊,請參閱升級路徑。
升級檢查工具可以檢查伺服器執行個體的組態檔 (my.cnf
或 my.ini
)。該工具會檢查組態檔中定義但在目標 MySQL 伺服器版本中已移除的任何系統變數,以及組態檔中未定義且在目標 MySQL 伺服器版本中將具有不同預設值的任何系統變數。對於這些檢查,當您呼叫 checkForServerUpgrade()
時,您必須提供組態檔的檔案路徑。
升級檢查工具可以文字格式 (預設) 或 JSON 格式產生其輸出,JSON 格式可能更易於剖析和處理,以便在開發維運自動化中使用。
升級檢查工具可以使用 X Protocol 連線或傳統 MySQL 通訊協定連線,透過 TCP 或 Unix Socket 運作。您可以預先建立連線,或將其指定為函式的引數。該工具始終建立新的工作階段以連線至伺服器,因此 MySQL Shell 全域工作階段不受影響。
用於執行升級檢查工具的使用者帳戶需要 RELOAD
、PROCESS
和 SELECT
權限。
升級檢查工具具有以下簽名
checkForServerUpgrade (ConnectionData connectionData, Dictionary options)
兩個引數都是選用的。第一個引數提供連線資料 (如果連線尚不存在),第二個引數是一個字典,您可以使用它來指定以下選項
-
password
用於執行升級檢查工具的使用者帳戶的密碼。您可以使用此字典選項或作為連線詳細資訊的一部分來提供密碼。如果您不提供密碼,該工具會在連線到伺服器時提示輸入密碼。
-
targetVersion
您計劃升級的目標 MySQL 伺服器版本。您可以指定從 8.0.11 (第一個 MySQL 伺服器 8.0 GA 版本) 到與您正在使用的 MySQL Shell 版本號碼相同的 MySQL 伺服器版本號碼的任何版本。如果您指定短格式版本號碼 (例如 8.0) 或省略
targetVersion
選項,則該工具會檢查是否升級到與您正在使用的 MySQL Shell 版本號碼相符的 MySQL 伺服器版本號碼。-
configPath
您要檢查的 MySQL 伺服器執行個體的
my.cnf
或my.ini
組態檔的本機路徑,例如C:\ProgramData\MySQL\MySQL Server 8.1\my.ini
。如果您省略檔案路徑,而且升級檢查工具需要執行需要組態檔的檢查,則該檢查會失敗,並顯示一則訊息,通知您必須指定檔案路徑。-
outputFormat
從升級檢查工具傳回的輸出格式。如果您省略選項,則預設值為文字格式 (
TEXT
)。如果您指定JSON
,則會改為傳回格式良好的 JSON 輸出,其格式列於來自升級檢查工具的 JSON 輸出。-
include
-
要執行的升級檢查的逗號分隔清單。只會執行指定的檢查。如果檢查同時在
include
和exclude
清單中定義,則會傳回錯誤。例如
"include": ["invalidPrivileges", "removedSysVars", "sysVarsNewDefaults"]
請參閱工具程式檢查。
-
exclude
-
要忽略的升級檢查的逗號分隔清單。如果檢查同時在 include 和 exclude 清單中定義,則會傳回錯誤。
例如
"exclude": ["invalidPrivileges", "removedSysVars", "sysVarsNewDefaults"]
請參閱工具程式檢查。
-
list
-
傳回目前組態中包含和排除的所有檢查的清單、檢查的描述以及適用的版本。
例如
{"list": true, "targetVersion": "8.4.0"}
請參閱工具程式檢查。
例如,以下命令會驗證,然後檢查目前連線至全域工作階段的 MySQL 伺服器執行個體,並以文字格式輸出
mysqlsh> \status
\status
MySQL Shell version 8.1.0-commercial
...
Server version: 8.1.0-commercial MySQL Enterprise Server - Commercial
...
mysqlsh> util.checkForServerUpgrade()
以下命令會檢查 URI user@example.com:3306
的 MySQL 伺服器是否升級至 MySQL 伺服器版本 8.1.0。使用者密碼和組態檔路徑會作為選項字典的一部分提供,且輸出會以預設的文字格式傳回
mysqlsh> util.checkForServerUpgrade('user@example.com:3306',
{"password":"password", "targetVersion":"8.1.0", "configPath":"C:/ProgramData/MySQL/MySQL Server 8.0/my.ini"})
以下命令會檢查同一部 MySQL 伺服器是否升級至與目前 MySQL Shell 版本號碼相符的 MySQL 伺服器版本號碼 (預設值),並傳回 JSON 輸出以進行進一步處理
mysqlsh> util.checkForServerUpgrade('user@example.com:3306',
{"password":"password", "outputFormat":"JSON", "configPath":"C:/ProgramData/MySQL/MySQL Server 8.0/my.ini"})
您可以使用 mysqlsh 命令介面從命令列啟動升級檢查工具。如需有關此語法的資訊,請參閱第 5.8 節「API 命令列整合」。以下範例會檢查 MySQL 伺服器是否升級至版本 8.0.27,並傳回 JSON 輸出
mysqlsh -- util checkForServerUpgrade user@localhost:3306
--target-version=8.0.27 --output-format=JSON --config-path=/etc/mysql/my.cnf
連線資料也可以使用大括號括起來的分組命名選項來指定,如下列範例所示,該範例也顯示可以使用小寫和連字號來表示方法名稱,而不是 camelCase
mysqlsh -- util check-for-server-upgrade { --user=user --host=localhost --port=3306 }
--target-version=8.0.27 --output-format=JSON --config-path=/etc/mysql/my.cnf
以下範例使用 Unix Socket 連線,並顯示從命令列呼叫工具程式的舊格式,該格式仍然有效
./bin/mysqlsh --socket=/tmp/mysql.sock --user=user -e "util.checkForServerUpgrade()"
若要取得升級檢查工具的說明,請發出
mysqlsh> util.help("checkForServerUpgrade")
util.checkForServerUpgrade()
不會傳回值。
當您呼叫升級檢查工具時,MySQL Shell 會連線到伺服器執行個體,並測試準備安裝以進行升級中描述的設定。輸出類似於以下內容
The MySQL server at example.com:3306, version
5.7.33-enterprise-commercial-advanced - MySQL Enterprise Server - Advanced Edition (Commercial),
will now be checked for compatibility issues for upgrade to MySQL 8.0.29...
1) Usage of old temporal type
No issues found
2) Usage of db objects with names conflicting with new reserved keywords
Warning: The following objects have names that conflict with new reserved keywords.
Ensure queries sent by your applications use `quotes` when referring to them or they will result in errors.
More information: https://mysqldev.dev.org.tw/doc/refman/en/keywords.html
dbtest.System - Table name
dbtest.System.JSON_TABLE - Column name
dbtest.System.cube - Column name
3) Usage of utf8mb3 charset
Warning: The following objects use the utf8mb3 character set. It is recommended to convert them to use
utf8mb4 instead, for improved Unicode support.
More information: https://mysqldev.dev.org.tw/doc/refman/8.0/en/charset-unicode-utf8mb3.html
dbtest.view1.col1 - column's default character set: utf8
............................
............................
Errors: 7
Warnings: 36
Notices: 0
7 errors were found. Please correct these issues before upgrading to avoid compatibility issues.
在此範例中,在檢查伺服器上找到的伺服器執行個體上執行的檢查傳回了一些升級案例的錯誤,因此在將伺服器執行個體升級到目標 MySQL 8.0 版本之前,需要進行變更。
當您完成必要的變更以清除報告中的錯誤計數後,您也應該考慮進行進一步的變更以移除警告。這些組態上的改進將使伺服器實例更相容於目標版本。然而,即使不移除警告,伺服器實例仍然可以成功升級。
升級檢查工具也可能會針對無法自動化且您應手動進行的進一步相關檢查提供建議和說明,這些檢查會被評為警告或注意(資訊性)級別。
升級檢查工具會執行以下檢查
oldTemporal
:檢查是否使用了已棄用的時間類型。routineSyntax
:檢查常式語法是否與保留關鍵字衝突。請參閱關鍵字和保留字。reservedKeywords
:檢查資料庫物件名稱是否與保留關鍵字衝突。請參閱關鍵字和保留字。utf8mb3
:檢查是否使用了 utf8mb3 字元集。雖然支援 utf8mb3,但建議使用 utf8mb4 以改進 Unicode 支援。請參閱utf8mb3 字元集(3 位元組 UTF-8 Unicode 編碼)。mysqlSchema
:檢查mysql
綱要中的資料表名稱是否與目標版本中的資料表衝突。nonNativePartitioning
:檢查是否使用非原生分割的已分割資料表。foreignKeyLength
:檢查外鍵約束名稱是否超過 64 個字元。請參閱準備您的安裝以進行升級。maxdbSqlModeFlags
:檢查是否使用了已過時的sql_mode
旗標MAXDB
。obsoleteSqlModeFlags
:檢查是否使用了已過時的sql_mode
旗標。enumSetElementLength
:檢查是否ENUM
/SET
資料行定義包含長度超過 255 個字元的元素。partitionedTablesInSharedTablespaces
:檢查共享表格空間中是否有已分割的資料表。circularDirectory
:檢查表格空間資料檔案路徑中是否有循環目錄參照。removedFunctions
:檢查在目標 MySQL 版本中已移除的函數。groupbyAscSyntax
:檢查是否有GROUP BY ASC
或DESC
語法。removedSysLogVars
:檢查用於設定系統記錄的舊系統變數。removedSysVars
:檢查來源中使用但在目標版本中已移除的系統變數。這表示系統變數在來源上設定為非預設值。-
sysVarsNewDefaults
:檢查在目標版本中具有不同預設值的系統變數。注意如果對 MySQL 5.7.x 執行升級檢查工具,則此檢查要求您定義
--configPath
。 zeroDates
:檢查零日期、日期時間和時間戳記值。schemaInconsistency
:檢查因檔案移除或損毀而導致的綱要不一致。ftsInTablename
:檢查資料表名稱是否包含FTS
,MySQL 8.0 或更高版本不支援此名稱。engineMixup
:檢查 InnoDB 識別但屬於不同引擎的資料表。oldGeometryTypes
:檢查在 MySQL 5.6 中建立的空間資料行。checkTableCommand
:檢查CHECK TABLE
命令回報的問題。defaultAuthenticationPlugin
:檢查較舊的驗證外掛程式,例如mysql_native_password
。defaultAuthenticationPluginMds
:檢查較舊的驗證外掛程式,例如mysql_native_password
。changedFunctionsInGeneratedColumns
:檢查目標版本中語意已變更的函數上的索引。columnsWhichCannotHaveDefaults
:檢查無法有預設值的資料行 (BLOB、TEXT、GEOMETRY 和 JSON)。invalid57Names
:檢查 MySQL 5.7 中使用的無效資料表名稱和綱要名稱。orphanedObjects
:檢查 MySQL 5.7 中是否有孤立的常式和事件。dollarSignName
:檢查物件名稱中已棄用的單一美元符號 ($) 用法。indexTooLarge
:檢查 MySQL 8.0 或更高版本不支援的大型索引。emptyDotTableSyntax
:檢查常式中使用的已棄用.
語法。tableName
invalidEngineForeignKey
:檢查具有指向不同資料庫引擎的資料表的外鍵的資料行。deprecatedDefaultAuth
:檢查系統變數中已棄用或無效的預設驗證方法。deprecatedRouterAuthMethod
:檢查 MySQL Router 內部帳戶使用的已棄用或無效的驗證方法。deprecatedTemporalDelimiter
:檢查資料表分割中已棄用的時間分隔符號。innodbRowFormat
:檢查具有非預設資料列格式的 InnoDB 資料表。authMethodUsage
:檢查已棄用或無效的使用者驗證方法。pluginUsage
:檢查已棄用或已移除的外掛程式。columnDefinition
:檢查資料行定義中的錯誤。sysvarAllowedValues
:檢查系統變數的有效值。invalidPrivileges
:檢查將被移除的使用者權限。partitionsWithPrefixKeys
:檢查使用具有前置索引鍵的資料行的索引鍵分割。請參閱分割的限制和約束。
當您使用 outputFormat
字典選項選擇 JSON 輸出時,升級檢查工具傳回的 JSON 物件具有下列索引鍵值組
- serverAddress
MySQL Shell 連線到所檢查的 MySQL 伺服器實例的主機名稱和連接埠號碼。
- serverVersion
所檢查的伺服器實例偵測到的 MySQL 版本。
- targetVersion
Target MySQL version for the upgrade checks.
- errorCount
工具找到的錯誤數量。
- warningCount
工具找到的警告數量。
- noticeCount
工具找到的注意數量。
- summary
將在文字輸出結尾提供的摘要敘述文字(例如,「未找到已知的相容性錯誤或問題。」)。
- checksPerformed
-
JSON 物件的陣列,每個物件對應一個自動檢查的升級問題(例如,使用已移除的函數)。每個 JSON 物件都有下列索引鍵值組
- id
檢查的 ID,這是一個唯一的字串。
- title
檢查的簡短描述。
- status
如果檢查成功執行,則為「OK」,否則為「ERROR」。
- description
檢查的長描述(如果有的話),其中包含建議,或是在檢查執行失敗時出現錯誤訊息。
- documentationLink
如果有的話,提供含有進一步資訊或建議的文件連結。
- detectedProblems
-
代表檢查結果發現的錯誤、警告或注意的 JSON 物件陣列(可能為空)。每個 JSON 物件都有下列索引鍵值組
- level
訊息層級,為「Error」、「Warning」或「Notice」之一。
- dbObject
識別訊息相關的資料庫物件的字串。
- description
如果有的話,提供資料庫物件問題的具體描述的字串。
- dbObjectType
dbObject
的類型。可以是以下其中之一:Schema、Table、View、Column、Index、ForeignKey、Routine、Event、Trigger、SystemVariable、User、Tablespace 或 Plugin。
- manualChecks
-
JSON 物件的陣列,每個物件對應一個與您的升級路徑相關且需要手動檢查的升級問題(例如,MySQL 8.0 中預設驗證外掛程式的變更)。每個 JSON 物件都有下列索引鍵值組
- id
手動檢查的 ID,這是一個唯一的字串。
- title
手動檢查的簡短描述。
- description
手動檢查的長描述,其中包含資訊和建議。
- documentationLink
如果有的話,提供含有進一步資訊或建議的文件連結。