MySQL Shell 8.4  /  MySQL Shell 实用程序  /  升级检查工具

11.1 升级检查工具

util.checkForServerUpgrade() 函数是一个升级检查工具,它使您能够验证 MySQL 服务器实例是否已准备好进行升级。您可以选择要升级到的目标 MySQL 服务器版本,范围从第一个 MySQL 服务器 8.0 通用可用 (GA) 版本 (8.0.11) 到与当前 MySQL Shell 版本号匹配的 MySQL 服务器版本号。升级检查工具会执行与指定目标版本相关的自动化检查,并向您提示您应该手动执行的进一步相关检查。

关于工具

您可以使用升级检查工具来检查 MySQL 5.7 服务器实例和 MySQL 8.x 服务器实例,这些实例位于 MySQL 8.x 版本系列中的另一个 GA 状态版本,以检查升级的兼容性错误和问题。如果您在不指定 MySQL 服务器实例的情况下调用 checkForServerUpgrade(),则会检查当前连接到全局会话的实例。要查看当前连接的实例,请发出 \status 命令。

注意
  1. 升级检查工具不支持检查早于 MySQL 5.7 的 MySQL 服务器实例。

  2. MySQL 服务器仅支持从 5.7 开始在 GA 版本之间进行升级。不支持从非 GA 版本进行升级。有关支持的升级路径的更多信息,请参阅 升级路径

升级检查工具可以检查服务器实例的配置文件 (my.cnfmy.ini)。该工具检查配置文件中定义但在目标 MySQL 服务器版本中已删除的任何系统变量,以及配置文件中未定义但在目标 MySQL 服务器版本中将具有不同默认值的任何系统变量。对于这些检查,在调用 checkForServerUpgrade() 时,您必须提供配置文件的路径。

升级检查工具可以以文本格式生成其输出,这是默认格式,也可以以 JSON 格式生成,这对于在 DevOps 自动化中使用可能更易于解析和处理。

运行工具

升级检查工具可以使用 X 协议连接或经典 MySQL 协议连接(使用 TCP 或 Unix 套接字)进行操作。您可以在事先创建连接,也可以将其作为参数指定给该函数。该工具始终创建一个新会话以连接到服务器,因此不会影响 MySQL Shell 全局会话。

用于运行升级检查工具的用户帐户需要 RELOADPROCESSSELECT 权限。

升级检查工具具有以下签名

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.cnfmy.ini 配置文件的本地路径,例如 C:\ProgramData\MySQL\MySQL Server 8.1\my.ini。如果您省略了文件路径,并且升级检查工具需要运行需要配置文件的检查,则该检查将失败,并显示一条消息,告知您必须指定文件路径。

outputFormat

返回的升级检查工具输出的格式。如果您省略了该选项,则默认为文本格式 (TEXT)。如果您指定了 JSON,则会返回格式良好的 JSON 输出,其格式如 升级检查工具的 JSON 输出 中列出。

include

要运行的升级检查的逗号分隔列表。仅运行指定的检查。如果在 includeexclude 列表中都定义了检查,则会返回错误。

例如

              "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 [email protected]:3306 处的 MySQL 服务器是否要升级到 MySQL 服务器版本 8.1.0。用户密码和配置文件路径作为选项字典的一部分提供,输出以默认文本格式返回

mysqlsh> util.checkForServerUpgrade('[email protected]: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('[email protected]: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 套接字连接,并显示了从命令行调用该工具的旧格式,该格式仍然有效

./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://dev.mysqlserver.cn/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://dev.mysqlserver.cn/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 ASCDESC 语法。

  • 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: 检查使用带有前缀键索引的列按键进行的分区。请参阅 分区限制

升级检查器实用程序的 JSON 输出

当您使用 outputFormat 字典选项选择 JSON 输出时,升级检查器实用程序返回的 JSON 对象具有以下键值对

serverAddress

MySQL Shell 连接到所检查的 MySQL 服务器实例的主机名和端口号。

serverVersion

检测到的所检查的服务器实例的 MySQL 版本。

targetVersion

升级检查的目标 MySQL 版本。

errorCount

实用程序找到的错误数量。

warningCount

实用程序找到的警告数量。

noticeCount

实用程序找到的通知数量。

summary

将在文本输出结束时提供的摘要语句的文本(例如,“没有发现已知的兼容性错误或问题。”)。

checksPerformed

一个 JSON 对象数组,每个对象代表一个自动检查的升级问题(例如,已删除函数的使用)。每个 JSON 对象具有以下键值对

id

检查的 ID,它是一个唯一的字符串。

title

检查的简短描述。

status

如果检查成功运行,则为“OK”,否则为“ERROR”。

description

检查的详细描述(如果可用),包含建议或错误消息(如果检查未能运行)。

documentationLink

如果可用,则链接到包含更多信息或建议的文档。

detectedProblems

一个数组(可能为空),包含 JSON 对象,代表检查结果发现的错误、警告或通知。每个 JSON 对象具有以下键值对

level

消息级别,可以是错误、警告或通知之一。

dbObject

标识与消息相关的数据库对象的字符串。

description

如果可用,则包含有关数据库对象问题的具体描述的字符串。

dbObjectType

的类型 dbObject。这可以是以下之一:模式、表、视图、列、索引、外键、例程、事件、触发器、系统变量、用户、表空间或插件。

manualChecks

一个 JSON 对象数组,每个对象代表与您的升级路径相关的需要手动检查的升级问题(例如,MySQL 8.0 中默认身份验证插件的更改)。每个 JSON 对象具有以下键值对

id

手动检查的 ID,它是一个唯一的字符串。

title

手动检查的简短描述。

description

手动检查的详细描述,包含信息和建议。

documentationLink

如果可用,则链接到包含更多信息或建议的文档。