安装新的 MySQL 版本可能需要升级现有安装的以下部分:
-
系统模式
mysql
,其中包含 MySQL 服务器在运行时所需的信息(见 第 7.3 节,“系统模式 mysql”)。mysql
模式表分为两个广泛的类别:-
数据字典表,用于存储数据库对象元数据。
-
系统表(即剩余的非数据字典表),用于其他操作目的。
-
-
其他模式,一些是内置的,可能被视为服务器“拥有”的,而其他的则不是:
-
性能模式
performance_schema
、INFORMATION_SCHEMA
、ndbinfo
和sys
模式。 -
用户模式。
-
两个不同的版本号与安装的某些部分相关联,可能需要升级:
-
数据字典版本。这适用于数据字典表。
-
服务器版本,也称为 MySQL 版本。这适用于系统表和其他模式中的对象。
在这两种情况下,实际版本号都存储在数据字典中,而当前期望的版本号则编译到新的 MySQL 版本中。当实际版本号低于当前期望的版本号时,相关安装部分必须升级到当前版本。如果两个版本号都表明需要升级,数据字典升级必须首先进行。
由于存在两个不同的版本号,因此升级过程分为两个步骤:
-
步骤 1:数据字典升级。
该步骤升级:
-
系统模式
mysql
中的数据字典表。如果实际数据字典版本低于当前期望的版本,服务器将创建具有更新定义的数据字典表,复制持久元数据到新表中,原子地替换旧表,并重新初始化数据字典。 -
性能模式、
INFORMATION_SCHEMA
和ndbinfo
。
-
-
步骤 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=FORCE
,服务器升级数据字典、性能模式和INFORMATION_SCHEMA
,如果必要(步骤 1),并强制升级所有其他内容(步骤 2)。预计服务器启动时间将更长,因为服务器检查所有模式中的所有对象。
FORCE
对于强制执行步骤 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 做出决定,因此无法自动完成。
-
当步骤 2 升级
mysql
模式中的系统表时,mysql.db
、mysql.tables_priv
、mysql.columns_priv
和mysql.procs_priv
表的主键中的列顺序将被更改,以便将主机名和用户名列放在一起。将主机名和用户名放在一起意味着可以使用索引查找,从而提高CREATE USER
、DROP USER
和RENAME USER
语句的性能,以及 ACL 检查多个用户的多个权限。删除和重新创建索引是必要的,可能需要一些时间,如果系统有大量用户和权限。 -
步骤 2 处理所有用户模式中的所有表,如有必要。表检查可能需要很长时间完成。每个表在被处理时将被锁定,因此不可用于其他会话。检查和修复操作可能需要很长时间,特别是对于大型表。表检查使用
FOR UPGRADE
选项的CHECK TABLE
语句。有关该选项的详细信息,请参阅 第 15.7.3.2 节,“CHECK TABLE 语句”。要防止表检查,启动服务器时使用
--upgrade=NONE
或--upgrade=MINIMAL
选项。要强制表检查,启动服务器时使用
--upgrade=FORCE
选项。 -
步骤 2 将 MySQL 版本号保存在数据目录中的文件
mysql_upgrade_info
中。要忽略
mysql_upgrade_info
文件并执行检查,启动服务器时使用--upgrade=FORCE
选项。Notemysql_upgrade_info
文件已弃用;预计它将在未来版本的 MySQL 中被删除。 -
步骤 2 将所有检查和修复的表标记为当前 MySQL 版本号。这确保了在同一版本的服务器下次升级检查时,可以确定是否需要检查或修复给定的表。