操作场景
云数据库 RDS for MySQL支持通过以下两种方式升级实例大版本:
通过RDS界面升级大版本:如需该操作请提交权限申请。
通过DRS升级大版本:通过DRS迁移功能将RDS for MySQL低版本实例迁移到高版本。
前提条件
通过RDS界面升级大版本功能目前支持贵州、华北、西安2,其他资源池上线中。
如果用户创建DRS任务使用的是子账号,需要完成DRS账户委托,否则会导致升级失败。具体操作如下。
当用户创建DRS任务使用的是子账号,执行定时启动任务、全量完成自动结束、自动续传失败任务、定时对比任务等自动功能时,可能会访问全局服务或是Region级别服务,需要使用“账户委托”,否则会导致执行失败。
数据复制服务支持在创建任务的时候,自动将用户账户委托给数据复制服务的管理租户,即op_svc_rds,或将用户账户委托给RDS云服务,便于在执行定期任务的时候,具有对任务实行自动化管理的权限。
解决方案:
方法一:使用主账号重新创建一次任务,主账号默认有Security Administrator权限,可在创建任务后将委托创建出来。
方法二:使用主账号在子账号所在的用户组添加Security Administrator权限后,重新创建任务。添加权限的具体操作请参见:。
方法三:手动添加“账户委托”,添加步骤如下:
a. 使用主账号登录天翼云,在右上角单击“控制台”。
b. 在控制台页面管理与部署页面,选择“统一身份认证服务”。
c. 在统一身份认证页面,单击左侧导航窗格中“委托”,进入“委托”页面。
d. 在“委托”页面,单击右上方的“创建委托”进行委托创建。
e. 填写委托名称为“DRS_AGENTCY” ,委托类型为 “普通账号”时, 委托的账号为 “op_svc_rds”;委托类型为“云服务”时,选择“关系型数据库MySQL”;持续时间为“永久”,完成后单击“完成”。
图 创建委托
f. 在“选择策略”页面,选择DRS_AGENTCY的授权策略,委托权限需配置全局的 Tenant Administrator,完成后单击右下角的“下一步”。
图 选择策略
g. 在“设置最小授权范围”页面,先选择全局服务资源授权,点击右下角的“确定”后,在授权记录页面再点击“授权”,基于指定区域设置最小授权范围,完成后单击右下角的“确定”。
图 全局服务资源授权
图 指定区域项目授权
h. 授权完成后,单击委托名称,在“授权记录”中可看到全局服务和指定区域两条授权记录。
图 授权记录
i. 权限生效时间提醒,您选中的OBS权限由于系统设计的原因,授权后需等待15-30分钟才可生效,权限生效后重新创建即可。
注意事项
下发RDS for MySQL 5.7升级至8.0前,需进行预检查,请注意以下内容:
− 预检查耗时与表数量相关,请您尽量在业务低峰期执行。
− 检查报告保留24小时,请及时下载。
− “检查参数”项失败时,请根据检查详情中的检查项,对照表 升级预检查项及修复建议进行修复,级别为error的检查项,必须修复才可升级,级别为warning的检查项,请知悉升级前后该内核特性的变化。
− 修复后需单击“重新检查”,获取新的检查结果。
只能从5.7的最新小版本升级到8.0的最新小版本。请先确认5.7版本已经是最新小版本,才能继续大版本升级。
大版本升级操作建议避开执行备份的时间窗。
升级大版本前建议先做一次全量备份。
升级数据库大版本过程将造成约10~120秒的业务中断,请确保您的应用有自动重连机制。请在业务低峰期执行该操作,在业务高峰期执行会导致升级时长变长。当前大版本升级为了保证数据完整性会在下发升级后几分钟内重启数据库进程,预计中断1分钟左右。如果您选择的是可维护时间段内升级,请注意此中断发生在可维护时间窗之前。
升级主实例大版本时,如有只读实例,也会同步升级只读实例的大版本(不支持单独升级只读实例的大版本)。
升级大版本后,实例会升级到新的内核大版本,不支持降级。
请务必仔细对比升级前后版本差异,建议您新建一个RDS for MySQL 5.7或8.0版本实例进行语法测试,避免应用使用的低版本语法或特性在升级高版本后不支持。
建议您将原实例数据恢复到新实例上面,先使用新实例进行升级测试,确认各项功能正常后再升级原实例。
内核大版本升级期间,自动扩容不生效,需要确保实例预留了足够的空间支撑升级过程中的业务写入。
大版本升级定时任务需预准备,设置后不可取消。
升级大版本后,升级前的备份将不可用于新版本实例,时间点恢复功能将不能选择升级前的时间点。
大版本升级过程中禁止event的DDL操作,如create event、drop event和alter event。
大版本升级后,规格参数会恢复到升级版本的默认值,包括以下参数:threadpool_size、innodb_buffer_pool_size、innodb_io_capacity、innodb_io_capacity_max、innodb_buffer_pool_instances、back_log、max_connections。
5.7版本和8.0版本实例存在相同参数取值范围不一样的情况,例如参数“max_execution_time”如果在5.7版本中设置为小于60000,大版本升级后将恢复成默认值0,这是因为8.0版本该参数最小值只能为60000。
MySQL大版本升级耗时与实例的数据量和表数量有关。
约束限制
对于主备实例,复制延迟大于300秒无法升级大版本。
实例中存在异常节点,无法升级大版本。
MySQL 5.7及之后版本不再支持Sequence Engine,升级前请确认。
目前RDS for MySQL实例最大可支持50万张表(系统表+数据表),大于50万张表时,会导致大版本升级失败。
云数据库RDS for MySQL暂不支持已开启事件定时器功能的实例升级大版本,若您想使用该功能,请先关闭事件定时器。具体操作请参考开启或关闭事件定时器。
升级到8.0版本后,主实例和只读实例会共用SQL限流规则,为避免主实例SQL限流规则对只读业务造成影响,请在升级前审视调整主实例SQL限流规则、以及主实例和只读实例的SQL限流开关。
准备升级时,如果仍存在XA prepared状态的XA事务:请使用 XA recover; 语句排查后,将这些XA事务commit或者rollback,再进行升级;否则无法升级成功。
− XA recover语句只会显示XA prepare状态后的XA事务,其他阶段如XA start、XA end、XA commit、XA rollback后的XA事务都不会显示在其中。
− 如果要commit或者rollback处于XA prepare状态的XA事务,请在XA recover返回的结果中,找到data一列(如下图中的'xid1'),作为XA commit或者XA rollback的输入。
图 排查XA事务
以下场景不支持RDS for MySQL 5.7升级至8.0:
− 不支持已绑定DRDS或已开通数据库代理的RDS for MySQL实例进行升级。
− 不支持单机进行升级。
− 主实例下的只读实例带有SQL限流规则时,不支持升级,请在升级前删除只读的限流规则。
升级预检查项及升级失败的修复建议
表 升级预检查项及修复建议
检查项 | 检查内容 | 修复建议 |
---|---|---|
utf8mb3Check | 检查字符集utf8mb3。 | MySQL 5.7中,字符集utf8等同于utf8mb3, MySQL 8.0中,字符集utf8等同于utf8mb4, 请注意升级后如果使用utf8创建表格,相当于使用字符集utf8mb4。 |
removedSysVars | 检查已移除的系统参数。 | 系统参数在MySQL 8.0中已删除。 |
sysVarsNewDefaults | 检查系统参数默认值变化。 | 系统参数在MySQL 8.0中的默认值发生变化,如果您修改过该参数的值,升级后保留修改后的值,如果未修改过,将采用新的默认值。 |
zeroDatesCheck | 检查使用了零日期、日期时间和时间戳。 | MySQL 8.0.16及以后版本,将零值日期(例:“2024-00-00”)作为查询条件时,MySQL将该字符串转换为DATE,如果转换失败,该查询将报错。 |
enumSetElementLenghtCheck | 检查ENUM/SET列元素长度。 | 元素长度大于255个字符,请修改到不超过255个字符。 |
reservedKeywordsCheck | 检查保留字。 | 与MySQL 8.0中的保留字冲突,请修改名字。 |
mysqlDollarSignNameCheck | 检查$符号。 | 数据库对象名包含“$”,请修改。 |
mysqlInvalid57NamesCheck | 检查非法库名/表名/列名等。 | 包含非法名字,请修改。 |
groupByAscCheck | 检查group by ASC/DESC语法。 | MySQL 8.0移除了GROUP BY ASC/DESC语法,请修改数据库对象,可将ASC/DESC关键字从 GROUP BY子句中移除,并放置在适当的ORDER BY子句中。 |
checkTableOutput | 通过"check table x for upgrade"检查表存在的问题。 | 根据检查结果中的“说明”进行修复。 |
engineMixupCheck | 检查 InnoDB 识别了属于其他引擎的表的情况。 | 表格被 InnoDB引擎识别,但 SQL 层认为它们属于另一个引擎,请联系客服解决。 |
foreignKeyLengthCheck | 检查外键约束名长度。 | 外键约束名长度不得超过64个字符,请修改。 |
nonNativePartitioningCheck | 检查使用了非本地分区引擎的分区表的情况。 | MySQL 8.0仅支持InnoDB 和 NDB作分区表引擎,请转换为InnoDB引擎,或删除其分区。 |
routinesSyntaxCheck | 检查语法不兼容的情况。 | 存储过程、函数等数据库对象的定义包含了不兼容的语法,例如与MySQL8.0中的保留字冲突,请根据检查结果中的“说明”做修改。 |
maxdbFlagCheck | 检查是否使用了过时的 MAXDB sql_mode标志。 | MySQL 8.0删除了sql_mode中的MAXDB选项,请修改sql_mode参数,不使用MAXDB。 |
sqlModeFlagCheck | 检查是否使用了过时的sql_mode标志。 | MySQL 8.0删除了部分sql_mode标志,请根据检查结果中的“说明”,修改sql_mode参数。 |
removedSysLogVars | 检查已移除的系统日志系统参数。 | MySQL 8.0移除了部分系统日志系统参数,请知悉。 |
mysqlIndexTooLargeCheck | 检查索引长度。 | MySQL 5.7和MySQL 8.0都支持相同长度的索引,最大索引长度为767字节,在MySQL 8.0 utf8mb4编码下,最大支持191个字符;请修改索引长度至不超过191个字符。 |
circularDirectoryCheck | 检查表空间数据文件路径使用循环目录。 | 目标版本不支持表空间在数据文件路径中包含循环目录引用(例如“/../”),请联系客服处理。 |
columnsWhichCannotHaveDefaultsCheck | 检查列默认值。 | BLOB、TEXT、GEOMETRY或JSON等类型的列不允许设置默认值,请通过ALTER TABLE语句删除默认值。 |
removedFunctionsCheck | 检查已移除的函数。 | 目标版本删除了部分函数,请根据检查结果中的“说明”,修改相应数据库对象。 |
mysqlOrphanedRoutinesCheck | 检查孤立的存储过程或函数等。 | 孤立的存储过程或函数等指其引用的数据库对象已不存在,无法运行,请删除。 |
mysqlEmptyDotTableSyntaxCheck | 检查废弃的标识符。 | 请根据检查结果中的“说明”,修改对应数据库对象中的标识符。 |
mysqlSchemaCheck | 检查表名冲突。 | MySQL8.0新增部分表,请通过RENAME TABLE语句修改存在冲突的表名。 |
mysqlInvalidEngineForeignKeyCheck | 检查外键约束指向其他引擎的表。 | 请通过ALTER TABLE语句修改引擎,或删除外键引用。 |
lowerCaseNameCheck | 检查参数lower_case_table_names=1时,是否存在大写表名 | 参数lower_case_table_names=1时,如果存在大写表名,将导致升级失败;请先修改lower_case_table_names=0,通过RENAME TABLE语句将检查结果中的大写表名修改为小写,再将lower_case_table_names的值修改回1。 |
specVarInConfigFileCheck | 检查配置文件中 sql_mode、loose_tls_version 是否有过时的值。 | 目标版本移除了部分sql_mode标志,MySQL8.0.28及其以上,loose_tls_version参数不支持TLSv1和TLSv1.1,请根据检查结果修改sql_mode或loose_tls_version参数的值。 |
reversedUserCheck | 检查是否创建了创建 mysql.infoschema@localhost。 | MySQL8.0内置mysql.infoschema@localhost账号,如MySQL5.7存在此账号,将导致升级失败,升级前请删除该账号。 |
schemaInconsistencyCheck | 检查表文件移除或损坏导致的数据库结构不一致问题。 | 表文件.frm缺失,请联系客服申请处理。 |
geometryIndexCheck | 检查空间坐标作为索引时是否为空间索引。 | 目标版本中,空间坐标作索引时必须为空间索引,请重建索引或删除索引。 |
danglingIndexCheck | 检查是否存在空悬索引。 | 全文索引列删除导致FTS_DOC_ID空悬的表,需要进行 OPTIMIZE TABLE修复。 |
viewColumnCheck | 检查视图列名长度。 | 目标版本中视图列名长度不可超过64个字符,请通过ALTER VIEW语句修改列名。 |
partitionedTablesInSharedTablespaceCheck | 检查分区表是否在共享表空间。 | 目标版本不支持共享表空间,请通过ALTER TABLE语句将它们移动到独立表空间。 |
partitionsReferencedCheck | 检查分区表是否被普通表通过外键引用。 | 分区表不可被普通表引用,请删除外键引用。 |
partitionsRangeDateCheck | 检查按时间分区的分区表。 | MySQL 8.0按时间分区时,时间列内容要求是标准的格式(例如:'YYYY-MM-DD hh:mm:ss' 或 'YY-MM-DD hh:mm:ss'),并修改相应表中时间数值为标准格式。 |
表 升级失败的修复建议
问题描述 | 影响 | 修复建议 |
---|---|---|
RDS for MySQL 5.7升级到8.0后,由于默认字符集变更,导致执行部分SQL时索引失效。 | 5.7版本使用默认字符集建表,在升级过程中,字符集不会自动变更为8.0版本默认字符集,若用户在内核升级到8.0后建表,同时对两张字符集不同的表进行JOIN等操作,影响SQL执行时索引选择,最终导致SQL执行时间变长。 | 修改8.0的库、表、字段字符集、以及默认字符集,与5.7的字符集一致。 |
RDS for MySQL 5.7升级到8.0过程中,删除了全文索引,可能会导致升级失败。 | 可能会导致升级失败。 | 执行optimize table重建表;并排查空悬FTS_DOC_ID,详见表 升级预检查项及修复建议。 |
RDS for MySQL 5.7升级到8.0过程中,由于含有分区表外键约束(通过参数foreign_key_check设置),导致升级失败。 | 导致升级失败。 | 移除该外键约束。 |
5.7版本中含有definer列为空的“mysql.events”表,会导致RDS for MySQL 5.7升级到8.0失败。 | 导致升级失败。 | 将definer列设置为非空。 |
RDS for MySQL 5.7升级到8.0过程中,Server层和InnoDB层列名大小写不匹配导致升级失败。 | 导致升级失败。 | 执行optimize table重建表。 |
RDS for MySQL 5.7升级到8.0过程中,索引中包含的字段在Server层和InnoDB层中大小写不一致导致升级失败。 | 导致升级失败。 | 执行optimize table重建表。 |
使用8.0不支持的“BTREE SPATIAL INDEX”,会导致RDS for MySQL 5.7升级到8.0失败。 | 导致升级失败。 | 删除“BTREE SPATIAL INDEX”索引。 |
通过RDS界面升级大版本
步骤 1 登录管理控制台。
步骤 2 单击管理控制台左上角的 ,选择区域。
步骤 3 选择“数据库 > 关系型数据库”。进入关系型数据库信息页面。
步骤 4 在“实例管理”页面,单击主实例名称。
步骤 5 在“基本信息”页面的“数据库引擎版本”处,单击“升级数据库版本”。
步骤 6 在弹出框中,确认升级信息,然后单击“下一步”。
对于RDS for MySQL 5.7升级至8.0的场景,执行步骤7。
其他升级场景,执行步骤8。
步骤 7 升级预检查。
预检查结束后,根据预检查结果参考表 升级预检查项及修复建议进行修复。
修复完成后,单击“重新检查”再次下发检查,直到“检查实例状态”和“检查参数”全部是“已完成”,然后单击“下一步”。
步骤 8 选择升级方式,单击“确定”。
立即升级:系统会立即升级您的数据库版本到当前5.7或8.0最新版本。
可维护时间段内升级:系统会在您设置的可维护时间段内,升级您的数据库版本到当前5.7或8.0最新版本。详情请参见设置可维护时间段。
如果升级失败,参考表 升级失败的修复建议进行修复。
----结束
通过DRS升级大版本
RDS for MySQL支持通过DRS将RDS for MySQL 5.6版本数据迁移到5.7版本。使用该方式进行大版本升级,需要提前准备好待迁移到的目标版本数据库实例。
具体迁移操作,请参见《数据复制服务用户指南》的“创建迁移任务”内容。
表 MySQL数据库版本信息
源数据库版本 | 目标数据库版本 | 迁移类型 |
---|---|---|
RDS for MySQL/自建MySQL/其他云MySQL
| RDS for MySQL
| MySQL数据库版本升级 |
说明
DRS仅支持从低版本迁移到高版本。