本节描述如何在 Unix/Linux 上升级 MySQL 二进制和基于包的安装。在位升级和逻辑升级方法将被描述。
就地升级涉及关闭旧的 MySQL 服务器,替换旧的 MySQL 二进制文件或包,重新启动 MySQL 服务器,并升级现有的安装部分。有关升级的详细信息,请参阅 第 3.4 节,“MySQL 升级过程升级的内容”。
如果您升级了最初由安装多个 RPM 软件包生成的安装,请升级所有软件包,而不是只升级一些。例如,如果您之前安装了服务器和客户端 RPM 软件包,请不要只升级服务器 RPM 软件包。
对于某些 Linux 平台,MySQL 安装来自 RPM 或 Debian 软件包,包括 systemd 支持以管理 MySQL 服务器的启动和关闭。在这些平台上,不安装 mysqld_safe。在这些情况下,请使用 systemd 而不是以下说明中的方法来管理服务器的启动和关闭。请参阅 第 2.5.9 节,“使用 systemd 管理 MySQL 服务器”。
对于 MySQL 集群安装的升级,请参阅 MySQL 集群升级。
要执行就地升级:
-
查看 第 3.1 节,“开始之前” 中的信息。
-
通过完成 第 3.6 节,“升级前准备安装” 中的初步检查来确保安装的升级准备就绪。
-
如果您使用 XA 事务与
InnoDB
,在升级之前运行XA RECOVER
以检查未提交的 XA 事务。如果返回结果,请提交或回滚 XA 事务,方法是发出XA COMMIT
或XA ROLLBACK
语句。 -
如果您通常以
innodb_fast_shutdown
设置为2
(冷关机)配置 MySQL 服务器,请配置它以执行快速或慢速关机,方法是执行以下语句:SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown
使用快速或慢速关机,
InnoDB
将其撤销日志和数据文件留在可以处理文件格式差异的状态中。 -
关闭旧的 MySQL 服务器。例如:
mysqladmin -u root -p shutdown
-
升级 MySQL 二进制文件或软件包。如果升级二进制安装,请解压缩新的 MySQL 二进制分布包。请参阅 获取和解压缩分布。对于基于软件包的安装,请安装新的软件包。
-
启动 MySQL 8.3 服务器,使用现有的数据目录。例如:
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
如果有加密的
InnoDB
表空间,请使用--early-plugin-load
选项加载密钥环插件。当您启动 MySQL 8.3 服务器时,它自动检测数据字典表是否存在。如果不存在,服务器将在数据目录中创建它们,填充元数据,然后继续其正常启动序列。在此过程中,服务器升级所有数据库对象的元数据,包括数据库、表空间、系统和用户表、视图、存储程序(存储过程和函数、触发器和事件计划器事件)。服务器还删除了以前用于元数据存储的文件。例如,在从 MySQL 8.2 升级到 MySQL 8.3 后,您可能注意到表不再具有
.frm
文件。如果此步骤失败,服务器将还原所有对数据目录的更改。在这种情况下,您应该删除所有重做日志文件,启动 MySQL 8.2 服务器在同一个数据目录中,修复任何错误。然后,执行另一个慢速关闭的 8.2 服务器并启动 MySQL 8.3 服务器以尝试再次。
-
在前一步骤中,服务器升级数据词典,如有必要,使 MySQL 8.2 和 MySQL 8.3 之间的
mysql
系统数据库保持最新状态,以便您可以利用新的权限或功能。它还将性能模式、INFORMATION_SCHEMA
和sys
数据库升级到 MySQL 8.3,并检查所有用户数据库以检测当前版本的 MySQL 的不兼容性。
升级过程不升级时间区表的内容。有关升级说明,请参阅 第 7.1.15 节,“MySQL 服务器时间区支持”。
逻辑升级涉及使用备份或导出实用程序(如 mysqldump 或 mysqlpump)从旧的 MySQL 实例中导出 SQL,然后安装新的 MySQL 服务器,并将 SQL 应用到新的 MySQL 实例中。有关升级的详细信息,请参阅 第 3.4 节,“MySQL 升级过程升级的内容”。
对于某些 Linux 平台,MySQL 安装从 RPM 或 Debian 软件包包括 systemd 支持,以管理 MySQL 服务器的启动和关闭。在这些平台上,不安装 mysqld_safe。在这些情况下,使用 systemd 而不是以下说明中的方法来管理服务器的启动和关闭。请参阅 第 2.5.9 节,“使用 systemd 管理 MySQL 服务器”。
将从以前的 MySQL 版本中提取的 SQL 应用到新的 MySQL 版本可能会出现错误,因为新的、更改的、弃用的或删除的功能和功能可能会引入不兼容性。因此,从以前的 MySQL 版本中提取的 SQL 可能需要修改以启用逻辑升级。
要在升级到最新的 MySQL 8.3 版本之前识别不兼容性,请执行 第 3.6 节,“升级前的准备” 中的步骤。
要执行逻辑升级:
-
查看 第 3.1 节,“开始之前” 中的信息。
-
从以前的 MySQL 安装中导出现有的数据:
mysqldump -u root -p --add-drop-table --routines --events --all-databases --force > data-for-upgrade.sql
Note使用
--routines
和--events
选项与 mysqldump(如上所示)如果您的数据库包含存储程序。--all-databases
选项包括所有数据库在转储中,包括mysql
数据库,该数据库持有系统表。 -
关闭旧的 MySQL 服务器。例如:
mysqladmin -u root -p shutdown
-
安装 MySQL 8.3。有关安装说明,请参阅 第 2 章,安装 MySQL。
-
初始化新的数据目录,如 第 2.9.1 节,“初始化数据目录” 所述。例如:
mysqld --initialize --datadir=/path/to/8.3-datadir
复制临时
'root'@'localhost'
密码显示在屏幕上或写入错误日志以供后用。 -
启动 MySQL 8.3 服务器,使用新的数据目录。例如:
mysqld_safe --user=mysql --datadir=/path/to/8.3-datadir &
-
重置
root
密码:$> mysql -u root -p Enter password: **** <- enter temporary root password
mysql> ALTER USER USER() IDENTIFIED BY 'your new password';
-
将之前创建的转储文件加载到新的 MySQL 服务器中。例如:
mysql -u root -p --force < data-for-upgrade.sql
Note不建议在 GTIDs 启用时加载转储文件(
gtid_mode=ON
),如果您的转储文件包含系统表。mysqldump 为系统表发出 DML 指令,这些指令使用非事务性 MyISAM 存储引擎,而这组合在 GTIDs 启用时不允许。还要注意,从启用 GTIDs 的服务器加载转储文件到另一个启用 GTIDs 的服务器,会生成不同的事务标识符。 -
执行剩余的升级操作:
关闭服务器,然后使用
--upgrade=FORCE
选项重新启动服务器,以执行剩余的升级任务:mysqladmin -u root -p shutdown mysqld_safe --user=mysql --datadir=/path/to/8.3-datadir --upgrade=FORCE &
在重新启动时使用
--upgrade=FORCE
,服务器将对 MySQL 8.2 和 MySQL 8.3 之间的mysql
系统架构进行必要的更改,以便您可以利用新的权限或功能。它还将性能架构、INFORMATION_SCHEMA
和sys
架构升级到 MySQL 8.3,并检查所有用户架构以确保与当前版本的 MySQL 兼容。
升级过程不升级时间区表的内容。有关升级说明,请参阅 第 7.1.15 节,“MySQL 服务器时间区支持”。
加载包含 MySQL 5.7 mysql
架构的转储文件将重新创建两个不再使用的表:event
和 proc
。(相应的 MySQL 8.0 表是 events
和 routines
,都是数据字典表并受到保护。)在您确认升级成功后,可以通过执行以下 SQL 语句删除 event
和 proc
表:
DROP TABLE mysql.event;
DROP TABLE mysql.proc;
本节信息是对 就地升级 程序的补充,用于升级 MySQL 集群。
MySQL 集群升级可以作为常规滚动升级,按照以下三个有序步骤:
-
升级 MGM 节点。
-
逐个升级数据节点。
-
逐个升级 API 节点(包括 MySQL 服务器)。
升级每个单独的 mysqld
需要两个步骤:
-
导入数据字典。
使用
--upgrade=MINIMAL
选项启动新的服务器,以升级数据字典但不升级系统表。MySQL 服务器必须连接到
NDB
才能完成此阶段。如果存在任何NDB
或NDBINFO
表,并且服务器无法连接到集群,它将退出并显示错误消息:Failed to Populate DD tables.
-
升级系统表通过重新启动每个单独的 mysqld 而不使用
--upgrade=MINIMAL
选项。