MySQL 9.0 参考手册  /  升级 MySQL  /  MySQL 升级过程升级的内容

3.4 MySQL 升级过程升级的内容

安装新版本的 MySQL 可能需要升级现有安装的以下部分:

  • mysql 系统模式,其中包含存储 MySQL 服务器运行所需信息的表(请参阅 第 7.3 节 “mysql 系统模式”)。mysql 模式表分为两大类:

    • 数据字典表,用于存储数据库对象元数据。

    • 系统表(即其余的非数据字典表),用于其他操作目的。

  • 其他模式,其中一些是内置的,可以被视为服务器“拥有”的,而另一些则不是:

有两个不同的版本号与可能需要升级的安装部分相关联:

  • 数据字典版本。这适用于数据字典表。

  • 服务器版本,也称为 MySQL 版本。这适用于系统表和其他模式中的对象。

在这两种情况下,适用于现有 MySQL 安装的实际版本都存储在数据字典中,而当前预期版本则编译到新版本的 MySQL 中。当实际版本低于当前预期版本时,必须将与该版本相关联的安装部分升级到当前版本。如果两个版本都表明需要升级,则必须先进行数据字典升级。

正如前面提到的两个不同版本所反映的那样,升级分两步进行:

  • 步骤 1:数据字典升级。

    此步骤升级以下内容:

    • mysql 模式中的数据字典表。如果实际数据字典版本低于当前预期版本,则服务器会创建具有更新定义的数据字典表,将持久化的元数据复制到新表中,以原子方式将旧表替换为新表,并重新初始化数据字典。

    • 性能模式、INFORMATION_SCHEMAndbinfo

  • 步骤 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,服务器会根据需要升级数据字典、性能模式和 INFORMATION_SCHEMA(步骤 1)。请注意,使用此选项进行升级后,将无法启动组复制,因为未更新复制内部依赖的系统表,并且在其他区域中也可能会出现功能减少的情况。

  • 使用 --upgrade=FORCE,服务器会根据需要升级数据字典、性能模式和 INFORMATION_SCHEMA(步骤 1),并强制升级所有其他内容(步骤 2)。使用此选项时,服务器启动时间会更长,因为服务器会检查所有模式中的所有对象。

如果服务器认为不需要执行步骤 2 操作,则 FORCE 可用于强制执行步骤 2 操作。FORCEAUTO 的区别在于,使用 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.dbmysql.tables_privmysql.columns_privmysql.procs_priv 表的主键中的列顺序会发生变化,以将主机名和用户名列放在一起。将主机名和用户名放在一起意味着可以使用索引查找,这提高了 CREATE USERDROP USERRENAME USER 语句以及多个用户具有多个权限的 ACL 检查的性能。如果系统中有大量的用户和权限,则需要删除并重新创建索引,这可能需要一些时间。

  • 步骤 2 会根据需要处理所有用户模式中的所有表。表检查可能需要很长时间才能完成。每个表在被处理时都会被锁定,因此其他会话无法使用它。检查和修复操作可能非常耗时,尤其是对于大型表而言。表检查使用 CHECK TABLE 语句的 FOR UPGRADE 选项。有关此选项的详细信息,请参阅 第 15.7.3.2 节 “CHECK TABLE 语句”

    要防止进行表检查,请使用 --upgrade=NONE--upgrade=MINIMAL 选项启动服务器。

    要强制进行表检查,请使用 --upgrade=FORCE 选项启动服务器。

  • 步骤 2 使用当前 MySQL 版本号标记所有已检查和修复的表。这确保了下次使用相同版本的服务器进行升级检查时,可以确定是否需要再次检查或修复给定表。