亚马逊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 rds create-db-cluster \
--db-cluster-identifier ningxia-primary-cluster \
--engine aurora-mysql \
--engine-version 8.0.mysql_aurora.3.04.1 \
--kms-key-id beijing-kms-key-id \
--storage-encrypted \
--replication-source-identifier arn:aws-cn:rds:cn-northwest-1:**********:cluster:ningxia-primary-cluster \
--db-cluster-parameter-group-name beijing-parameter-group

AWS CLI 命令输出如下

{
    "DBCluster": {
        "AllocatedStorage": 1,
        "AvailabilityZones": [
            "cn-north-1a",
            "cn-north-1b",
            "cn-north-1d"
        ],
        "BackupRetentionPeriod": 1,
        "DBClusterIdentifier": "aurora-8-1",
        "DBClusterParameterGroup": "aurora8gg-binlog",
        "DBSubnetGroup": "default",
        "Status": "creating",
        "Endpoint": "aurora-8-1.cluster-**********.rds.cn-north-1.amazonaws.com.cn",
        "ReaderEndpoint": "aurora-8-1.cluster-ro-**********.rds.cn-north-1.amazonaws.com.cn",
        "MultiAZ": false,
        "Engine": "aurora-mysql",
        "EngineVersion": "8.0.mysql_aurora.3.04.1",
        "Port": 3306,
        "MasterUsername": "admin",
        "PreferredBackupWindow": "10:36-11:06",
        "PreferredMaintenanceWindow": "thu:08:38-thu:09:08",
        "ReplicationSourceIdentifier": "arn:aws-cn:rds:cn-northwest-1:**********:cluster:aurora-8-1",
        "ReadReplicaIdentifiers": [],
        "DBClusterMembers": [],
        "VpcSecurityGroups": [
            {
                "VpcSecurityGroupId": "sg-0429c**********",
                "Status": "active"
            }
        ],
        "HostedZoneId": "Z2RCSEG0VPNAFY",
        "StorageEncrypted": true,
        "KmsKeyId": "arn:aws-cn:kms:cn-north-1:**********:key/d058e96c-db9a-47dc-b2b3-cdd75ebe777d",
        "DbClusterResourceId": "cluster-VO2NJAPYA5VGC**********",
        "DBClusterArn": "arn:aws-cn:rds:cn-north-1:**********:cluster:aurora-8-1",
        "AssociatedRoles": [],
        "IAMDatabaseAuthenticationEnabled": false,
        "ClusterCreateTime": "2024-02-20T16:49:46.705000+00:00",
        "EngineMode": "provisioned",
        "DeletionProtection": false,
        "HttpEndpointEnabled": false,
        "CopyTagsToSnapshot": false,
        "CrossAccountClone": false,
        "DomainMemberships": [],
        "TagList": [],
        "AutoMinorVersionUpgrade": true,
        "NetworkType": "IPV4",
        "LocalWriteForwardingStatus": "disabled"
    }
}

Aurora Replica Cluster 创建成功

现在,我们已经可以在北京区域,看到新建的 Aurora Replica Cluster。但是 Cluster 中并没有 Database Instance。

添加 Database Instance

接下来,我们为 Aurora Replica Cluster 添加 Database Instance。

使用 AWS CLI 的 describe-db-clusters 命令检查数据库集群是否已变为可用状态,如以下示例中所示:

aws rds describe-db-clusters --db-cluster-identifier aurora-8-1

当 describe-db-clusters 结果显示状态 available 时,创建数据库集群的主实例以便复制能够开始。为此,请使用 AWS CLI 的 create-db-instance 命令创建 Instance,如以下示例中所示:

aws rds create-db-instance \
  --db-cluster-identifier aurora-8-1 \
  --db-instance-class db.r5.large \
  --db-instance-identifier aurora-8-1-writer \
  --engine aurora-mysql

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 命令样例:
    aws rds  create-db-instance-read-replica \
    --db-instance-identifier   beijing-rds-8-1-1 \
    --source-db-instance-identifier  arn:aws-cn:rds:cn-northwest-1:**********:db:rds-mysql-8-1 \
    --db-instance-class db.r6g.large \
    --source-region cn-northwest-1  \
    --vpc-security-group-ids sg-0429c3********** \
    --db-subnet-group-name 	default  \
    --storage-type gp3  \
    --kms-key-id arn:aws-cn:kms:cn-north-1:**********:key/d058e96c-db9a-47dc-b2b3-cdd75ebe777d \
    --db-parameter-group-name   rdsmysql8-1  \
    --tags Key=Name,Value=RDS-mysql8-1-replica
    
  • Regional Replica 命令样例:
    aws rds  create-db-instance-read-replica \
    --db-instance-identifier   ningxia-rds-8-1-1-2 \
    --source-db-instance-identifier   rds-mysql-8-1 \
    --db-instance-class db.r6g.large \
    --storage-type gp3  \
    --tags Key=Name,Value=RDS-mysql8-1-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.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/MySQL.KnownIssuesAndLimitations.html

https://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Reference.ParameterGroups.html

https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.CrossRegion.html

https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html

https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html

本篇作者

许晓亮

亚马逊云科技解决方案架构师,负责基于亚马逊云科技云计算方案架构的咨询和设计,在国内推广亚马逊云科技云平台技术和各种解决方案。擅长数据库和大数据领域,结合云原生特性,为客户设计高效稳定的全球化系统方案。