# RDS for MySQL 5.7版本升级到8.0
#### 操作场景
用户可以将RDS for MySQL 5.7版本实例升级到最新8.0版本，体验更丰富的版本能力。
#### 升级方案
支持通过以下两种方式升级实例大版本：
- [通过RDS界面升级大版本]：提交大版本升级任务后，首先会基于低版本源实例恢复一个高版本目标实例，并搭建两个实例之间的复制关系。等到低版本实例数据与高版本数据一致时，触发VIP切换，将读写请求切换到高版本实例，完成整个升级流程。相比使用数据复制服务DRS从低版本到高版本迁移数据，MySQL一键升级功能省去了搭建DRS迁移链路的过程，降低了升级的成本。
  如需通过界面升级大版本，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)申请。
  关于内核版本的功能，请参见[华为云RDS for MySQL内核版本说明](https://support.huaweicloud.com/kerneldesc-rds-mysql/rds_02_0000.html)。
  
- [通过DRS升级大版本]：通过DRS迁移功能将RDS for MySQL低版本实例迁移到高版本。
 
#### 介绍视频
<video controls="controls" preload="none" id="object113204408813" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/RDS/Video/1758248065223152514.mp4" title="MySQL大版本升级功能介绍" poster="https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002480810022.jpg" height="400.0000" width="700.0000"></video>
#### 升级须知
表1升级须知 
| 阶段 | 注意事项                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 功能限制                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
|:---|:---|:---|
| 升级前  | - 如果要使用大版本升级功能，需要[创建DRS委托](https://support.huaweicloud.com/productdesc-drs/drs_04_0525.html)（委托名称为DRS_AGENTCY），IAM子账号需要添加如下授权项： - iam:agencies:listAgencies  - iam:permissions:listRolesForAgencyOnProject  - iam:permissions:listRolesForAgencyOnDomain    - 建议您将原实例数据恢复到新实例上面，先使用新实例进行升级测试，确认各项功能正常后再升级原实例。  - 下发RDS for MySQL 5.7升级至8.0前，需进行预检查，请注意以下内容： - 预检查耗时与表数量相关，请您尽量在业务低峰期执行。  - 检查报告保留24小时，请及时下载。  - "检查参数"项失败时，请根据检查详情中的检查项，对照[表3]进行修复，级别为error的检查项，必须修复才可升级，级别为warning的检查项，请知悉升级前后该内核特性的变化。  - 修复后需单击"重新检查"，获取新的检查结果。    - 只能从5.7的最新小版本升级到8.0的最新小版本。请先确认5.7版本已经是最新小版本，才能继续大版本升级。  - 大版本升级操作建议避开执行备份的时间窗。  - 升级大版本前建议先做一次全量备份。  - 升级到8.0版本后，主实例和只读实例会共用SQL限流规则，为避免主实例SQL限流规则对只读业务造成影响，请在升级前审视调整主实例SQL限流规则、以及主实例和只读实例的SQL限流开关。  - MySQL 8.0版本不支持国密SSL，在5.7版本已开启的国密SSL链接，升级到8.0后会中断。   | - 大版本升级操作会将实例升级到目标实例新的内核大版本，并且不支持降级。有关内核版本详情，请参见[内核版本说明](https://support.huaweicloud.com/kerneldesc-rds-mysql/rds_02_0000.html)。  - 以下场景不支持RDS for MySQL 5.7升级至8.0： - 不支持已绑定DDM的RDS for MySQL实例进行升级。  - 不支持本地盘存储类型的实例进行升级。  - 不支持集群版实例进行升级。  - 默认不支持单机实例进行升级。单机实例大版本升级在预检查阶段会对实例产生一定的性能影响，如需开通，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)申请。  - 主实例下的只读实例带有SQL限流规则时，不支持升级，请在升级前删除只读的限流规则。    - 对于主备实例，复制延迟大于300秒无法升级大版本。  - 实例中存在异常节点，无法升级大版本。  - 实例中存在DRS任务，无法升级大版本，请在升级前先删除DRS任务。  - 目前RDS for MySQL实例最大可支持50万张表（系统表+数据表），大于50万张表时，会导致大版本升级失败。  - 云数据库RDS for MySQL暂不支持已开启事件定时器功能的实例升级大版本，若您想使用该功能，请先关闭事件定时器。具体操作请参考[开启或关闭事件定时器](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0101.html)。  - 准备升级时，如果仍存在XA prepared状态的XA事务，需要将这些XA事务commit或者rollback，再进行升级；否则无法升级成功。更多内容，请参见[准备升级时，如果仍存在XA prepared状态的XA事务怎么办？]  - 如果实例是从5.6升级到5.7，为避免连续升级出现问题，系统默认需要24小时的观察期，建议24小时后再执行5.7升级到8.0的操作。   |
| 升级中  | - MySQL大版本升级耗时与实例的数据量和表数量有关，请您尽量在业务低峰期执行。  - 升级数据库大版本过程将造成约10\~120秒的业务中断，请确保您的应用有自动重连机制。请在业务低峰期执行该操作，在业务高峰期执行会导致升级时长变长。  - 升级主实例大版本时，如有只读实例，也会同步升级只读实例的大版本（不支持单独升级只读实例的大版本）。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | - 大版本升级期间，自动扩容不生效，需要确保实例预留了足够的空间支撑升级过程中的业务写入。  - 大版本升级过程中禁止event的DDL操作，如create event、drop event和alter event。  - 大版本升级定时任务需预准备，设置后不可取消。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 升级后  | - 请务必仔细对比升级前后版本差异，建议您新建一个RDS for MySQL 5.7或8.0版本实例进行语法测试，避免应用使用的低版本语法或特性在升级高版本后不支持。  - 大版本升级后，规格参数会恢复到升级版本的默认值，包括以下参数：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。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | - 升级大版本后，升级前的备份将不可用于新版本实例，时间点恢复功能将不能选择升级前的时间点。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   
#### 操作步骤
- [通过RDS界面升级大版本]
  
  1. [登录RDS管理控制台](https://console.huaweicloud.com/rds/#/rds/management/list)。
  
  2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002593882307.png)，选择区域。
  
  3. 在"实例管理"页面，单击主实例名称。
  
  4. 在"概览"页面的"数据库引擎版本"处，单击"升级数据库版本"。 
     图1升级数据库大版本   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002212062460.png "点击放大")
     
     
  
  5. 在弹出框中，确认升级信息，然后单击"下一步"。 
     图2升级信息确认   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002737924285.png "点击放大")
     
     
  
  6. 升级预检查。 
     图3开始预检查   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002708169064.png "点击放大")
     预检查结束后，根据预检查结果参考[表3]进行修复。
     修复完成后，单击"重新检查"再次下发检查，直到"检查实例状态"和"检查参数"全部是"已完成"，然后单击"下一步"。
     图4预检查完成   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002738795071.png "点击放大")
     
     
  
  7. 选择升级方式，单击"确定"。 
     - 立即升级：系统会立即升级您的数据库版本到当前5.7或8.0最新版本。
     
     - 可维护时间段内升级：系统会在您设置的可维护时间段内，升级您的数据库版本到当前5.7或8.0最新版本。详情请参见[设置可维护时间段](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0038.html)。
     
     
     图5选择升级方式   
     ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002709117966.png "点击放大")
     如果升级失败，参考[表4]进行修复。
     
     
   
- [通过DRS升级大版本]
  
  RDS for MySQL支持通过DRS将RDS for MySQL 5.7版本数据迁移到8.0版本。**使用该方式进行大版本升级，需要提前准备好待迁移到的目标版本数据库实例。**
  您可以在"实例管理"页面，单击目标实例名称，在页面右上角，单击"迁移数据库"，进入数据复制服务信息页面。
  具体迁移操作，请参见《数据复制服务用户指南》的"[将MySQL迁移到MySQL](https://support.huaweicloud.com/realtimemig-drs/drs_04_0088.html)"内容。
  表2MySQL数据库版本信息 
  | **源数据库版本**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | **目标数据库版本**                                                                                                                                                                                                                                                    | **迁移类型**     |
  |:---|:---|:---|
  | RDS for MySQL/自建MySQL/其他云MySQL - 5.5.x  - 5.6.x  - 5.7.x  - 8.0.x   | RDS for MySQL - 5.6.x  - 5.7.x  - 8.0.x   | MySQL数据库版本升级 |
     
  ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
  DRS仅支持从低版本迁移到高版本。
#### 升级预检查及升级失败的修复建议
- [升级预检查]
   表3预检查项及修复建议 
  | 预检查项                                    | 检查内容                                       | 修复建议                                                                                                                                                                                 |
  |:---|:---|:---|
  | 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，如果转换失败，该查询将报错。 该检查项不影响升级，但影响升级后的查询逻辑。用户无需处理global.sql_mode的报错，建议排查是否存在此类值，如果存在，修改为非零值。 |
  | 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 层认为它们属于另一个引擎，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)解决。                                                         |
  | 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                  | 检查表空间数据文件路径使用循环目录。                          | 目标版本不支持表空间在数据文件路径中包含循环目录引用（例如"/../"），请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)处理。                                                       |
  | 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缺失，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)申请处理。                                                                                 |
  | 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'），并修改相应表中时间数值为标准格式。                                                                                     |
     
- [升级失败的修复建议]
  预检查通过后，启动升级流程。如果升级失败，请参考[表4]处理。
   表4升级失败的修复建议 
  | 问题描述                                                                                                                 | 影响                                                                                                              | 修复建议                                                                                |
  |:---|:---|:---|
  | RDS for MySQL 5.7升级到8.0后，由于默认字符集变更，导致执行部分SQL时索引失效。 5.7默认使用UTF8mb3字符集，8.0默认使用UTF8mb4字符集。 | 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，详见[表3]。 |
  | 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实例的版本号？
- 通过RDS实例管理页面，查看数据库实例的版本号。
  图6实例管理   
  ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002736627511.png "点击放大") 
- 通过DAS页面，查看数据库实例的版本号。
  1. 在DAS页面，登录目标实例。
  
  2. 在界面上方选择"SQL操作 \> SQL窗口"。
  
  3. 执行**select @@version;**语句，查看该实例的版本号。
   
 
#### 准备升级时，如果仍存在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一列（如[图7](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0004.html#rds_05_0004__fig18763331019)中的'xid1'），作为**XA commit** 或者**XA rollback**的输入。
  
  
  图7排查XA事务   
  ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002383573913.png "点击放大") 
 
