亚马逊AWS官方博客
RDS/Aurora MySQL8.0 跨区域复制问题的分析与解决
Mysql 5.7 在社区支持结束后,Mysql 8.0 已经成为当前主流运行版本。Mysql 8.0 在带来很多新功能的同时,也需要我们去持续学习和探索它的变化。本文就是针对 Amazon 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 查找官方文档
首先我们查询官方文档对这个参数的解释:
Amazon RDS 数据库实例的 MySQL 参数异常错误
– 某些 MySQL 参数在与 Amazon RDS 数据库实例一起使用时需要考虑一些特殊的注意事项。
lower_case_table_names
– 因为 Amazon RDS 使用区分大小写的文件系统,所以不支持将 lower_case_table_names 服务器参数的值设置为 2(名称存储为给定名称,但按小写字母进行比较)。以下是 Amazon 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 -> Amazon 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.
参考文档
https://docs.thinkwithwp.com/zh_cn/AmazonRDS/latest/UserGuide/MySQL.KnownIssuesAndLimitations.html
https://docs.thinkwithwp.com/cli/latest/reference/rds/create-db-cluster.html
https://docs.thinkwithwp.com/cli/latest/reference/rds/create-db-instance-read-replica.html