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