RDS MySQL提供了两种方式升级数据库版本,您可以通过控制台直接升级数据库,也可以新购一个高版本MySQL实例,通过DTS数据迁移任务将原实例数据迁移至新实例中,实现数据库版本的间接升级。
选择升级方式
方式一:通过控制台直接升级数据库版本与方式二:通过数据迁移DTS升级数据库版本均支持所有MySQL版本的数据库升级,包括5.5升级至5.6、5.6升级至5.7、5.7升级至8.0。在升级数据库前,您需要通过以下内容选择合适的升级方式:
实例规格符合以下四种类型,且实例配置满足对应类型的要求,建议通过方式一:通过控制台直接升级数据库版本。
集群系列 ESSD云盘
高可用系列 ESSD云盘
数据库代理限制(如有):数据库代理小版本不低于1.13.41。
实例状态限制:实例状态为运行中,主备节点状态健康且无延迟。
引擎限制:数据库及所有库表都为InnoDB引擎。
不属于已下线的历史规格,详情请参见历史规格。
高可用系列 本地SSD盘
加密限制:未开启TDE加密功能(TDE开启后不支持关闭,如已开启TDE,请选择方式二:通过数据迁移DTS升级数据库版本进行升级)。
只读实例限制(如有):所有只读实例规格码一致(只读实例和主实例间不做要求)且只读实例数量不超过8个。
数据库代理限制(如有):数据库代理小版本不低于1.13.41。
实例状态限制:实例状态为运行中,主备节点状态健康且无延迟。
表数量限制:不超过20万张。
引擎限制:数据库及所有库表都为InnoDB引擎。
不属于已下线的历史规格,详情请参见历史规格。
基础系列 ESSD云盘
实例状态限制:实例状态为运行中。
引擎限制:数据库及所有库表都为InnoDB引擎。
不属于已下线的历史规格,详情请参见历史规格。
实例规格不符合以上四种类型或已经开启TDE加密功能,请使用方式二:通过数据迁移DTS升级数据库版本。
实例规格符合以上四种类型,但实例配置不满足相关要求,您可以参考下表方案修改配置后,通过方式一:通过控制台直接升级数据库版本,或使用方式二:通过数据迁移DTS升级数据库版本。
问题
解决方案
实例处于其它状态(如重启中)
等待任务结束后再发起数据库版本升级任务。
高可用系列本地SSD盘实例表数量超过20万张
在升级前清理冗余表。
部分库表未使用InnoDB引擎
使用
ALTER TABLE <表名> engine=InnoDB;
命令转换为InnoDB引擎。实例规格为历史规格
进行规格升级后再升级数据库版本,更多信息请参见变更配置。
数据库代理小版本不符合要求
升级数据库小版本至1.13.41及以上,详情请参见升级数据库代理内核小版本。
其它引擎升级数据库版本请参见:
方式一:通过控制台直接升级数据库版本
准备工作
了解新旧版本差异与优势
5.6升级至5.7:功能差异请参见附录四:MySQL 5.7和MySQL 5.6版本功能差异列表,升级优势请参见附录二:MySQL5.6升级MySQL 5.7的优势。
5.7升级至8.0:功能差异请参见附录三:MySQL 8.0和MySQL 5.7版本功能差异列表,升级优势请参见附录一:MySQL 5.7升级MySQL 8.0的优势。
了解升级过程与影响
版本跨度:RDS MySQL控制台不支持跨大版本升级,升级后不支持降级。例如:MySQL 5.6无法直接升级至MySQL 8.0,需要先升级到MySQL 5.7,再升级到MySQL 8.0。
本地SSD盘实例升级过程:系统先升级备实例,完成后进行主备切换,再升级主实例。升级过程将造成30秒至1分钟的业务中断,请您尽量在业务低峰期执行升级操作。
ESSD云盘实例升级过程:系统先建立新节点,并在新节点上执行升级,在新节点升级完成后链路将切换至新节点。升级过程中,将造成30秒至1分钟的业务中断,请您尽量在业务低峰期执行升级操作。
检查实例与数据库配置
检查保留关键字:查看自定义函数,确保函数中没有使用保留关键字。
检查全量备份:检查最近一周是否有全量数据备份的成功记录,必要时请进行一次全量数据备份。
检查自动重连机制:在数据库升级过程中,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
将被清空。
升级前测试与模拟
语法测试:建议在升级前新建一个高版本RDS实例进行语法测试,避免低版本语法或特性在升级高版本后不支持。
模拟升级:建议在升级前克隆原实例,先使用克隆实例进行升级测试,确认各项功能正常后再升级原实例。
升级后注意事项
恢复旧版本实例:支持使用旧版本云盘备份恢复旧版本实例,本地盘暂不支持。
恢复新版本实例:旧版本备份集无法用于恢复新版本实例,如需进行恢复操作,请使用实例升级后生成的备份集。
操作方式
以下数据库版本升级场景中,您需要先进行升级前置检查,检查通过后再进行升级操作:
高可用系列本地SSD盘:5.6升级至5.7、5.7升级至8.0
高可用系列ESSD云盘:5.7升级至8.0
其它场景中您可以直接进行数据库升级操作。
升级前置检查通过后进行升级操作
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
单击左侧导航栏大版本升级,进入升级前置检查。
在选择升级版本右侧的下拉框中,选择需要升级的版本号,单击创建升级检查报告,报告详情请参见大版本升级检查报告说明。
待检查报告检测完毕,并确认升级无风险后,切换页签至升级实例。
在选择升级版本右侧的下拉框中,选择需要升级的版本号,单击升级实例。
在弹出的大版本升级实例中,确认升级的版本,选择切换时间后,单击立即升级。
直接升级
方式二:通过数据迁移DTS升级数据库版本
对于不支持通过控制台直接升级的实例,您可以创建一个高数据库版本的新实例,通过DTS数据迁移任务将原实例数据迁移至新实例中,实现数据库的间接升级,相关步骤如下:
举例:您有一个开启了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 CACHE、 RESET QUERY CACHE语法 | 支持 | 不支持 |
SQL_MODE系统变量的参数:DB2, MAXDB, MSSQL, MYSQL323, MYSQL40, ORACLE, POSTGRESQL, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_TABLE_OPTIONS | 支持 | 不支持 |
GROUP BY语法默认自动排序 | 支持 | 不支持 |
包含EXTENDED或PARTITIONS关键字的相关语法 | 支持 | 不支持 |
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返回结果删除memory和query_memory列。 | |
max_statement_time和max_execution_time | MySQL 5.7删除max_statement_time,只保留max_execution_time。 | |
RDS_SQL_MAX_AFFECTED语法 | MySQL 5.7不再支持通过RDS_SQL_MAX_AFFECTED限制单条UPDATE或DELETE影响的记录数。通过变量rds_sql_max_affected_rows控制。 | |
并发性能优化调整 | MySQL 5.7不再支持通过如下参数进行并发控制:
| |
连接数变量的调整 | MySQL 5.7删除如下变量:
| |
复制相关调整 |
| |
日志相关调整 | MySQL 5.7错误日志调整:
|
附录五: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中复制增强和变更包括:
重要 RDS MySQL 5.5升级至5.6后,自动切换为基于GTID的复制模式。 | |
优化器 | MySQL 5.6增强了优化器能力,主要包括:
| |
不支持 | 支持 | |
不支持 | 支持 | |
不支持 | 支持 | |
不支持 | 支持 | |
不支持 | 支持 |
常见问题
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版本。
根据提示中的表名,删除建立在系统表空间的全文索引。
# 删除全文索引 ALTER TABLE $table_name DROP INDEX $fts_name;
重新创建全文索引。
# 重新创建全文索引 ALTER TABLE $table_name ADD FULLTEXT INDEX $fts_name;
建立完索引后,可以使用如下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实例版本。 |