3.4 MySQL 升级过程升级的内容
安装新的 MySQL 版本可能需要升级现有安装的以下部分:
-
MySQL 系统架构(
mysql
),其中包含了 MySQL 服务器在运行时所需的表格(见第7.3节,“The mysql System Schema”)。mysql
架构表可以分为两大类:-
数据字典表,存储数据库对象元数据。
-
系统表(即除数据字典表外的非数据字典表),用于其他操作目的。
-
-
其他架构,部分是内置架构,可能被认为是““owned””的服务器所有,其他架构则不是:
-
用户架构。
升级过程中涉及两个版本号:
-
数据字典版本。这适用于数据字典表。
-
服务器版本,也称为 MySQL 版本。这适用于系统表和其他架构中的对象。
在这两个版本号中,实际版本号存储在数据字典中,而当前期望的版本号编译到新的 MySQL 版本中。当实际版本号低于当前期望版本号时,需要升级相关部分。如果两个版本号都指示需要升级,数据字典升级必须首先进行。
升级过程分为两个步骤:
-
步骤 1:数据字典升级。
这步骤升级:
-
MySQL 架构中的数据字典表。如果实际数据字典版本号低于当前期望版本号,服务器将创建数据字典表的更新定义,复制 persisted 元数据到新表,原子地将旧表替换为新表,并重新初始化数据字典。
-
性能架构、
INFORMATION_SCHEMA
和ndbinfo
。
-
-
步骤 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)。使用该选项时,服务器启动时间可能会更长,因为服务器检查所有对象在所有架构中。
FORCE
与AUTO
不同之处在于,使用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.db
、mysql.tables_priv
、mysql.columns_priv
和mysql.procs_priv
表的主键列顺序被更改,以将主机名和用户名列放在一起。将主机名和用户名放在一起意味着可以使用索引查找,从而提高CREATE USER
、DROP USER
和RENAME USER
语句的性能,以及多个用户和多个权限的ACL检查。 -
步骤2处理所有用户架构中的所有表。表检查可能需要很长时间完成。每个表都被锁定,因此在处理时不可用于其他会话。检查和修复操作可能需要很长时间,特别是对于大型表。表检查使用
CHECK TABLE
语句的FOR UPGRADE
选项。有关该选项的详细信息,请参见第15.7.3.2节,“CHECK TABLE 语句”。要防止表检查,启动服务器时使用
--upgrade=NONE
或--upgrade=MINIMAL
选项。要强制表检查,启动服务器时使用
--upgrade=FORCE
选项。 -
步骤2将所有检查和修复的表标记为当前MySQL版本号。这确保了在下一次升级检查时,可以确定是否需要检查或修复给定表。