安装新版本的 MySQL 可能需要升级现有安装的这些部分
mysql
系统模式,它包含存储 MySQL 服务器运行时所需信息的表(参见 第 7.3 节,“mysql 系统模式”)。mysql
模式表可分为两大类数据字典表,存储数据库对象元数据。
系统表(即其余非数据字典表),用于其他操作目的。
其他模式,其中一些是内置的,可以被认为是 “由服务器拥有”,而另一些则不是
用户模式。
与可能需要升级的安装部分相关联的两个不同的版本号
数据字典版本。这适用于数据字典表。
服务器版本,也称为 MySQL 版本。这适用于其他模式中的系统表和对象。
在这两种情况下,适用于现有 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=MINIMAL
,服务器会在必要时升级数据字典、性能模式和INFORMATION_SCHEMA
(步骤 1)。请注意,在使用此选项升级后,无法启动组复制,因为复制内部依赖的系统表未更新,并且其他区域也可能出现功能减少的情况。使用
--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 会根据需要处理所有用户模式中的所有表。表检查可能需要很长时间才能完成。每个表在处理过程中都会被锁定,因此对其他会话不可用。检查和修复操作可能很耗时,特别是对于大型表。表检查使用
CHECK TABLE
语句的FOR UPGRADE
选项。有关此选项内容的详细信息,请参见 第 15.7.3.2 节,“CHECK TABLE 语句”.要阻止表检查,请使用
--upgrade=NONE
或--upgrade=MINIMAL
选项启动服务器。要强制进行表检查,请使用
--upgrade=FORCE
选项启动服务器。步骤 2 会使用当前 MySQL 版本号标记所有已检查和修复的表。这样可以确保下次使用相同版本的服务器执行升级检查时,可以确定是否需要再次检查或修复给定表。