升级MySQL

本章介绍升级MySQL安装的步骤。

升级是一个常见的过程,当您在同一MySQL版本系列中获取bug修复或主要MySQL版本之间的重要功能时。您首先在一些测试系统上执行此过程以确保一切顺利进行,然后在生产系统上执行此过程。

在下面的讨论中,必须使用具有管理权限的MySQL帐户运行的MySQL命令包括命令行上的-u ``root`` ,以指定MySQLroot用户。需要root密码的命令也包括-p选项。因为-p后面没有选项值,所以此类命令会提示输入密码。在提示时键入密码,然后按Enter。

SQL语句可以使用mysql命令行客户端执行(以root连接以确保您具有必要的权限)。

第1节、在你开始之前

升级前请查看本节中的信息。执行任何建议的操作。

  • 了解升级过程中可能会发生什么。请参阅第4节,"MySQL升级过程升级的内容"

  • 通过创建备份来保护您的数据。备份应包括mysql系统数据库,其中包含MySQL数据字典表和系统表。不支持从MySQL8.4降级到MySQL8.3,或从MySQL8.4版本降级到以前的MySQL8.4版本。唯一支持的替代方法是恢复升级前的备份。因此,在开始升级过程之前备份数据是命令式。

  • 查看第2节,"升级路径"以确保您的预期升级路径得到支持。

  • 查看第5节,"MySQL8.4中的更改",了解升级前您应该了解的更改。有些更改可能需要采取行动。

  • 查看"MySQL8.4自MySQL8.0以来的新增功能",了解已弃用和删除的功能。如果您使用这些功能中的任何一个,升级可能需要更改。

  • 查看"自8.0以来在MySQL8.4中添加、弃用或删除的服务器和状态变量和选项"。如果您使用不推荐使用或删除的变量,升级可能需要更改配置。

  • 查看发行说明,了解有关修复、更改和新功能的信息。

  • 如果使用复制,请查看"升级或降级复制拓扑"。

  • 回顾第3节,"升级最佳实践"并相应地制定计划。

  • 升级过程因平台和初始安装执行方式而异。使用适用于当前MySQL安装的过程:

1、对于非Windows平台上的二进制和基于包的安装,详情可见第7节,"升级在Unix/Linux上的二进制或基于包安装的MySQL"。对于受支持的Linux发行版,升级基于包的安装的首选方法是使用MySQL软件存储库(MySQLYum Repository、MySQLAPT Repository和MySQLSLES Repository)。

2、对于使用MySQLYum Repository在Enterprise Linux平台或Fedora上的安装,详情可见第8节,"使用MySQLYum Repository升级MySQL"。

3、对于使用MySQLAPT存储库在Ubuntu上的安装,详情可见第9节,"使用MySQLAPT存储库升级MySQL"。

4、对于使用MySQLSLES源在SLES上的安装,详情可见第10节,"使用MySQLSLES源升级MySQL"。

5、对于使用Docker进行的安装,详情可见第12节,"升级使用Docker安装的MySQL"。

6、对于Windows上的安装,详情可见第11节,"在Windows上升级MySQL"。

  • 如果您的MySQL安装包含大量数据,在就地升级后可能需要很长时间才能转换,那么创建一个测试实例来评估所需的转换以及执行这些转换所涉及的工作可能会很有用。要创建测试实例,请复制包含mysql数据库和其他没有数据的数据库的MySQL实例。在测试实例上运行升级过程以评估执行实际数据转换所涉及的工作。

  • 安装或升级到新版本的MySQL时,建议重建和重新安装MySQL语言界面。这适用于MySQL接口,如PHPmysql扩展和PerlDBD::mysql模块。

第2节、升级路径

在继续降级之前,请确保您了解MySQL长期支持(LTS)和创新版本MySQL的MySQL发布模型。

我们建议在执行升级之前检查MySQLShell的升级检查器实用程序的升级兼容性。

复制拓扑按照"升级或降级复制拓扑"中描述的滚动升级方案进行升级,该方案对每个单独的服务器升级使用受支持的单服务器方法之一。

每月快速更新(MRU)和热修复也算在此留档中的发布。

表3.1MySQL服务器的升级路径

| Upgrade Path | Path Examples | Supported Upgrade Methods |
| Within an LTS or Bugfix series | 8.0.37 to 8.0.41 or 8.4.0 to 8.4.4 | In-place upgrade, logical dump and load, replication, and MySQL Clone |
| From an LTS or Bugfix series to the next LTS series | 8.0.37 to 8.4.x LTS | In-place upgrade, logical dump and load, and replication |
| From an LTS or Bugfix release to an Innovation release before the next LTS series | 8.0.34 to 8.3.0 or 8.4.0 to 9.0.0 | In-place upgrade, logical dump and load, and replication |
| From an Innovation series to the next LTS series | 8.3.0 to 8.4 LTS | In-place upgrade, logical dump and load, and replication |
| From an Innovation series to an Innovation release after the next LTS series | Not allowed, two steps are required: 8.3.0 to 8.4 LTS, and 8.4 LTS to 9.x Innovation | In-place upgrade, logical dump and load, and replication |
| From within an Innovation series | 8.1.0 to 8.3.0 | In-place upgrade, logical dump and load, and replication |

From MySQL 5.7 to an LTS or Innovation release MySQL 5.7 to 8.4 A bugfix or LTS series cannot be skipped, so in this example first upgrade MySQL 5.7 to MySQL 8.0, and then upgrade MySQL 8.0 to MySQL 8.4.

第3节、升级最佳实践

MySQL支持在次要版本(在LTS系列中)和下一个主要版本(在LTS系列中)之间升级。升级提供最新的功能、性能和安全修复。

为了准备并帮助确保您成功升级到最新的MySQL版本,我们推荐以下最佳实践:

决定升级的主要或次要版本

MySQL发布模型区分了LTS(长期支持)和创新版本。LTS版本有8年以上的支持,用于生产用途。创新版本为用户提供最新的特性和功能。

执行小版本升级很简单,而大版本升级需要在升级前进行策略规划和额外测试。本指南对大版本升级特别有用。

决定升级类型

升级MySQL有三种主要方法;阅读相关的留档以确定哪种类型的升级最适合您的情况。

  • 就地升级:替换MySQL服务器包。
  • 逻辑升级:将SQL从旧MySQL实例导出到新实例。
  • 复制拓扑升级:说明每个服务器的拓扑角色。

查看支持的平台

如果新版本的MySQL不支持您当前的操作系统,请计划升级操作系统,否则不支持就地升级。

有关支持的平台的当前列表,请参阅:MySQL :: Supported Platforms: MySQL Database

了解MySQL服务器更改

每个主要版本都带有新功能、行为变化、弃用和删除。了解其中每一个对现有应用程序的影响非常重要。参见:第5节,"8.4MySQL的变化"。

运行升级检查器并修复不兼容性

MySQLShell的升级检查器实用程序检测执行升级前必须解决的数据库版本之间的不兼容性。util.checkForServerUpgrade()函数验证MySQL服务器实例已准备好升级。连接到现有的MySQL服务器并选择您计划升级到的MySQL服务器版本,以便实用程序在升级前报告要解决的问题。这些问题包括数据类型、存储引擎等方面的不兼容性。

当升级检查实用程序不再报告任何问题时,您已准备好升级。

在测试环境中运行应用程序

完成升级检查器的要求后,接下来在新的目标MySQL服务器上测试您的应用程序。检查MySQL错误日志和应用程序日志中的错误和警告。

基准应用程序和工作负载性能

我们建议您对自己的应用程序和工作负载进行基准测试,比较它们使用以前版本和新版本的MySQL的性能。通常,较新的MySQL版本会添加功能并提高性能,但在某些情况下,特定查询的升级可能会运行较慢。可能导致性能下降的问题:

  • 先前的服务器配置不适合更高版本

  • 数据类型的更改

  • 多字节字符集支持所需的额外存储

  • 存储引擎更改

  • 删除或更改索引

  • 更强的加密

  • 更强的鉴权

  • SQL优化器更改

  • 新版本的MySQL需要额外的内存

  • 物理或虚拟硬件速度较慢-计算或存储

并行运行MySQL版本

为了最大限度地降低风险,最好保持当前系统运行,同时运行升级后的系统同时进行。

运行最终测试升级

在升级正式服务器之前练习并运行。在升级生产系统之前彻底测试升级过程。

检查MySQL备份

在执行升级之前,请检查全量备份是否存在且可行。

升级生产服务器

您已准备好完成升级。

企业支持

如果您是MySQL企业版客户,您还可以联系MySQL支持团队专家提出任何问题。

第4节、MySQL升级过程升级的内容

安装新版本的MySQL可能需要升级现有安装的以下部分:

1、mysql系统schema,其中包含存储MySQL服务器运行时所需信息的表(参见"mysql系统架构")。mysqlschema表分为两大类:

  • 存储数据库对象元信息的数据字典表。

  • 系统表(即剩余的非数据字典表),用于其他操作目的。

2、其他schema,其中一些是内置的,可能被认为是服务器"拥有"的,而另一些不是:

  • performance_schema、INFORMATION_SCHEMA、ndbinfo和sys模式。
  • 用户schema。

两个不同的版本号与可能需要升级的安装部分相关联:

  • 数据字典版本。这适用于数据字典表。

  • 服务器版本,也被称为MySQL版本。这适用于其他模式中的系统表和对象。

在这两种情况下,适用于现有MySQL安装的实际版本都存储在数据字典中,当前预期版本被编译成MySQL的新版本。当实际版本低于当前预期版本时,与该版本相关的安装部分必须升级到当前版本。如果两个版本都表明需要升级,则必须首先进行数据字典升级。

作为刚才提到的两个不同版本的反映,升级分两个步骤进行:

1、数据字典升级

此步骤升级:

  • 数据字典表在mysqlschema。如果实际数据字典版本低于当前预期版本,服务器创建具有更新定义的数据字典表,复制持久元信息到新表,原子替换旧表与新表,并重新初始化数据字典。

  • 性能架构、INFORMATION_SCHEMAndbinfo

2、服务器升级

此步骤包含所有其他升级任务。如果现有MySQL安装的服务器版本低于新安装的MySQL版本,则必须升级其他所有内容:

  • 系统表在mysql schema(其余的非数据字典表)。

  • sys schema

  • 用户schema

数据字典升级(步骤1)由服务器负责,服务器在启动时根据需要执行此任务,除非使用阻止它这样做的选项调用。选项是--upgrade=NONE。

如果数据字典过期,但服务器无法升级,则服务器不会运行,而是以错误退出。例如:

bash 复制代码
[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操作。FORCEAUTO的区别之一是,使用FORCE,服务器会重新创建系统表,例如帮助表或时区表(如果它们丢失)。

关于升级步骤2期间发生的事情的附加说明:

  • 步骤2安装sysschema如果未安装,则将其升级到当前版本。如果sys schema存在但没有version视图,则会发生错误,假设它的缺失表明用户创建了schema:

    bash 复制代码
    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.

    在这种情况下,要升级,请先删除或重命名现有的sysschema。然后再次执行升级过程。(可能需要强制执行步骤2。)要防止sysschema检查,请使用--upgrade=NONE--upgrade=MINIMAL选项启动服务器。

  • 步骤2升级系统表以确保它们具有当前结构,这包括帮助表,但不包括时区表。加载时区表的过程取决于平台,需要数据库管理员做出决策,因此不能自动完成。

  • 当第2步升级mysqlschema中的系统表时,mysql.db、mysql.tables_priv、mysql.columns_priv和mysql.procs_priv表更改为将主机名和用户名列放在一起。将主机名和用户名放在一起意味着可以使用索引查找,这提高了CREATE USER、DROP USER和RENAME USER

  • 第2步根据需要处理所有用户模式中的所有表。表检查可能需要很长时间才能完成。每个表都被锁定,因此在处理时其他会话无法使用。检查和修复操作可能很耗时,尤其是对于大型表。表检查使用CHECK TABLE语句的FOR UPGRADE选项。有关此选项的详细信息,请参阅"CHECK TABLE语句"。

    要防止表检查,请使用--upgrade=NONE--upgrade=MINIMAL选项启动服务器。要强制检查表,请使用--upgrade=FORCE选项启动服务器。

  • 步骤2用当前MySQL版本号标记所有已检查和修复的表。这确保了下次使用相同版本的服务器进行升级检查时,可以确定是否需要再次检查或修复给定的表。

第5节、MySQL的变化

在升级到MySQL8.4之前,请查看本节中链接的更改,以确定适用于当前MySQL安装和应用程序的更改。

第6节、为升级安装做准备

在升级到最新的MySQL8.4版本之前,通过执行下面描述的初步检查,确保当前MySQL8.3或MySQL8.4服务器实例的升级就绪。否则升级过程可能会失败。

请考虑使用MySQLShell升级检查实用程序来验证MySQL服务器实例是否已准备好升级。您可以选择计划升级到的目标MySQL服务器版本,范围从MySQL服务器8.0.11到与当前MySQLShell版本号匹配的MySQL服务器版本号。升级检查实用程序执行与指定目标版本相关的自动检查,并建议您应手动进行进一步的相关检查。升级检查程序适用于MySQL5.7、8.0和8.3的所有GA版本。MySQLShell的安装说明可以在此处找到。

初步检查:

1、不得存在以下问题:

  • 不得有使用过时数据类型或函数的表。

  • 不能有孤立的.frm文件。

  • 触发器不能有丢失或空的定义器或无效的创建上下文(由SHOW TRIGGERS或INFORMATION_SCHEMATRIGGERSDatabase Collation表显示的character_set_clientcollation_connection、 TRIGGERS属性指示)。必须转储和恢复任何此类触发器以修复问题。

要检查这些问题,请执行以下命令:

bash 复制代码
mysqlcheck -u root -p --all-databases --check-upgrade

如果mysqlcheck报告任何错误,请更正问题。

2、不得有使用不支持本机分区的存储引擎的分区表。要识别此类表,请执行以下查询:

bash 复制代码
SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE ENGINE NOT IN ('innodb', 'ndbcluster')
        AND CREATE_OPTIONS LIKE '%partitioned%';

查询报告的任何表都必须更改为使用InnoDB或变得非分区。要将表存储引擎更改为InnoDB,请执行以下语句:

bash 复制代码
ALTER TABLE table_name ENGINE = INNODB;

有关将MyISAM转换为InnoDB的信息,请参阅"将表从MyISAM转换为InnoDB"。

要使分区表非分区,请执行以下语句:

bash 复制代码
ALTER TABLE table_name REMOVE PARTITIONING;

3、有些关键字可能会在8.4MySQL中被保留,这些关键字以前没有被保留。请参见,"关键字和保留字"。这可能会导致以前用作标识符的单词变得非法。要修复受影响的语句,请使用标识符引用。请参见,"模式对象名称"。

4、MySQL8.3mysql系统数据库中的表不能与MySQL8.4数据字典使用的表同名。要识别具有这些名称的表,请执行以下查询:

bash 复制代码
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE 
    LOWER(TABLE_SCHEMA) = 'mysql'
    AND 
    LOWER(TABLE_NAME) IN
    (
    'catalogs',
    'character_sets',
    'check_constraints',
    'collations',
    'column_statistics',
    'column_type_elements',
    'columns',
    'dd_properties',
    'events',
    'foreign_key_column_usage',
    'foreign_keys',
    'index_column_usage',
    'index_partitions',
    'index_stats',
    'indexes',
    'parameter_type_elements',
    'parameters',
    'resource_groups',
    'routines',
    'schemata',
    'st_spatial_reference_systems',
    'table_partition_values',
    'table_partitions',
    'table_stats',
    'tables',
    'tablespace_files',
    'tablespaces',
    'triggers',
    'view_routine_usage',
    'view_table_usage'
    );
复制代码
必须删除或重命名查询报告的任何表(使用RENAME TABLE)。这也可能需要更改使用受影响表的应用程序。

5、不能有外键约束名称超过64个字符的表。使用此查询来标识约束名称太长的表:

bash 复制代码
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME IN
  (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1),
               INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1)
   FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN
   WHERE LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);
复制代码
对于约束名称超过64个字符的表,删除约束并使用不超过64个字符的约束名称将其添加回来(使用ALTER TABLE)。

6、不能有sql_mode系统变量定义的过时SQL模式。尝试使用过时的SQL模式会阻止8.4MySQL启动。应修改使用过时SQL模式的应用程序以避免它们。有关8.4MySQL中删除的SQL模式的信息,请参阅服务器更改。

7、仅升级已正确关停的MySQL服务器实例。如果实例意外关停,则在升级前重新启动实例并将其关闭innodb_fast_shutdown=0。

8、不能有列名称超过64个字符的视图(在MySQL5.7中允许列名称最多为255个字符的视图)。为避免升级错误,应在升级前更改此类视图。目前,识别列名称超过64个字符的视图的唯一方法是使用SHOW CREATE VIEW检查视图定义。您还可以通过查询Information SchemaVIEWS表来检查视图定义。

9、不能有单独的ENUMSET列元素长度超过255个字符或1020字节的表或存储过程。在MySQL8.4之前,64KENUMSET列元素的最大组合长度。在MySQL8.4中,单个ENUMSET列元素的最大字符长度为255个字符,最大字节长度为1020字节。(1020字节限制支持多字节字符集)。在升级到MySQL8.0之前,修改任何超过新限制的ENUMSET

10、您的MySQL 8.3安装不得使用MySQL 8.4不支持的功能。此处的任何更改都必须特定于安装,但以下示例说明了要查找的内容:

MySQL 8.4中删除了一些服务器启动选项和系统变量。请参阅MySQL 8.4中删除的功能和"自8.0以来在MySQL 8.4中添加、弃用或删除的服务器和状态变量和选项"。如果您使用其中任何一个,升级需要更改配置。

11、如果您打算在升级时将lower_case_table_names设置更改为1,请在升级前确保schema和表名为小写。否则,可能会由于schema或表名字母不匹配而发生故障。您可以使用以下查询来检查包含大写字符的schema和表名:

bash 复制代码
mysql> select TABLE_NAME, if(sha(TABLE_NAME) !=sha(lower(TABLE_NAME)),'Yes','No') as UpperCase from information_schema.tables;

如果lower_case_table_names=1,升级过程将检查表名和schema,以确保所有字符均为小写。如果发现表名或schema包含大写字符,则升级过程将失败并出现错误。

不推荐在升级时更改lower_case_table_names设置。

如果由于上述任何问题导致升级到8.4MySQL失败,服务器将恢复对数据目录的所有更改。在这种情况下,删除所有重做日志文件,并在存量数据目录上重新启动MySQL8.3服务器以解决错误。重做日志文件(ib_logfile*)默认驻留在MySQL数据目录中。修复错误后,在再次尝试升级之前执行缓慢关闭(通过设置innodb_fast_shutdown=0)。

第7节、升级在Unix/Linux上使用二进制或基于包安装的MySQL

就地升级

就地升级包括关闭旧的MySQL服务器,用新的MySQL二进制文件或包替换旧的二进制文件或包,重新启动存量数据目录上的MySQL,以及升级现有安装中需要升级的任何剩余部分。有关可能需要升级的详细信息,请参阅第4节,"MySQL升级过程升级的内容"。

如果您要升级最初通过安装多个rpm包而产生的安装,请升级所有包,而不仅仅是一些。例如,如果您之前安装了服务器和客户端RPM,请不要只升级服务器rpm。

对于某些Linux平台,rpm或Debian包括用于管理MySQL服务器启动和关闭的systemd支持。在这些平台上,则没有安装mysqld_safe。在这种情况下,使用systemd进行服务器启动和关闭,而不是以下说明中使用的方法。参见,"使用systemd管理MySQL服务器"。有关MySQL集群安装的升级,请参阅MySQL集群升级。

要执行就地升级:

1、查看第1节,"在你开始之前"中的信息。

2、通过完成第6节,"为升级安装做准备"中的初步检查,确保安装的升级就绪。

3、如果您在InnoDB中使用XA事务,请在升级前运行XA RECOVER以检查未提交的XA事务。如果返回结果,请通过发出XA COMMIT或XA ROLLBACK语句来提交或回滚XA事务。

4、如果您通常运行innodb_fast_shutdown设置为2(冷关闭)的MySQL服务器,请通过执行以下语句之一将其配置为执行快速或慢速关闭:

bash 复制代码
SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown
SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown
  1. 通过快速或慢速关闭,InnoDB将其撤消日志和数据文件保持在可以在版本之间的文件格式差异时处理的状态。

5、 关闭旧的MySQL服务器。例如:

bash 复制代码
mysqladmin -u root -p shutdown

6、升级MySQL二进制文件或包。如果升级二进制安装,请解压缩新的MySQL二进制发行包。请参阅获取并解压缩该发行包。对于基于包的安装,请安装新包。

7、使用存量数据目录启动MySQL8.4服务器。例如:

bash 复制代码
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &

如果有加密的InnoDB表空间,请使用--early-plugin-load选项加载密钥环插件。

当您启动MySQL8.4服务器时,它会自动检测是否存在数据字典表。如果没有,服务器会在data目录中创建它们,用元信息填充它们,然后继续其正常的启动顺序。在此过程中,服务器会升级所有数据库对象的元信息,包括数据库、表空间、系统和用户表、视图和存储程序(存储过程和函数、触发器和事件调度程序事件)。服务器还会删除以前用于元信息存储的文件。例如,从8.3MySQL升级到8.4MySQL后,您可能会注意到表不再有.frm文件。

如果此步骤失败,服务器将恢复对数据目录的所有更改。在这种情况下,您应该删除所有重做日志文件,在同一数据目录上启动MySQL8.3服务器,并修复任何错误的原因。然后对8.3服务器执行另一次缓慢关闭,并启动MySQL8.4服务器重试。

8、在上一步中,服务器根据需要升级数据字典,在MySQL8.3和8.4MySQL之间对mysql系统数据库进行任何所需的更改,以便您可以利用新的权限或功能。它还使性能模式、INFORMATION_SCHEMAsys数据库更新到8.4MySQL,并检查所有用户数据库是否与当前版本的MySQL不兼容。

升级过程不会升级时区表的内容。

逻辑升级

逻辑升级涉及使用备份或导出实用程序(如mysqldump)从旧MySQL实例导出SQL,安装新的MySQL服务器,并将SQL应用于新的MySQL实例。有关可能需要升级的详细信息,请参阅第4节,"MySQL升级过程升级的内容"。

对于某些Linux平台,从rpm或Debian软件包安装的MySQL包括用于管理MySQL服务器启动和关闭的systemd支持。在这些平台上,没有安装mysqld_safe。在这种情况下,使用systemd进行服务器启动和关闭,而不是以下说明中使用的方法。参见"使用systemd管理MySQL服务器"。

将以前MySQL版本中提取的SQL应用到新的MySQL版本可能会导致错误,因为新的、更改的、弃用的或删除的特性和功能引入了不兼容。因此,从以前MySQL版本中提取的SQL可能需要修改以启用逻辑升级。

要在升级到最新的MySQL8.4版本之前识别不兼容性,请执行第6节,"为升级安装做准备"中描述的步骤。

要执行逻辑升级:

1、查看第1节,"在你开始之前"中的信息。

2、从以前的MySQL安装导出存量数据:

bash 复制代码
mysqldump -u root -p
  --add-drop-table --routines --events
  --all-databases --force > data-for-upgrade.sql
复制代码
如果您的数据库包含存储的程序,请在mysqldump中使用--routines和--events选项(如上所示)。--all-databases选项包括转储中的所有数据库,包括保存系统表的mysql数据库。

如果有包含生成列的表,请使用MySQL或更高版本提供的mysqldump实用程序来创建转储文件。早期版本中提供的mysqldump实用程序对生成的列定义使用了不正确的语法(错误#20769542)。您可以使用信息架构COLUMNS表来标识具有生成列的表。

3、关闭旧的MySQL服务器。例如:

bash 复制代码
mysqladmin -u root -p shutdown

4、安装MySQL8.4.有关安装说明,请参见,安装MySQL。

5、 初始化一个新的数据目录,如"初始化数据目录"中所述。例如:

bash 复制代码
mysqld --initialize --datadir=/path/to/8.4-datadir
  1. 将临时'root'@'localhost'密码复制到屏幕上或写入错误日志以供以后使用。

6、使用新的数据目录启动MySQL8.4服务器。例如:

bash 复制代码
mysqld_safe --user=mysql --datadir=/path/to/8.4-datadir &

7、重置root密码:

bash 复制代码
$> mysql -u root -p
Enter password: ****  <- enter temporary root password
bash 复制代码
mysql> ALTER USER USER() IDENTIFIED BY 'your new password';

8、将先前创建的转储文件加载到新的MySQL服务器中。例如:

bash 复制代码
mysql -u root -p --force < data-for-upgrade.sql
复制代码
如果转储文件包含系统表,则不推荐在服务器上启用GTID(gtid_mode=ON)时加载转储文件。mysqldump为使用非事务性MyISAM存储引擎的系统表发出数据操纵语言指令,并且在启用GTID时不允许这种组合。还要注意,将转储文件从启用GTID的服务器加载到启用GTID的另一台服务器会导致生成不同的事务标识符。

9、执行任何剩余的升级操作:

关闭服务器,然后使用--upgrade=FORCE选项重新启动它以执行剩余的升级任务:

bash 复制代码
mysqladmin -u root -p shutdown
mysqld_safe --user=mysql --datadir=/path/to/8.4-datadir --upgrade=FORCE &

使用--upgrade=FORCE重新启动后,服务器会在8.3MySQL和8.4MySQL之间对mysql系统schema进行所需的任何更改,以便您可以利用新的权限或功能。它还会使性能模式、INFORMATION_SCHEMA和sysschema更新到8.4MySQL,并检查所有用户模式是否与当前版本的MySQL不兼容。

升级过程不会升级时区表的内容。

MySQL集群升级

本节中的信息是对就地升级中描述的就地升级过程的补充,用于升级MySQL簇。

MySQL集群升级可以作为常规滚动升级执行,遵循通常的三个有序步骤:

  1. 升级MGM节点。

  2. 一次升级一个数据节点。

  3. 一次升级一个API节点(包括MySQL服务器)。

升级每个单独的mysqld有两个步骤:

  1. 导入数据字典。使用--upgrade=MINIMAL选项启动新服务器,升级数据字典,但不升级系统表。

    MySQL服务器必须连接到NDB才能完成此阶段。如果存在任何NDBNDBINFO表,并且服务器无法连接到集群,则会退出并显示错误消息:

    bash 复制代码
    Failed to Populate DD tables.
    复制代码
    2、导入数据字典。使用--upgrade=MINIMAL选项启动新服务器,升级数据字典,但不升级系统表。

第8节、使用MySQL Yum源升级MySQL

对于受支持的基于Yum的平台(请参阅,"在Linux上安装MySQL使用MySQLYum源",有关列表),您可以使用MySQLYum存储库对MySQL执行就地升级(即替换旧版本,然后使用旧数据文件运行新版本)。

  • 创新系列(如MySQL9.1)与LTS系列(如MySQL8.4)处于单独的轨道中。LTS系列默认处于活动状态。

  • 在对MySQL执行任何更新之前,请仔细遵循升级MySQL中的说明。在那里讨论的其他说明中,在更新之前备份数据库尤其重要。

  • 以下说明假定您已安装MySQLMySQLYum源或直接从MySQL开发人员专区MySQL下载页面下载的rpm包;如果不是这种情况,请按照替换MySQL的原生第三方发行中的说明进行操作。

选择目标系列

默认情况下,MySQLYum源更新MySQL您在安装过程中选择的发行轨道中的最新版本(详细信息请参见选择发布系列),这意味着,例如,8.0. x安装不会自动更新到8.4.x版本。要更新到另一个发布系列,您必须首先禁用已选择系列的子存储库(默认或由您自己)并为目标系列启用子存储库。为此,请参阅选择发布系列中给出的一般说明,以编辑/etc/yum.repos.d/mysql-community.repo文件中的子存储库条目。

一般来说,要从一个错误修复系列升级到另一个错误修复系列,请转到下一个错误修复系列,而不是跳过一个错误修复系列。例如,如果您当前运行MySQL5.7并希望升级到8.4MySQL,请先升级到8.0MySQL,然后再升级到8.4MySQL。有关更多详细信息,请参阅第5节,"MySQL8.4中的更改"。

  • 有关从MySQL5.7升级到8.0的重要信息,请参阅从MySQL5.7升级到8.0

  • 有关从MySQL8.0升级到8.4的重要信息,请参阅从MySQL8.0升级到8.4

  • MySQLYum源不支持MySQL就地降级。请按照降级MySQL中的说明进行操作。

升级MySQL

使用标准yum(或dnf)命令升级MySQL组件,例如MySQLServer:

bash 复制代码
sudo yum update mysql-server

对于启用dnf的平台:

bash 复制代码
sudo dnf upgrade mysql-server

或者,您可以通过告诉Yum更新系统上的所有内容来更新MySQL,这可能需要更多时间。对于未启用dnf的平台:

bash 复制代码
sudo yum update

对于启用dnf的平台:

bash 复制代码
sudo dnf upgrade

MySQL服务器总是在Yum更新后重新启动。

您也可以仅更新特定组件。使用以下命令列出MySQL组件的所有已安装包(对于启用dnf的系统,将命令中的yum替换为dnf):

bash 复制代码
sudo yum list installed | grep "^mysql"

确定所选组件的包名后,使用以下命令更新包,将*package-name*替换为包的名称。对于未启用dnf的平台:

bash 复制代码
sudo yum update package-name

对于启用dnf的平台:

bash 复制代码
sudo dnf upgrade package-name

升级共享客户端库

使用Yum存储库更新MySQL后,使用旧版本共享客户端库编译的应用程序应继续工作。

如果您重新编译应用程序并将它们与更新的库动态链接:就像新版本的共享库一样,在新旧库之间的符号版本控制存在差异或添加(例如,在较新的标准8.4共享客户端库和Linux发行版的软件存储库或其他一些来源本地提供的一些较旧的-先前或变体-版本的共享库之间),任何使用更新的、较新的共享库编译的应用程序都需要在部署应用程序的系统上使用这些更新的库。正如预期的那样,如果这些库不到位,需要共享库的应用程序就会失败。

因此,请务必在这些系统上MySQL部署共享库的包。为此,请将MySQLYum存储库添加到系统中(请参阅添加MySQLYum存储库),并使用使用Yum安装其他MySQL产品和组件中给出的说明安装最新的共享库。

第9节、使用MySQL APT源升级MySQL

在Debian和Ubuntu平台上,要执行MySQL及其组件的就地升级,请使用MySQLAPT存储库。请参阅使用MySQLAPT存储库升级MySQL。

第10节、使用MySQL SLES源升级MySQL

.在SUSELinuxEnterprise Server(SLES)平台上,要执行MySQL及其组件的就地升级,请使用MySQLSLES存储库。请参阅使用MySQLSLES存储库升级MySQL。

第11节、在Windows上升级MySQL

要在Windows上升级MySQL,请下载并执行最新的MySQLServer MSI使用Windows ZIP归档分布

与MySQL8.4不同,MySQL8.0使用MySQL安装程序来安装和升级MySQL服务器以及大多数其他MySQL产品;但是MySQL安装程序不适用于MySQL8.1及更高版本。但是,MySQL安装程序中使用的配置功能从8.1MySQL开始可用"配置:使用MySQL配置器"它与MSI和Zip归档捆绑在一起。

您选择的方法取决于现有安装的执行方式。

使用MSI升级MySQL

下载并执行最新的MSI。虽然不直接支持版本系列之间的升级,但"自定义设置"选项允许定义安装位置,否则MSI将安装到标准位置,例如C:\Program Files\MySQL\MySQL Server 8.4\

执行MySQLConfigurator来配置您的安装。

使用Windows ZIP发行升级MySQL

要使用Windows ZIP归档发行执行升级:

  1. MySQL :: MySQL Community Downloads下载MySQL的最新Windows ZIP归档分布。

  2. 如果服务器正在运行,请停止它。如果服务器作为服务安装,请在命令提示符下使用以下命令停止服务:

    bash 复制代码
    C:\> SC STOP mysqld_service_name

    或者,使用NET STOP*mysqld_service_name*。如果您没有将MySQL服务器作为服务运行,请使用mysqladmin停止它。例如,在从8.3MySQL升级到8.4之前,使用8.3MySQL的mysqladmin如下所示:

    bash 复制代码
    C:\> "C:\Program Files\MySQL\MySQL Server 8.3\bin\mysqladmin" -u root shutdown

    如果MySQLroot帐户有密码,-p选项调起mysqladmin并在出现提示时输入密码。

  3. 解压缩ZIP归档。您可以覆盖现有的MySQL安装(通常位于C:\mysql),也可以将其安装到其他目录,例如C:\mysql8。建议覆盖现有安装。

  4. 重新启动服务器。例如,如果MySQL作为服务运行,请使用SC START*mysqld_service_name* 或**NET START*mysqld_service_name***命令,否则直接调起mysqld。

  5. 如果遇到错误,请参阅"对Microsoft WindowsMySQL服务器安装进行故障排除"。

第12节、升级MySQL的Docker安装

要升级MySQL的Docker安装,详情可见升级MySQL服务器容器。

第13节、升级故障排除

  • MySQL8.3实例中表的.frm文件和InnoDB数据字典之间的schema不匹配可能导致升级到8.4MySQL失败。这种不匹配可能是由于.frm文件损坏造成的。要解决此问题,请在再次尝试升级之前转储并恢复受影响的表。

  • 如果出现问题,例如新的mysqld服务器没有启动,请确认您没有上一个安装中的旧my.cnf文件。您可以使用--print-defaults选项进行检查(例如,mysqld--print-default)。如果此命令显示程序名称以外的任何内容,则您有一个影响服务器或客户端操作的活动my.cnf文件。

  • 如果在升级后,您在编译客户端程序时遇到问题,例如Commands out of sync或意外的核心转储,您在编译程序时可能使用了旧的表头或库文件。在这种情况下,请检查您的mysql.h文件和libmysqlclient.a库的日期,以验证它们是否来自新的MySQL分布。如果没有,请使用新的标头和库重新编译您的程序。如果库的主要版本号已更改(例如,从libmysqlclient.so.20更改为libmysqlclient.so.21),则针对共享客户端库编译的程序也可能需要重新编译。

  • 如果创建了具有给定名称的可加载函数,并将MySQL升级到实现具有相同名称的新内置函数的版本,则可加载函数将变得不可访问。要纠正这一点,请使用DROP FUNCTION删除可加载函数,然后使用CREATE FUNCTION重新创建具有不同非冲突名称的可加载函数。如果MySQL的新版本实现了与现有存储函数同名的内置函数,情况也是如此。请参阅,"函数名称解析和解析",了解描述服务器如何解释对不同类型函数的引用的规则。

  • 如果升级到MySQL8.4失败,原因是第6节,"为升级准备安装",服务器将恢复对数据目录的所有更改。在这种情况下,删除所有重做日志文件,并在存量数据目录上重新启动MySQL8.3服务器以解决错误。重做日志文件(ib_logfile*)默认驻留在MySQL数据目录中。修复错误后,在再次尝试升级之前执行缓慢关闭(通过设置innodb_fast_shutdown=0)。

第14节、重建或修复表或索引

本节介绍如何重建或修复表或索引,这可能需要:

  • 更改MySQL处理数据类型或字符集的方式。例如,排序规则中的错误可能已得到纠正,因此需要重建表以更新使用排序规则的字符列的索引。

  • 所需的表修复或升级由CHECK TABLE或mysqlcheck报告。

转储和重新装载方法

如果您正在重建表,因为在二进制(就地)升级或降级后,不同版本的MySQL无法处理它们,则必须使用转储-重新加载方法。在使用原始版本的MySQL升级或降级之前转储表。然后在升级或降级后重新加载表。

如果仅为了重建索引而使用转储和重新加载方法重建表,则可以在升级或降级之前或之后执行转储。之后仍然必须进行重新加载。

如果您需要重建InnoDB表,因为CHECK TABLE操作表明需要表升级,请使用mysqldump创建转储文件并使用mysql重新加载文件。如果CHECK TABLE操作表明存在损坏或导致InnoDB失败,详情可见第17.20.3节,"强制InnoDB恢复"有关使用innodb_force_recovery选项重新启动InnoDB的信息。要了解CHECK TABLE可能遇到的问题类型,详情可见,"CHECK TABLE语句"在InnoDB中的注释。

要通过转储和重新加载来重建表,请使用mysqldump创建转储文件并使用mysql重新加载文件:

bash 复制代码
mysqldump db_name t1 > dump.sql
mysql db_name < dump.sql

要在单个数据库中重建所有表,请指定不带任何以下表名的库名:

bash 复制代码
mysqldump db_name > dump.sql
mysql db_name < dump.sql

若要重建所有数据库中的所有表,请使用--all-databases选项:

bash 复制代码
mysqldump --all-databases > dump.sql
mysql < dump.sql

ALTER表方法

要使用ALTER TABLE重建表,请使用"null"更改;也就是说,ALTER TABLE语句"更改"表以使用它已经拥有的存储引擎。例如,如果t1是InnoDB表,请使用以下语句:

bash 复制代码
ALTER TABLE t1 ENGINE = InnoDB;

如果您不确定要在ALTER TABLE语句中指定哪个存储引擎,请使用SHOW CREATE TABLE显示表定义。

修复表法

此REPAIR TABLE方法仅适用于MyISAM、ARCHIVE和CSV表。如果表检查操作表明存在损坏或需要升级,则可以使用REPAIR TABLE。例如,要修复MyISAM表,请使用以下语句:

bash 复制代码
REPAIR TABLE t1;

mysqlcheck--修复提供了对REPAIR TABLE的命令行访问。这可能是一种更方便的修复表的方法,因为您可以使用--databases或--all-databases选项分别修复特定数据库或所有数据库中的所有表:

bash 复制代码
mysqlcheck --repair --databases db_name ...
mysqlcheck --repair --all-databases

第15节、将MySQL数据库复制到另一台机器

如果您需要在不同架构之间传输数据库,您可以使用mysqldump创建一个包含SQL语句的文件。然后,您可以将文件传输到另一台机器并将其作为输入提供给mysql客户端。使用mysqldump--help查看可用的选项。

如果GTID在您创建转储的服务器上使用(gtid_mode=ON),默认情况下,mysqldump包含转储中设置的gtid_executed的内容,以将这些内容传输到新机器。结果可能因涉及的MySQL服务器版本而异。检查mysqldump --set-gtid-purged选项的描述以查找您正在使用的版本会发生什么,以及如果默认行为的结果不适合您的情况,如何更改行为。

在两台机器之间移动数据库的最简单(尽管不是最快)方法是在数据库所在的机器上运行以下命令:

bash 复制代码
mysqladmin -h 'other_hostname' create db_name
mysqldump db_name | mysql -h 'other_hostname' db_name

如果要通过慢速网络从远程计算机复制数据库,可以使用以下命令:

bash 复制代码
mysqladmin create db_name
mysqldump -h 'other_hostname' --compress db_name | mysql db_name

您还可以将转储存储在文件中,将文件传输到目标机器,然后将文件加载到那里的数据库中。例如,您可以将数据库转储到源机器上的压缩文件中,如下所示:

bash 复制代码
mysqldump --quick db_name | gzip > db_name.gz

将包含数据库内容的文件传输到目标机器并在那里运行以下命令:

bash 复制代码
mysqladmin create db_name
gunzip < db_name.gz | mysql db_name

还可以使用mysqldump和mysqlimport传输数据库,对于大型表,这比简单地使用mysqldump要快得多。在以下命令中,DUMPDIR表示用于存储mysqldump输出的目录的完整路径名。

首先,为输出文件创建目录并转储数据库:

bash 复制代码
mkdir DUMPDIR
mysqldump --tab=DUMPDIR
   db_name

然后将*DUMPDIR*目录中的文件传输到目标机器上的某个相应目录,并将文件加载到MySQL:

bash 复制代码
mysqladmin create db_name           # create database
cat DUMPDIR/*.sql | mysql db_name   # create tables in database
mysqlimport db_name
   DUMPDIR/*.txt   # load data into tables

不要忘记复制mysql数据库,因为那是存储授权表的地方。您可能必须在新机器上以MySQLroot用户身份运行命令,直到mysql数据库就位。

在新机器上导入mysql数据库后,执行mysqladmin flush-权限,以便服务器重新加载授权表信息。

复制代码
复制代码
相关推荐
java1234_小锋41 分钟前
Redis有哪些常用应用场景?
java·数据库·redis
weisian1511 小时前
Mysql--运维篇--日志管理(连接层,SQL层,存储引擎层,文件存储层)
运维·mysql
wrjwww1 小时前
【MySQL学习笔记】视图View
笔记·学习·mysql
@逆风微笑代码狗1 小时前
144.《在 macOS 上安装 Redis》
数据库·redis·macos
大霸王龙1 小时前
Apache AGE:基于PostgreSQL的图数据库深度解析
数据库·postgresql·apache
前端 贾公子2 小时前
MySQL数据库基础 === 多表查询
数据库
大雄野比2 小时前
Mysql连接报错排查解决记录
数据库·mysql·adb
Run Out Of Brain2 小时前
MySQL教程之:批量使用mysql
数据库·mysql
BabyFish132 小时前
MySQL数据导出导入
android·mysql·adb
Minxinbb2 小时前
MySQL主从:如何处理“Got Fatal Error 1236”或 MY-013114 错误(percona译文)
数据库·mysql·dba