目录
1.升级内容
1.1 mysql系统库
1.2.其他库
2.步骤
2.1 步骤1:数据字典库升级。
2.2 步骤2:服务器升级。
3.mysql_upgrade
3.1 执行正常升级(根据需要执行步骤1和2):
3.2 必要时仅执行步骤1:
3.3 根据需要执行步骤1,并强制执行步骤2
3.4 注意事项
本文主要对现有版本数据库进行升级时升级的内容进行解释。开发人员可以跳过,更面向于DBA,
以下内容来自Mysql8.0官方文档。
安装新版本的MySQL可能需要升级现有安装的以下部分:
1.升级内容
1.1 mysql系统库
其中包含存储mysql服务器运行时所需信息的表(请参阅第7.3节“mysql系统架构”)。mysql模式表分为两大类:
-数据字典表,用于存储数据库对象元数据。
-系统库(即剩余的非数据字典表),用于其他操作目的。
1.2.其他库
其中一些是内置的,可能被视为服务器“拥有”,而另一些则不是:
-performance_schema、INFORMATION_SCHEMA、ndbinfo和sys库。
-用户表。
两个不同的版本成员与可能需要升级的安装部分相关联:
-数据字典版本。这适用于数据字典表。
-服务器版本,也称为MySQL版本。这适用于其他数据库实例中的系统表和对象。
在这两种情况下,适用于现有MySQL安装的实际版本都存储在数据字典中,并且当前预期版本被编译为MySQL的新版本。当实际版本低于当前预期版本时,与该版本相关联的安装部分必须升级到当前版本。如果两个版本都表示需要升级,则必须首先进行数据字典升级。
作为刚才提到的两个不同版本的反映,升级分为两个步骤:
2.步骤
2.1 步骤1:数据字典库升级。
升级内容
-Mysql库中的数据字典表。如果实际的数据字典版本低于当前的预期版本,则服务器会创建具有更新定义的数据字典表,将持久化元数据复制到新表,用新表原子替换旧表,并重新初始化数据字典。
-performance_schema, INFORMATION_SCHEMA, ndbinfo
博主PS:就是说数据库自带的这两表的数据字典信息。
2.2 步骤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.
3.mysql_upgrade
MySQL 8.0.16中对步骤2的责任进行了一些更改:
在MySQL 8.0.16之前,mysql_upgrade 升级了Performance Schema、INFORMATION_SCHEMA和步骤2中描述的对象。DBA应该在启动服务器后手动调用mysql_upgrade。
从MySQL 8.0.16开始,服务器执行之前由MySQL_upgrade处理的所有任务。尽管升级仍然是一个两步操作,但服务器同时执行这两个操作,从而简化了过程。
根据要升级到的MySQL版本,就地升级和逻辑升级中的说明指示服务器是否执行所有升级任务,或者在服务器启动后是否也必须调用mysql_upgrade。
注意:
由于服务器从MySQL 8.0.16开始升级Performance Schema,INFORMATION_SCHEMA
和步骤2中描述的对象,因此mysql_upgrade是不需要的,并且从该版本开始不推荐使用;它也许在MySQL的未来版本中被删除。
3.1 mysql_upgrade
尽管可能需要不同的命令选项来实现特定的效果,但在MySQL 8.0.16之前和之后,步骤2期间发生的事情的大多数方面都是相同的。
从MySQL 8.0.16开始
--upgrade-server选项控制服务器是否以及如何在启动时执行自动升级:
如果为配置或配置--upgrade=AUTO:
服务器将升级它确定为过期的任何内容(步骤1和2)。
如果配置--upgrade=NONE:
则服务器不进行任何升级(跳过步骤1和2),但如果必须升级数据字典,则服务器也会退出并返回错误。使用过期的数据字典运行服务器是不可能的;服务器坚持要么升级,要么退出。
配置--upgrade=MINIMAL:
服务器将根据需要升级数据字典、Performance Schema和INFORMATION_SCHEMA(步骤1)。请注意,使用此选项进行升级后,无法启动组复制,因为复制内部所依赖的系统表不会更新,而且在其他方面功能可能也会明显减少。
配置--upgrade=FORCE:
服务器将根据需要升级数据字典、Performance Schema和INFORMATION_SCHEMA(步骤1),并强制升级其他所有内容(步骤2)。由于服务器会检查所有模式中的所有对象,因此使用此选项预计服务器启动需要更长的时间。
如果服务器认为不需要执行步骤2的操作,则FORCE可用于强制执行这些操作。FORCE与AUTO的一个不同之处在于,使用FORCE,服务器会重新创建系统表,如帮助表或时区表(如果丢失)。
以下列表显示了MySQL 8.0.16之前的升级命令以及MySQL 8.0.16及更高版本的等效命令:
3.1 执行正常升级(根据需要执行步骤1和2):
MySQL 8.0.16之前:mysqld后面跟着mysql_upgrade
截至MySQL 8.0.16:mysqld
3.2 必要时仅执行步骤1:
在MySQL 8.0.16之前:不可能执行步骤1中描述的所有升级任务,同时排除步骤2中描述的任务。但是,您可以避免升级用户库和sys库,使用mysqld,然后使用--upgrade-system-tables和----skip-sys-schema选项升级mysql_upgrade。
自MySQL 8.0.16起:mysqld--升级=MINIMAL
3.3 根据需要执行步骤1,并强制执行步骤2
MySQL 8.0.16之前:mysqld后跟mysql_upgrade --force
自MySQL 8.0.16起:mysqld--upgrade=FORCE
在MySQL 8.0.16之前,某些mysql_upgrade选项会影响它执行的操作。下表显示了从MySQL 8.0.16开始使用哪个服务器-升级选项值来实现类似的效果。(这些不一定是完全等效的,因为给定的--upgrade选项值可能会产生额外的影响。)
mysql_upgrade Option | Server Option |
---|---|
--skip-sys-schema | --upgrade=NONE or --upgrade=MINIMAL |
--upgrade-system-tables | --upgrade=NONE or --upgrade=MINIMAL |
--force | --upgrade=FORCE |
关于升级步骤2期间发生的情况的其他注意事项:
3.4 注意事项
步骤2 安装sys库(如果未安装),否则将升级到当前版本。如果sys库存在,但没有版本视图,则会发生错误,假设其不存在表示用户创建的库:
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选项。
步骤2 升级系统表以确保它们具有当前结构。无论服务器还是mysql_upgrade执行该步骤,都是如此。关于帮助表和时区表的内容,mysql_upgrade不加载任何一种类型的表,而服务器加载帮助表,但不加载时区表。(也就是说,在MySQL 8.0.16之前,服务器只在数据目录初始化时加载帮助表。从MySQL 8.0.16开始,它在初始化和升级时加载帮助表格。)加载时区表的过程取决于平台,需要DBA进行决策,因此无法自动完成。
从MySQL 8.0.30开始,当步骤2升级MySQL模式中的sys库时,MySQL.db、MySQL.tables_priv、MySQL.columns_priv和MySQL.procs_priv表主键中的列顺序被更改为将主机名和用户名列放在一起。将主机名和用户名放在一起意味着可以使用索引查找,这提高了CREATE user、DROP user和RENAME user语句的性能,以及具有多个权限的多个用户的ACL检查的性能。删除并重新创建索引是必要的,如果系统具有大量用户和权限,则可能需要一些时间。
要防止对表进行检查,请执行以下操作:
从MySQL 8.0.16开始:使用--upgrade=NONE或--upgrade=MINIMAL选项启动服务器。
在MySQL 8.0.16之前:使用--upgrade system tables选项调用mysql_upgrade。
要强制对表进行检查,请执行以下操作:
从MySQL 8.0.16开始:使用--upgrade=FORCE选项启动服务器。
在MySQL 8.0.16之前:使用--force选项调用mysql_upgrade。
步骤2 将MySQL版本号保存在数据目录中名为 mysql_upgrade_info
的文件中。
要忽略mysql_upgrade_info文件并执行检查,请执行以下操作:
从MySQL 8.0.16开始:使用--upgrade=FORCE选项启动服务器。
在MySQL 8.0.16之前:使用--force选项调用mysql_upgrade。
笔记
mysql_upgrade_info文件已弃用;期望它在MySQL的未来版本中被删除。
步骤2 用当前MySQL版本号标记所有检查和修复的表。这样可以确保下次对相同版本的服务器进行升级检查时,可以确定是否需要再次检查或修复给定的表。
博主PS:本文主要在于升级现有的数据库。但实际生产环境对数据库版本的升级是很少见的,因此本文的知识点只作为真正需要升级数据库时的文档查阅。或面向专业DBA运维人员备忘查阅。对日常开发人员用处不大。