MySQL 8.4 Reference Manual  /  Upgrading MySQL  /  What the MySQL Upgrade Process Upgrades

3.4 MySQL 升级过程升级的内容

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

  • MySQL 系统架构(mysql),其中包含了 MySQL 服务器在运行时所需的表格(见第7.3节,“The mysql System Schema”)。mysql架构表可以分为两大类:

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

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

  • 其他架构,部分是内置架构,可能被认为是“owned”的服务器所有,其他架构则不是:

升级过程中涉及两个版本号:

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

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

在这两个版本号中,实际版本号存储在数据字典中,而当前期望的版本号编译到新的 MySQL 版本中。当实际版本号低于当前期望版本号时,需要升级相关部分。如果两个版本号都指示需要升级,数据字典升级必须首先进行。

升级过程分为两个步骤:

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

    这步骤升级:

    • MySQL 架构中的数据字典表。如果实际数据字典版本号低于当前期望版本号,服务器将创建数据字典表的更新定义,复制 persisted 元数据到新表,原子地将旧表替换为新表,并重新初始化数据字典。

    • 性能架构、INFORMATION_SCHEMAndbinfo

  • 步骤 2:服务器升级。

    这步骤包括所有其他升级任务。如果服务器版本号低于新的 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)。注意,在使用该选项后,Group Replication无法启动,因为系统表在 replication 内部依赖于这些表,并且可能在其他领域出现减少功能。

  • 使用--upgrade=FORCE,服务器将升级数据字典、性能架构和INFORMATION_SCHEMA,如果必要(步骤1),并强制升级所有其他内容(步骤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决策,因此不能自动完成。

  • 当在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版本号。这确保了在下一次升级检查时,可以确定是否需要检查或修复给定表。