升级数据库版本

RDS MySQL提供了两种方式升级数据库版本,您可以通过控制台直接升级数据库,也可以新购一个高版本MySQL实例,通过DTS数据迁移任务将原实例数据迁移至新实例中,实现数据库版本的间接升级。

选择升级方式

方式一:通过控制台直接升级数据库版本方式二:通过数据迁移DTS升级数据库版本均支持所有MySQL版本的数据库升级,包括5.5升级至5.6、5.6升级至5.7、5.7升级至8.0。在升级数据库前,您需要通过以下内容选择合适的升级方式:

  • 实例规格符合以下四种类型,且实例配置满足对应类型的要求,建议通过方式一:通过控制台直接升级数据库版本

    集群系列 ESSD云盘

    • 组复制限制:不支持使用组复制(MGR)的集群系列实例升级。

    • 数据库代理限制(如有):数据库代理小版本不低于1.13.41。

    • 实例状态限制:实例状态为运行中,主备节点状态健康且无延迟。

    • 引擎限制:数据库及所有库表都为InnoDB引擎。

    • 不属于已下线的历史规格,详情请参见历史规格

    高可用系列 ESSD云盘

    • 数据库代理限制(如有):数据库代理小版本不低于1.13.41。

    • 实例状态限制:实例状态为运行中,主备节点状态健康且无延迟。

    • 引擎限制:数据库及所有库表都为InnoDB引擎。

    • 不属于已下线的历史规格,详情请参见历史规格

    高可用系列 本地SSD盘

    • 加密限制:未开启TDE加密功能(TDE开启后不支持关闭,如已开启TDE,请选择方式二:通过数据迁移DTS升级数据库版本进行升级)。

    • 只读实例限制(如有):所有只读实例规格码一致(只读实例和主实例间不做要求)且只读实例数量不超过8个。

    • 数据库代理限制(如有):数据库代理小版本不低于1.13.41。

    • 实例状态限制:实例状态为运行中,主备节点状态健康且无延迟。

    • 表数量限制:不超过20万张。

    • 引擎限制:数据库及所有库表都为InnoDB引擎。

    • 不属于已下线的历史规格,详情请参见历史规格

    基础系列 ESSD云盘

    • 实例状态限制:实例状态为运行中

    • 引擎限制:数据库及所有库表都为InnoDB引擎。

    • 不属于已下线的历史规格,详情请参见历史规格

其它引擎升级数据库版本请参见:

方式一:通过控制台直接升级数据库版本

准备工作

  1. 了解新旧版本差异与优势

  2. 了解升级过程与影响

    • 版本跨度:RDS MySQL控制台不支持跨大版本升级,升级后不支持降级。例如:MySQL 5.6无法直接升级至MySQL 8.0,需要先升级到MySQL 5.7,再升级到MySQL 8.0。

    • 本地SSD盘实例升级过程:系统先升级备实例,完成后进行主备切换,再升级主实例。升级过程将造成30秒至1分钟的业务中断,请您尽量在业务低峰期执行升级操作。

    • ESSD云盘实例升级过程:系统先建立新节点,并在新节点上执行升级,在新节点升级完成后链路将切换至新节点。升级过程中,将造成30秒至1分钟的业务中断,请您尽量在业务低峰期执行升级操作。

  3. 检查实例与数据库配置

    • 检查保留关键字:查看自定义函数,确保函数中没有使用保留关键字

    • 检查全量备份:检查最近一周是否有全量数据备份的成功记录,必要时请进行一次全量数据备份。

    • 检查自动重连机制:在数据库升级过程中,RDS会进行实例切换,请您尽量在业务低峰期执行升级操作,或确保您的应用有自动重连机制。实例切换的影响请参见实例切换的影响

    • 检查可用存储空间:升级前请确保预留充足的磁盘可用空间(建议预留10 GB以上)。

    • 调整日志清理策略:增加本地日志保留时长以及最大存储空间占有率。具体操作,请参见修改本地日志策略

    • 备份实例参数:为确保MySQL在新版本中的稳定性和性能,完成MySQL数据库大版本升级后,RDS不再支持查看和修改部分在高版本废弃的低版本的参数。在大版本升级前,建议您备份相关参数的修改记录,以便后续操作和审计。

    • 5.6升级至5.7、5.7升级至8.0场景需要额外检查以下内容

      5.6升级至5.7

      检查全文索引及版本信息:低于RDS MySQL 5.6 20221130版本的数据库在创建全文索引时会将其建立在系统表空间上,升级至5.7版本时有概率导致表空间损坏。如您小版本较低,请先升级至RDS MySQL 5.6下最新的小版本,然后再升级数据库大版本,详情请参见常见问题

      5.7升级至8.0

      • 检查特性兼容:如果数据库中的存储过程、触发器、视图或函数中包含MySQL 8.0不支持的特性,请在升级前修改,否则会导致升级失败。

      • 检查系统表依赖:检查您的业务是否对MySQL 5.7系统表(sys、mysql、information_schema、performance_schema库下的表)有依赖,由于MySQL 5.7中的部分系统表升级至8.0后会发生变化(如表被移除、表名变化、表结构变化等),若业务依赖这些发生变化的表,有可能出现错误。

      • 检查数据类型兼容:RDS MySQL 8.0不再支持部分旧版本数据类型。如果表中字段含有MySQL 8.0不支持的数据类型,需要在升级前通过REPAIR TABLE或逻辑导出+导入的方式修复。更多信息请参见准备升级安装

      • 检查comment取值:MySQL 8.0 20221231及之后小版本引入参数loose_upgrade_clear_invalid_comment,该参数取值为ON(默认值)时,在升级过程中会自动清空表、字段、索引的注释乱码,避免升级失败。因此,您需要在升级前确认数据库表中的comment取值是否存在乱码,如果存在,comment将被清空。

      • 检查存储过程:如果数据库中的存储过程或函数存在乱码,请在升级前修正,以免导致升级失败。

  4. 升级前测试与模拟

    • 语法测试:建议在升级前新建一个高版本RDS实例进行语法测试,避免低版本语法或特性在升级高版本后不支持。

    • 模拟升级:建议在升级前克隆原实例,先使用克隆实例进行升级测试,确认各项功能正常后再升级原实例。

  5. 升级后注意事项

    • 恢复旧版本实例:支持使用旧版本云盘备份恢复旧版本实例,本地盘暂不支持。

    • 恢复新版本实例:旧版本备份集无法用于恢复新版本实例,如需进行恢复操作,请使用实例升级后生成的备份集。

操作方式

以下数据库版本升级场景中,您需要先进行升级前置检查,检查通过后再进行升级操作

  • 高可用系列本地SSD盘:5.6升级至5.7、5.7升级至8.0

  • 高可用系列ESSD云盘:5.7升级至8.0

其它场景中您可以直接进行数据库升级操作

升级前置检查通过后进行升级操作

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 单击左侧导航栏大版本升级,进入升级前置检查

  3. 选择升级版本右侧的下拉框中,选择需要升级的版本号,单击创建升级检查报告,报告详情请参见大版本升级检查报告说明

    image

  4. 待检查报告检测完毕,并确认升级无风险后,切换页签至升级实例

  5. 选择升级版本右侧的下拉框中,选择需要升级的版本号,单击升级实例

    image

  6. 在弹出的大版本升级实例中,确认升级的版本,选择切换时间后,单击立即升级

    image

直接升级

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 配置信息区域单击升级数据库版本

    说明

    如果未找到该入口,请确认实例版本是否符合升级的要求。

  3. 在弹出的对话框中,选择立即切换在可维护时间段内进行切换,并单击确定

    • 立即切换:立即开始升级。

    • 在可维护时间段内进行切换:在可维护时间段升级。您也可以单击可维护时间段右侧的设置快速修改可维护时间段。

    说明

    升级过程中,实例的状态为迁移版本中

方式二:通过数据迁移DTS升级数据库版本

对于不支持通过控制台直接升级的实例,您可以创建一个高数据库版本的新实例,通过DTS数据迁移任务将原实例数据迁移至新实例中,实现数据库的间接升级,相关步骤如下:

  1. 创建新实例

  2. 数据迁移至新实例

  3. 释放原实例

举例:您有一个开启了TDE功能的MySQL 5.7实例,其不能通过控制台直接升级数据库版本。此时,您可以创建一个数据库版本为MySQL 8.0的新实例,然后将原实例中的数据迁移至新实例,最后释放原实例,实现数据库版本的间接升级。

重要

跨版本数据迁移后,请先测试兼容性并观察一段时间,确认正常后,再释放原实例。

附录一:MySQL 5.7升级MySQL 8.0的优势

  • 提高了安全性,并在账号管理中实现了更大的灵活性。

  • 支持资源组的创建和管理。

  • InnoDB存储引擎的功能增强。

  • 新增字符集、数据类型、语法、新型备份锁、optimizer_switch标志等支持。

  • JSON、XML增强。

  • Optimizer优化器功能增强。

  • 复制性能增强。

  • 支持创建多值索引、派生条件下推优化。

  • 支持读取MySQL授权表。

  • 支持资源分配控制。

附录二:MySQL5.6升级MySQL 5.7的优势

  • 增加密码管理、账号锁定、加密连接等功能,提高数据库的安全性。

  • 支持在线DDL操作。例如RENAME INDEX重命名索引等。

  • 改进了InnoDB引擎的可扩展性和临时表的性能,实现更快的数据加载速度。

  • 支持JSON。

  • 支持针对分区表的索引条件下推(ICP),以及全新的InnoDB空间索引。

  • 优化了大部分解析器、优化器和成本模型,提高数据库的可维护性、可扩展性和性能。

  • 扩展支持的字符集,包括中国国家标准规定的GB18030字符集。

  • 提供ngram全文解析器插件,支持中文、日文和韩文。

  • 优化源转储线程,减少锁的争用,提高了源吞吐量。

  • 大幅改进了复制延迟问题。

  • 新增sys系统库,提供多个监控项并减少存储空间占用,显著提高数据库的易用性。

附录三:MySQL 8.0和MySQL 5.7版本功能差异列表

说明

下表中仅列出MySQL 8.0与5.7的部分重要差异,其他各版本间差异,请参见MySQL Release Notes

特性

5.7

8.0

GRANT ... IDENTIFIED BY PASSWORD语法

支持

不支持

PASSWORD()函数

支持

不支持

FLUSH QUERY CACHERESET QUERY CACHE语法

支持

不支持

SQL_MODE系统变量的参数:DB2, MAXDB, MSSQL, MYSQL323, MYSQL40, ORACLE, POSTGRESQL, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_TABLE_OPTIONS

支持

不支持

GROUP BY语法默认自动排序

支持

不支持

包含EXTENDEDPARTITIONS关键字的相关语法

支持

不支持

ENCODE()、DECODE()、ENCRYPT()等加密函数

支持

不支持

空间分析相关函数。更多信息,请参见官方文档

支持

不支持

函数以前接受WKB值的字符串或几何参数,现在不再允许几何参数

支持

不支持

\N解析为NULL

支持

不支持

PROCEDURE ANALYSE()函数

支持

不支持

通过NDB存储引擎创建分区表

支持

不支持

通过InnoDB存储引擎压缩临时表

支持

不支持

JSON_APPEND()函数

支持

不支持

在共享表空间中放置表分区的支持

支持

不支持

ALTER TABLE ... UPGRADE PARTITIONING语法

支持

不支持

附录四:MySQL 5.7和MySQL 5.6版本功能差异列表

说明

下表中仅列出MySQL 5.7与5.6的部分重要差异,其他各版本间差异,请参见MySQL Release Notes

特性

5.6

5.7

GTID模式下的CREATE...AS SELECT

支持

不支持

GTID模式下在事务中使用临时表

支持

不支持

在分区表中指定分区键

支持

不支持

ENGINE_NO_CACHE语法

支持

不支持

不可见索引(Invisible Indexes)

支持

不支持

UPDATE non_affected_rows INSERT语法

支持

不支持

Proxy相关命令

使用SET命令方式

使用Call Procedure模式

TokuDB、Sphinx、RocksDB和Memory引擎

支持

不支持

str_ord()函数

支持

不支持

raiseerror()函数

支持

不支持

OPTIMIZE TABLE table ASYNC

支持

不支持

ENGINE_NO_CACHE

支持

不支持

表INFORMATION.TABLE_UTILIZATION

支持

不支持

表INFORMATION_SCHEMA.INNODB_LOCK_WAITS中的requesting_thd_id列和blocking_thd_id

支持

不支持

表INFORMATION_SCHEMA.INNODB_RSEG

支持

不支持

表INFORMATION_SCHEMA.INNODB_IO_STATUS

支持

不支持

压缩列功能

支持

不支持

Query Plan Cache

支持

不支持

Limit + Union语法

不需要括号

需要括号

SHOW FULL PROCESSLIST语法

MySQL 5.7返回结果删除memoryquery_memory列。

max_statement_timemax_execution_time

MySQL 5.7删除max_statement_time,只保留max_execution_time

RDS_SQL_MAX_AFFECTED语法

MySQL 5.7不再支持通过RDS_SQL_MAX_AFFECTED限制单条UPDATEDELETE影响的记录数。通过变量rds_sql_max_affected_rows控制。

并发性能优化调整

MySQL 5.7不再支持通过如下参数进行并发控制:

  • innodb_adaptive_tickets_algo

  • innodb_min_concurrency_tickets

  • rds_threads_running_ctl_mode

  • rds_threads_running_high_watermark

  • rds_filter_key_cmp_in_order

  • rds_reset_all_filter

  • rds_sql_delete_filter

  • rds_sql_select_filter

  • rds_sql_update_filter

  • rds_strict_concurrency

  • rds_thread_extra_concurrency

  • rds_strict_trx_idle_timeout

  • rds_sql_buf_read_bandwidth

  • rds_sql_buf_read_threshold_bytes

  • rds_sql_buf_write_bandwidth

  • rds_sql_buf_write_threshold_bytes

  • rds_sql_max_iops

连接数变量的调整

MySQL 5.7删除如下变量:

  • extra_max_connections

  • rds_root_connections

  • rds_sysinfo_connections

  • rds_sysinfo_user_list

复制相关调整

  • MySQL 5.7兼容性调整:

    • 不再支持GTID和非GTID之间的复制。

    • sql_slave_skip_counter不能再用于GTID。

    • 不再支持CREATE .... SELECT

  • MySQL 5.7 slave相关调整:

    • SHOW SLAVE LAG不再支持。

    • SHOW SLAVE STATUS不再支持超时。

    • SHOW SLAVE STATUS显示的信息变少。

    • slave的sql_thread不再支持执行超时。

    • slave的sql_thread不再支持跳过某些语句。

  • MySQL 5.7 Binlog调整:

    • 不再支持传输速度调整。

    • 不再支持rds_rpl_receive_buffer_difftime

    • 不再支持rds_rpl_receive_buffer_size

日志相关调整

MySQL 5.7错误日志调整:

  • 不再记录SHUTDOWN的IP、user和io/net latency。

  • 不再支持Duplicate key显示表名。

附录五:MySQL 5.5和MySQL 5.6版本功能差异列表

说明

下表中仅列出MySQL 5.5和5.6的部分重要差异,其他各版本间差异,请参见MySQL 5.6 Reference Manual

特性

MySQL 5.5

MySQL 5.6

全文索引

不支持

支持

InnoDB online DDL

不支持

部分支持

REDO

最大支持4 GB

最大支持512 GB

刷脏

单线程

单独的刷脏线程

purge

单线程

多线程

EXCHANGE PARTITION

不支持

支持

DML 显式指定分区

不支持

支持

INFORMATION_SCHEMA

MySQL 5.6提供更多关于Buffer Pool信息和表、索引、字段等元信息。

PERFORMANCE_SCHEMA

MySQL 5.6中PFS增加了更多的监控信息和查看形式。

复制

MySQL 5.6中复制增强和变更包括:

  • 支持使用GTID进行复制。基于GTID的复制通过参数gtid_mode和enforce_gtid_consistency控制。

  • 支持备库多线程并发应用Binlog日志。

  • FLUSH MASTER和FLUSH SLAVE在MySQL 5.6中改为RESET MASTER和RESET SLAVE。

  • SLAVE START和 SLAVE STOP在MySQL 5.6中改为START SLAVE和STOP SLAVE。

重要

RDS MySQL 5.5升级至5.6后,自动切换为基于GTID的复制模式。

优化器

MySQL 5.6增强了优化器能力,主要包括:

  • 支持Multi-Range Read。

  • 支持Index Condition Pushdown。

  • 支持optimizer_trace。

Purge Large File Asynchronously

不支持

支持

Thread Pool

不支持

支持

Performance Agent

不支持

支持

Faster DDL

不支持

支持

Sequence Engine

不支持

支持

常见问题

  • Q:升级过程中,为什么会出现实例切换?是否会有其他严重风险?

    A:为保证业务稳定,本地SSD盘实例升级采用先备后主的方式,备实例升级完成后,业务自动切换至备实例。ESSD云盘实例升级采用新建节点的方式,新节点升级完成后,业务自动切换至新节点。无其他严重风险。主备切换的影响请参见主备切换的影响

  • Q:升级时,主备实例会一起升级吗?

    A:本地SSD盘升级时,系统先行升级备实例,再升级主实例。

  • Q:MySQL 5.7基础系列SSD云盘实例如何升级?

    A:当前不支持该类型的实例升级。如您想升级MySQL 5.7基础系列SSD云盘实例,您可以先将目标实例从基础系列升级为高可用系列,并变更存储类型,然后再升级数据库版本。

  • Q:数据库版本升级前后,参数模板是否保持一致?

    A:RDS MySQL 5.7升级至RDS MySQL 8.0时,如果升级前实例为系统参数模板,升级后实例将设置为新版本对应的系统参数模板,如升级前为MySQL_InnoDB_5.7_高可用系列_高性能参数模板,升级后将设置为MySQL_InnoDB_8.0_高可用系列_高性能参数模板;如果升级前实例为用户自定义参数模板,升级后参数模板将不会被保留。

  • Q:数据库版本升级期间,是否能变更实例?

    A:数据库版本升级期间不支持变更实例,必须在版本升级完成后,才可以进行其他操作。

  • Q:数据库版本是否支持自动升级?

    A:暂不支持自动升级数据库版本。

  • Q:数据库版本是否支持降级?

    A:不支持降级,包括升级后降级以及对原版本降级。

  • Q:RDS MySQL 5.6升级至RDS MySQL 5.7或RDS MySQL 5.7升级至RDS MySQL 8.0时,升级失败,提示“当前实例有全文索引且小版本低于20221130,请先进行小版本升级后再进行删除、重建全文索引”或“当前实例包含建立在系统表空间的全文索引,请删除并重建相应全文索引后再进行升级操作”,问题原因和解决方案是什么?

    A:问题原因和解决方案如下:

    • 问题原因

      由于MySQL的历史原因,较低版本的MySQL 5.6在创建全文索引(Full-Text Index)时会建立在系统表空间(System Tablespace)之上。当升级到5.7或进一步升级到8.0后,建立在系统表空间的全文索引有概率会导致表空间损坏,因此需要在升级前进行处理,避免实例数据损坏和不可访问等问题。

      说明

      RDS MySQL 5.6 20221130对该问题进行了修复,全文索引将建立在单独的表空间之上。

    • 解决方案

      重要

      老版本RDS MySQL 5.6全文索引会创建在系统表空间,因此需要确保升级至RDS MySQL 5.7前的版本是RDS MySQL 5.6 20221130或之后的版本。如您的版本较低,请先升级到最新的RDS MySQL 5.6版本。

      1. 根据提示中的表名,删除建立在系统表空间的全文索引。

        # 删除全文索引
        ALTER TABLE $table_name DROP INDEX $fts_name;
      2. 重新创建全文索引。

        # 重新创建全文索引
        ALTER TABLE $table_name ADD FULLTEXT INDEX $fts_name;
      3. 建立完索引后,可以使用如下SQL对当前实例的全文索引进行检查。SQL会返回建立在系统表空间的全文索引,如查询结果为空,则RDS MySQL5.6升级至RDS MySQL5.7的过程中不会因为该问题而导致失败。

        # 查询建立在系统表空间的全文索引
        SELECT NAME FROM information_schema.INNODB_SYS_TABLES WHERE TABLE_ID IN ( SELECT CONV(SUBSTRING_INDEX(SUBSTRING_INDEX(NAME, '_', -4),'_', 1),16,10) FROM INNODB_SYS_TABLES WHERE NAME LIKE '%fts_00000000%' AND SPACE = 0);

相关API

API

描述

RDS MySQL升级数据库大版本

升级RDS实例版本。