MariaDB 中文社区

从 AWS Aurora MySQL 迁移到 MariaDB

Aurora 是 AWS 魔改版,迁出有几个特殊坑——这里讲清

Aurora MySQL ≠ MySQL。Aurora 是 AWS 重写存储层后的产物,与上游 MySQL 在性能、行为、运维工具上都有差异。迁到 MariaDB 时除了 MySQL 8 → MariaDB 的通用步骤外,还要处理以下 Aurora 特有点。

Aurora 特有的"魔改"

特性AuroraMariaDB 11
存储6 副本分布式单实例本地 + 复制
故障转移30s 内自动取决于你的复制方案
Backtrack可回退到任意时间点(不用恢复)没有,只有 PITR + 备份
Parallel Query复杂查询自动并行无(11.x 优化器有部分场景)
Global Database跨区域副本自管 Galera 或 binlog 复制
Aurora Serverless自动扩容没有(按实例规格固定)
aws_* 函数内置 S3 上传等没有
Performance Insights内置用 PMM / 自建

出 Aurora 必做的几件事

1. 关掉 backtrack 依赖

Aurora 的 backtrack 是"魔法"。MariaDB 没有等价物。应用层不能依赖"我搞错了能 backtrack 半小时"——必须真做备份。

2. 改写 aws_s3 等专有函数

-- Aurora
SELECT aws_s3.query_export_to_s3(
  'SELECT * FROM users',
  aws_commons.create_s3_uri('mybucket', 'users.csv', 'us-east-1'),
  options := 'format csv'
);

-- MariaDB:自己写脚本
mariadb -e "SELECT * FROM users" --batch | aws s3 cp - s3://mybucket/users.csv

或在应用层用 mariadb-dump + aws s3 cp

3. Parallel Query 重写

Aurora Parallel Query 让某些大查询飞起。MariaDB 没有自动并行,但可以:

  • MariaDB ColumnStore(如果是 OLAP)
  • MaxScale + 多个读副本 自己分片
  • 改写为 partition 查询并行跑

4. Global Database 改成 Galera

Aurora Global Database 跨区域 < 1s 复制。MariaDB 等价方案:

  • Galera Cluster 多 region 部署(写延迟敏感)
  • MariaDB MaxScale 做读写分离 + 多 region 路由
  • binlog 异步复制到远端(最简单,秒级到分钟级延迟)

5. Serverless V2 → 实例规格

Aurora Serverless 按 ACU 计费、自动伸缩。MariaDB 没有"原生 serverless",可选方案:

  • k8s VPA + MariaDB Operator(半自动)
  • EC2 spot + 周期重新部署(不推荐生产)
  • 接受固定实例规格

6. Performance Insights 替代

# 用 PMM
docker run -d --name pmm-server -p 80:80 percona/pmm-server:2

# 在 MariaDB 实例上
docker run -d --rm --name pmm-client --network host \
  -e PMM_SERVER=http://pmm-host \
  percona/pmm-client:2
pmm-admin add mysql --query-source=perfschema \
  --username=monitor --password=xxx --host=127.0.0.1 --port=3306 mariadb-main

详见 运维 → 监控

数据出 Aurora 的方式

方案 A:DMS(AWS 内推工具)

Aurora MySQL  --(DMS)-->  MariaDB on EC2 / 自建

DMS 支持 MySQL 5.7 / 8 作为 source,MySQL 兼容 的 target 都可选。

  • 优点:托管、CDC 自动
  • 缺点:贵、限制多、不支持某些 Aurora 特有变更

方案 B:mysqldump + 手动 CDC

# Aurora 创建只读副本,开放 binlog
mysqldump -h aurora-read-replica.region.rds.amazonaws.com \
  --single-transaction --routines --triggers \
  --master-data=2 --all-databases > dump.sql

# 替换 collation
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' dump.sql

# 导入 MariaDB
mariadb -h mariadb-host < dump.sql

# 从 dump 里读出 binlog position,用 mysqlbinlog tailing

方案 C:Debezium

# Debezium 连 Aurora(开 binlog)
database.hostname: aurora-cluster.cluster-xxx.region.rds.amazonaws.com
database.port: 3306
database.user: debezium
database.password: xxx
database.server.id: 184054
database.include.list: app

下游 sink 到 MariaDB。

Aurora 配置项映射

Aurora 参数组MariaDB my.cnf 等价
innodb_buffer_pool_size(自动按实例)手动设到 RAM 60–70%
max_connections一致
aurora_lab_mode
binlog_format = MIXEDbinlog_format = ROW(推荐)
aurora_use_key_prefetch

性能预期管理

Aurora 在某些场景比 MariaDB 快

  • 大量小事务(存储层并行写)
  • 大查询 + Parallel Query
  • 多副本读

MariaDB 在某些场景反而更优

  • 单点写吞吐(无网络存储开销)
  • 复杂优化器场景(Hash Join)
  • 完全开源 + 可定制

建议在迁移前用 sysbench 跑两边对比,确认负载模式。

切流策略

类似 MySQL 8 迁移,加几个 Aurora 特有:

  1. 关闭 Aurora 自动 minor version upgrade(避免切流期间 source 升级)
  2. 创建专用只读副本给迁移用(不影响生产)
  3. 充分利用 Aurora backtrack 做"切错回滚"——这是你最后一次能用它

别迁的场景

  • 用了 Aurora Serverless V2 + 强自动扩缩 且业务峰谷剧烈
  • 用了 Aurora Global Database + 5 region 同步
  • 用了 Aurora Machine Learning 集成 SageMaker
  • 用了 Babelfish(Aurora 的 SQL Server 兼容层)

这些场景 MariaDB 没有等价能力,迁过去要重做架构。

参考

本页目录