安装新版本的MySQL可能需要升级现有安装的以下部分:
- 该
mysql
系统架构,其中包含表,通过它运行MySQL服务器所需的存储信息(参见5.3节,“MySQL的系统架构”)。mysql
模式表分为两大类:- 数据字典表,用于存储数据库对象元数据。
- 系统表(即剩余的非数据字典表),用于其他操作目的。
- 其他模式,其中一些是内置的,可能被服务器视为“拥有”,而其他则不是:
- 性能架构,
INFORMATION_SCHEMA
,ndbinfo
,和sys
模式。 - 用户架构。
- 性能架构,
两个不同的版本号与可能需要升级的安装部分相关联:
- 数据字典版本。这适用于数据字典表。
- 服务器版本,也称为MySQL版本。这适用于其他模式中的系统表和对象。
在这两种情况下,适用于现有MySQL安装的实际版本都存储在数据字典中,而当前的预期版本将编译为MySQL的新版本。当实际版本低于当前预期版本时,必须将与该版本关联的安装的那些部分升级到当前版本。如果两个版本均指示需要升级,则必须首先进行数据字典升级。
作为上述两个不同版本的反映,升级分两个步骤进行:
-
步骤1:资料字典升级。
此步骤升级:
- 模式中的数据字典表
mysql
。如果实际数据字典版本低于当前预期版本,则服务器会创建具有更新定义的数据字典表,将持久化的元数据复制到新表中,用新表原子替换旧表,然后重新初始化数据字典。 - 性能架构
INFORMATION_SCHEMA
和ndbinfo
。
- 模式中的数据字典表
-
步骤2:服务器升级。
此步骤包括所有其他升级任务。如果现有MySQL安装的服务器版本低于新安装的MySQL版本的服务器版本,则其他所有内容都必须升级:
- 模式中的系统表
mysql
(其余的非数据字典表)。 - 该
sys
架构。 - 用户架构。
- 模式中的系统表
数据字典升级(步骤1)是服务器的责任,服务器在启动时会根据需要执行此任务,除非使用阻止它执行此操作的选项进行调用。该选项--upgrade=NONE
自MySQL 8.0.16起,--no-dd-upgrade
早于MySQL 8.0.16。
如果数据字典已过期,但是服务器无法对其进行升级,则服务器将无法运行,并退出并显示错误。例如:
[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.
复制
MySQL 8.0.16中对步骤2的职责进行了一些更改:
- 在MySQL 8.0.16之前,mysql_upgrade 升级性能架构,
INFORMATION_SCHEMA
步骤2中所述的对象和对象。启动服务器后,期望DBA手动调用 mysql_upgrade。 - 从MySQL 8.0.16开始,服务器执行以前由mysql_upgrade处理的所有任务。尽管升级仍然需要两步操作,但是服务器会同时执行这两项操作,从而简化了过程。
根据要升级到的MySQL版本,就地升级和 逻辑升级中的说明指示服务器是执行所有升级任务还是在服务器启动后还必须调用 mysql_upgrade。
注意
因为服务器INFORMATION_SCHEMA
从MySQL 8.0.16开始升级了Performance Schema 和第2步中描述的对象,所以 从该版本开始,不再需要mysql_upgrade,并且不推荐使用mysql_upgrade。希望在将来的MySQL版本中将其删除。
尽管可能需要不同的命令选项才能实现特定的效果,但步骤2期间发生的大多数方面与MySQL 8.0.16之前的版本相同。
从MySQL 8.0.16开始,--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
,服务器将重新创建系统表,如帮助表或如果缺少时区表。
以下列表显示了MySQL 8.0.16之前的升级命令以及MySQL 8.0.16及更高版本的等效命令:
- 执行常规升级(必要时执行步骤1和2):
- 在MySQL 8.0.16之前:mysqld,后跟mysql_upgrade
- 从MySQL 8.0.16开始:mysqld
- 根据需要仅执行步骤1:
- 在此之前的MySQL 8.0.16:这是不可能的执行步骤1中的所有升级任务,同时排除那些在步骤2中描述。然而,你能避免升级用户模式和
sys
使用模式 的mysqld,然后 mysql_upgrade与--upgrade-system-tables
和--skip-sys-schema
选项。 - 从MySQL 8.0.16开始:mysqld --upgrade = MINIMAL
- 在此之前的MySQL 8.0.16:这是不可能的执行步骤1中的所有升级任务,同时排除那些在步骤2中描述。然而,你能避免升级用户模式和
- 根据需要执行步骤1,并强制执行步骤2:
- 在MySQL 8.0.16之前:mysqld,后跟mysql_upgrade --force
- 从MySQL 8.0.16开始:mysqld --upgrade = FORCE
在MySQL 8.0.16之前,某些mysql_upgrade 选项会影响其执行的操作。下表显示了--upgrade
从MySQL 8.0.16开始使用的服务器选项值,以实现类似的效果。(这些不一定完全相同,因为给定的 --upgrade
期权价值可能会有其他影响。)
mysql_upgrade选项 | 服务器选件 |
---|---|
--skip-sys-schema |
--upgrade=NONE 要么 --upgrade=MINIMAL |
--upgrade-system-tables |
--upgrade=NONE 要么 --upgrade=MINIMAL |
--force |
--upgrade=FORCE |
有关升级步骤2中发生的事情的其他说明:
-
sys
如果未安装架构,则 第2步将安装该架构,否则将其升级到当前版本。如果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
模式检查:- 从MySQL 8.0.16开始:使用
--upgrade=NONE
或--upgrade=MINIMAL
选项启动服务器 。 - 在MySQL 8.0.16之前:使用该 选项调用 mysql_upgrade
--skip-sys-schema
。
- 从MySQL 8.0.16开始:使用
-
步骤2根据需要处理所有用户模式中的所有表。表检查可能需要很长时间才能完成。每个表都被锁定,因此在处理它时其他会话无法使用。检查和修复操作可能很耗时,特别是对于大桌子。表检查使用语句的
FOR UPGRADE
选项CHECK TABLE
。有关此选项所含内容的详细信息,请参见 第13.7.3.2节“ CHECK TABLE语句”。为了防止表格检查:
- 从MySQL 8.0.16开始:使用
--upgrade=NONE
或--upgrade=MINIMAL
选项启动服务器 。 - 在MySQL 8.0.16之前:使用该 选项调用 mysql_upgrade
--upgrade-system-tables
。
强制进行表检查:
- 从MySQL 8.0.16开始:使用
--upgrade=FORCE
选项启动服务器 。 - 在MySQL 8.0.16之前:使用该 选项调用 mysql_upgrade
--force
。
- 从MySQL 8.0.16开始:使用
-
步骤2将MySQL版本号保存
mysql_upgrade_info
在data目录中命名的文件 中。要忽略
mysql_upgrade_info
文件并执行检查,无论如何:- 从MySQL 8.0.16开始:使用
--upgrade=FORCE
选项启动服务器 。 - 在MySQL 8.0.16之前:使用该 选项调用 mysql_upgrade
--force
。
注意
该
mysql_upgrade_info
文件已弃用;希望在将来的MySQL版本中将其删除。 - 从MySQL 8.0.16开始:使用
-
步骤2使用当前的MySQL版本号标记所有已检查和已修复的表。这样可以确保下次使用相同版本的服务器进行升级检查时,可以确定是否需要再次检查或修复给定的表。
-
步骤2升级系统表以确保它们具有当前结构。无论服务器还是mysql_upgrade执行该步骤,都是如此 。关于帮助表和时区表的内容,mysql_upgrade不会加载这两种类型的表,而服务器会加载帮助表,但不会加载时区表。(也就是说,在MySQL 8.0.16之前,服务器仅在数据目录初始化时加载帮助表。从MySQL 8.0.16开始,它在初始化和升级时加载帮助表。)加载时区表的过程它依赖于平台,需要DBA做出决策,因此无法自动完成。