MySQL Shell 9.0  /  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 状态版本中是否存在兼容性错误和问题。如果调用 checkForServerUpgrade() 而不指定 MySQL 服务器实例,则会检查当前连接到全局会话的实例。要查看当前连接的实例,请发出 \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 

............................
............................

19) Tables recognized by InnoDB that belong to a different engine
  No issues found

20) Issues reported by 'check table x for upgrade' command
  No issues found

21) New default authentication plugin considerations
  Warning: The new default authentication plugin 'caching_sha2_password' offers
    more secure password hashing than previously used 'mysql_native_password'
    (and consequent improved client connection authentication). However, it also
    has compatibility implications that may affect existing MySQL installations. 
    If your MySQL installation must serve pre-8.0 clients and you encounter
    compatibility issues after upgrading, the simplest way to address those
    issues is to reconfigure the server to revert to the previous default
    authentication plugin (mysql_native_password). For example, use these lines
    in the server option file:
    
    [mysqld]
    default_authentication_plugin=mysql_native_password
    
    However, the setting should be viewed as temporary, not as a long term or
    permanent solution, because it causes new accounts created with the setting
    in effect to forego the improved authentication security.
    If you are using replication please take time to understand how the
    authentication plugin changes may impact you.
  More information:
    https://dev.mysqlserver.cn/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatibility-issues
    https://dev.mysqlserver.cn/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-replication

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: 检查用于配置系统日志记录的旧系统变量。

  • sysvar: 执行以下检查

    • 检查目标版本中默认值不同的系统变量。

    • 检查系统变量的有效值。

    • 检查源中正在使用但已在目标版本中弃用或删除的系统变量。这意味着系统变量在源上设置了非默认值。

  • 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: 检查列定义中的错误。

  • invalidPrivileges: 检查将被删除的用户权限。

  • partitionsWithPrefixKeys: 检查使用具有前缀键索引的列按键进行分区。请参见 分区的限制和局限性

  • foreignKeyReferences: 检查引用非唯一和部分索引的外部键。

升级检查器实用程序的 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

消息级别,为 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

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