0
0
0
0
博客/.../

# Amazon 数据库迁移至 TiDB 实践方案

 tianyan  发表于  2026-05-29

一、概述与架构对比

1.1 迁移适用场景

以下场景推荐将 Amazon 数据库迁移至 TiDB:

  • 单机容量瓶颈:MySQL 实例数据量超过 2TB,面临水平拆分压力
  • 高并发写入:单实例写入 QPS 超过 5 万,需要扩展写入能力
  • HTAP 需求:实时分析查询(OLAP)影响在线事务(OLTP),需要读写分离或行列混存
  • 成本优化:Amazon RDS/Aurora 高规格实例成本过高,希望降低总体拥有成本(TCO)
  • 数据合规:数据需要部署在特定区域或私有云环境中

1.2 架构对比

Amazon RDS / Aurora    ──→    TiDB DM / Dumpling    ──→    TiDB Cluster
(MySQL 兼容)                (迁移工具)                  (分布式 NewSQL)
维度 Amazon RDS / Aurora MySQL TiDB
架构模式 单节点(主从复制) 分布式架构(计算与存储分离)
横向扩展 垂直扩展为主,读写分离有限 计算层与存储层独立扩展,线性扩展
数据容量 单实例最大 64TB (Aurora) PB 级别,无上限
高可用 跨 AZ 部署,自动故障转移 Raft 多副本,自动选主,故障自愈
事务模型 单机事务 (ACID) 分布式事务 (Percolator / 2PC)
HTAP 需要额外 Redshift / Athena 内置 TiFlash 列存,实时行列混存
兼容性 MySQL 5.7 / 8.0 MySQL 5.7 / 8.0 协议兼容(大部分)
部署方式 托管云服务 自建 / 云托管 (TiDB Cloud) / 混合

二、迁移前评估与规划

2.1 兼容性检查

迁移前必须对源端数据库进行全面兼容性扫描。TiDB 虽然高度兼容 MySQL 协议,但存在部分不支持的特性:

检查项 说明 风险等级
存储过程 / 函数 TiDB 对部分存储过程语法支持有限,需逐个验证 🔴 高
触发器 TiDB v7.x+ 支持触发器,但性能开销较大 🟡 中
外键约束 TiDB 支持外键但建议应用层保证数据一致性 🟡 中
视图 支持简单视图,复杂嵌套视图可能有差异 🟡 中
自定义函数 (UDF) TiDB 不支持自定义函数 🔴 高
分区表 支持 Range / Hash / List 分区,语法与 MySQL 有差异 🟡 中
字符集 / 排序规则 建议统一使用 utf8mb4 🟢 低
自增 ID (AUTO_INCREMENT) TiDB 使用 auto_random 替代方案避免热点 🟡 中
SQL Mode 需确保 TiDB 的 SQL Mode 与源端一致 🟢 低

使用 tiup 进行兼容性检查:

# 安装 tiup
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
source ~/.bash_profile

# 使用 dmctl 检查数据源兼容性
tiup dm ctl --config ./dmctl-config.toml

# 或使用 sync-diff-inspector 进行预检查
tiup install sync-diff-inspector
tiup sync-diff-inspector --config ./check-config.toml

2.2 容量规划

根据源端数据库的数据量和负载进行容量规划:

# 存储容量计算 (TiKV)
原始数据量 × 1.5(Raft 多副本系数,默认 3 副本 × 0.5)× 1.3(索引与元数据开销)
  = TiKV 所需存储总量

# 示例: 源端 500GB 数据
500GB × 1.5 × 1.3 = 975GB → 建议分配 1.2TB SSD × 3 节点

# 计算层 (TiDB Server)
# CPU: 每 1000 QPS 约需 2 Core
# 内存: 每 TiDB 实例建议 ≥ 8GB,推荐 16-32GB

# TiFlash(可选,HTAP 场景)
# 存储容量 = 原始数据量 × 1.0(列存压缩率高)

参考配置矩阵:

数据规模 TiDB 节点 TiKV 节点 PD 节点 TiFlash (可选)
< 200GB 2 × 4C/8G 3 × 4C/16G + 500G SSD 1 × 4C/8G
200GB ~ 1TB 3 × 8C/16G 3 × 8C/32G + 1T SSD 3 × 4C/8G 2 × 8C/32G + 1T SSD
1TB ~ 5TB 4 × 16C/32G 6 × 16C/64G + 2T NVMe 3 × 8C/16G 3 × 16C/64G + 2T SSD
> 5TB 6+ × 32C/64G 9+ × 32C/128G + 4T NVMe 5 × 16C/32G 4+ × 32C/128G + 4T SSD

2.3 网络规划

网络连通性要求

  • Amazon VPC 与 TiDB 目标环境之间建立 VPN / 专线连接
  • 确保 DM 迁移工具所在机器可以同时访问 Amazon RDS 和 TiDB 集群
  • 带宽建议 ≥ 1Gbps(数据量超过 500GB 时建议 ≥ 10Gbps)
  • 防火墙放行端口:TiDB(4000), TiKV(20160), PD(2379), DM(8261/8262)

三、环境准备

3.1 TiDB 集群部署

推荐使用 TiUP 进行自动化部署。以下以 v8.1.0 为例:

# 1. 初始化集群拓扑配置
tiup cluster template --full > topology.yaml

# 2. 编辑 topology.yaml,修改关键配置
cat > topology.yaml << 'EOF'
# ---- Global Configuration ----
global:
  user: tidb
  ssh_port: 22
  deploy_dir: /data/tidb-deploy
  data_dir: /data/tidb-data
  arch: amd64

# ---- PD Servers ----
pd_servers:
  - host: 10.0.1.101
  - host: 10.0.1.102
  - host: 10.0.1.103

# ---- TiDB Servers ----
tidb_servers:
  - host: 10.0.1.201
    port: 4000
    status_port: 10080
  - host: 10.0.1.202
    port: 4000
    status_port: 10080
  - host: 10.0.1.203
    port: 4000
    status_port: 10080

# ---- TiKV Servers ----
tikv_servers:
  - host: 10.0.2.101
    port: 20160
    status_port: 20180
  - host: 10.0.2.102
    port: 20160
    status_port: 20180
  - host: 10.0.2.103
    port: 20160
    status_port: 20180

# ---- TiFlash Servers (HTAP) ----
tiflash_servers:
  - host: 10.0.3.101
  - host: 10.0.3.102

# ---- Monitoring Servers ----
monitoring_servers:
  - host: 10.0.1.200

grafana_servers:
  - host: 10.0.1.200
EOF

# 3. 执行部署(自动 SSH 到各节点)
tiup cluster deploy tidb-prod v8.1.0 topology.yaml --user tidb -i /path/to/ssh_key

# 4. 启动集群
tiup cluster start tidb-prod

# 5. 验证集群状态
tiup cluster display tidb-prod
mysql -h 10.0.1.201 -P 4000 -u root -e "SELECT * FROM information_schema.tikv_store_status;"

关键配置建议:

配置项 推荐值 说明
max-index-length 3072 与 MySQL 8.0 默认值一致
default-authentication-plugin mysql_native_password 兼容旧客户端驱动
txn-local-lifecycle-limit 10000 大事务限制,避免 OOM
raftstore.region-max-size 144MB Region 大小,影响分裂频率
rocksdb.write-buffer-size 128MB 写缓冲区大小

3.2 账号与权限配置

TiDB 端:

-- 创建迁移专用账号
CREATE USER 'dm_migration'@'%' IDENTIFIED BY 'Str0ngP@ss!2024';
GRANT ALL PRIVILEGES ON *.* TO 'dm_migration'@'%' WITH GRANT OPTION;

-- 创建业务只读验证账号
CREATE USER 'app_verify'@'%' IDENTIFIED BY 'V3rifyP@ss!';
GRANT SELECT ON `mydb`.* TO 'app_verify'@'%';

Amazon RDS 端:

-- 在 Amazon RDS 上创建迁移读取账号
CREATE USER 'dm_source'@'%' IDENTIFIED BY 'SrcP@ss!2024';
GRANT SELECT, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE,
  SHOW VIEW, SHOW DATABASES, LOCK TABLES
  ON *.* TO 'dm_source'@'%';

-- 确认 binlog 已开启
SHOW VARIABLES LIKE 'log_bin';          -- 应为 ON
SHOW VARIABLES LIKE 'binlog_format';    -- 应为 ROW
SHOW VARIABLES LIKE 'binlog_row_image'; -- 应为 FULL
SHOW VARIABLES LIKE 'gtid_mode';       -- 推荐 ON

⚠️ Amazon RDS 特别注意

  • RDS 的 binlog 默认已开启,但需确认 binlog_format 为 ROW
  • binlog 保留时间建议调至 ≥ 72 小时:
CALL mysql.rds_set_configuration('binlog retention hours', 72);
  • 如果源端为 Aurora,需确保 binlog 从集群的 Writer 节点读取
  • RDS 不允许 REPLICATION SLAVE 权限,需使用 REPLICATION CLIENT + RELOAD

四、Schema 迁移

4.1 导出源端 Schema

# 安装 Dumpling
tiup install dumpling
tiup dumpling --version

# 仅导出 Schema(不含数据)
tiup dumpling \
  -h rds-cluster.xxx.rds.amazonaws.com \
  -P 3306 \
  -u 'dm_source' \
  -p 'SrcP@ss!2024' \
  --filetype sql \
  --no-data \
  --output ./schema-export \
  --threads 8 \
  --filter 'mydb.*' \
  --consistent

# 导出结果结构:
# ./schema-export/
#   ├── mydb-schema-create.sql
#   ├── mydb.table1-schema.sql
#   ├── mydb.table2-schema.sql
#   └── metadata

4.2 Schema 兼容性修复

导出后需对 DDL 进行以下修复:

-- 1. 移除外键约束(TiDB 建议应用层维护)
ALTER TABLE orders DROP FOREIGN KEY fk_orders_customer;

-- 2. 将 AUTO_INCREMENT 替换为 AUTO_RANDOM(避免写入热点)
-- 原始 DDL:
CREATE TABLE users (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(128)
);

-- 修改后(适用于并发写入场景):
CREATE TABLE users (
  id BIGINT AUTO_RANDOM PRIMARY KEY,
  name VARCHAR(128)
);

-- 3. 确认字符集
ALTER DATABASE mydb CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

-- 4. 移除 spatial index 如不使用
-- ALTER TABLE locations DROP INDEX idx_location;

-- 5. 检查并替换不支持的存储引擎
ALTER TABLE log_data ENGINE = InnoDB;  -- 确保 InnoDB

4.3 导入 Schema 到 TiDB

# 使用 TiDB Lightning 导入 Schema
tiup install tidb-lightning
tiup tidb-lightning \
  --config lightning-schema.toml

# lightning-schema.toml 关键配置:
# [lightning]
# mode = "schema"
# tidb.host = "10.0.1.201"
# tidb.port = 4000
# tidb.user = "dm_migration"
# tidb.password = "Str0ngP@ss!2024"
# mydumper.data-source-dir = "./schema-export"
# mydumper.no-schema = false
# mydumper.no-data = true

五、全量数据迁移 + 增量同步

5.1 方案选型

方案 工具 适用场景 特点
方案 A (推荐) TiDB DM 生产环境在线迁移 全量+增量一体化,自动切换,支持断点续传
方案 B Dumpling + Lightning + TiCDC 超大表(TB级)离线迁移 物理导入速度快,适合停机窗口内完成
方案 C Dumpling + Lightning 可接受停机的场景 最简单,仅全量导入

💡 推荐方案 A:使用 TiDB DM 进行在线迁移

DM(Data Migration)是 TiDB 官方数据迁移工具,支持将 MySQL/MariaDB 数据全量+增量实时同步到 TiDB,是最推荐的迁移方案。

5.2 DM 部署与配置

# 1. 部署 DM 集群(2 个 worker + 1 个 master)
tiup dm template --full > dm-topology.yaml

# 2. 编辑 dm-topology.yaml
# dm_master_servers:
#   - host: 10.0.4.101
#     port: 8261
# dm_worker_servers:
#   - host: 10.0.4.201
#     port: 8262
#   - host: 10.0.4.202
#     port: 8262

# 3. 部署并启动
tiup dm deploy dm-prod v8.1.0 dm-topology.yaml --user tidb -i /path/to/ssh_key
tiup dm start dm-prod

# 4. 验证 DM 集群状态
tiup dm list dm-prod

5.3 配置迁移任务

# ====================
# Amazon RDS → TiDB 迁移任务配置
# ====================
---
name: aws-to-tidb-migration
task-mode: all              # all = 全量 + 增量
shard-mode: pessimistic     # 悲观模式(推荐)

# ---- 源端 (Amazon RDS) ----
target-database:
  host: 10.0.1.201
  port: 4000
  user: "dm_migration"
  password: "Str0ngP@ss!2024"

mysql-instances:
  - source-id: "aws-rds-source"
    route-rules: ["mydb-route-rule"]
    server-id: 1000001                  # 唯一 server-id
    source-config:
      connection-config:
        host: rds-cluster.xxx.rds.amazonaws.com
        port: 3306
        user: "dm_source"
        password: "SrcP@ss!2024"
        security:
          ssl-ca: "/path/to/rds-ca.pem"     # Amazon RDS SSL 证书
          ssl-cert: "/path/to/rds-client-cert.pem"
          ssl-key: "/path/to/rds-client-key.pem"
      checker:
        check-enable: true
        check-thread: 4
        backoff-max: 60s

    # ---- 过滤规则 ----
    filters:
      - "filter-out-system"

filter-rules:
  - filter-out-system
    schema-pattern: "mysql|information_schema|performance_schema|sys|_tidb_*"
    action: Ignore

# ---- 表路由 ----
routes:
  - mydb-route-rule
    schema-pattern: "mydb"
    target-schema: "mydb"
    table-pattern: "*"
    target-table: "*"

# ---- 表结构迁移规则 ----
block-allow-list:
  list-name: "mydb-allow"
  do-dbs: ["mydb"]

# ---- 导出/加载/同步配置 ----
    mydumpers:
      thread: 8                      # 全量导出并发线程
      chunk-size: 64                  # 每批数据行数(MB)
      extra-args: "--rows 1000000"    # Dumpling 参数

    loaders:
      pool-size: 16                   # 全量导入并发
      dir: "./dumped_data"

    syncers:
      worker-count: 16                # 增量同步并发
      batch: 1000                     # 批量大小
      safe-mode: false                # 生产环境关闭 safe-mode

# ---- 出错处理 ----
on-duplication-error-replace: false  # 遇到重复数据报错而非替换
error-count-limit: 100              # 错误累计上限

5.4 启动迁移任务

# 1. 预检查迁移任务
tiup dm ctl --config ./dmctl-config.toml check-task ./task-config.yaml

# 2. 启动迁移任务
tiup dm ctl --config ./dmctl-config.toml start-task ./task-config.yaml

# 3. 监控迁移进度
tiup dm ctl --config ./dmctl-config.toml query-status aws-to-tidb-migration

# 4. 查看全量迁移进度
tiup dm ctl --config ./dmctl-config.toml show-ddl-locks

# 输出示例:
# {
#   "result": true,
#   "msg": "check pass!!",
#   "sources": [{
#     "source": "aws-rds-source",
#     "worker": "dm-worker-1",
#     "stage": "Running",           ← 当前阶段
#     "unit": "Sync",              ← 全量/增量阶段
#     "progress": "82.35%",
#     "total": 1258643200,
#     "finished": 1036800000
#   }]
# }

5.5 增量同步阶段管理

# 查看增量同步延迟
tiup dm ctl --config ./dmctl-config.toml \
  query-status aws-to-tidb-migration | grep "Syncer"

# 暂停迁移任务(维护窗口)
tiup dm ctl --config ./dmctl-config.toml pause-task aws-to-tidb-migration

# 恢复迁移任务
tiup dm ctl --config ./dmctl-config.toml resume-task aws-to-tidb-migration

# 停止迁移任务
tiup dm ctl --config ./dmctl-config.toml stop-task aws-to-tidb-migration

# 处理冲突(如主键重复)
tiup dm ctl --config ./dmctl-config.toml \
  handle-error "aws-to-tidb-migration" skip "aws-rds-source:mysqld-bin.000123:45678"

🚨 迁移注意事项

  • 全量迁移期间不要执行 DDL 操作,避免 binlog 顺序错乱
  • 监控源端 RDS 的负载,避免全量导出拖垮在线业务
  • 增量同步阶段需密切关注延迟,确保控制在 5 秒以内
  • 如果全量数据超过 500GB,建议在业务低峰期启动全量迁移

六、数据校验

数据迁移完成后,必须进行严格的数据一致性校验。TiDB 官方提供 sync-diff-inspector 工具:

# diff-config.toml

# ---- 源端 (Amazon RDS) ----
[data-sources]
[data-sources.mysql]
  host = "rds-cluster.xxx.rds.amazonaws.com"
  port = 3306
  user = "dm_source"
  password = "SrcP@ss!2024"

# ---- 目标端 (TiDB) ----
[data-sources.tidb]
  host = "10.0.1.201"
  port = 4000
  user = "dm_migration"
  password = "Str0ngP@ss!2024"

# ---- 校验任务配置 ----
[task]
  output-dir = "./diff-output"
  source-instances = ["mysql"]
  target-instance = "tidb"
  target-check-tables = ["mydb.*"]

  # 分片校验配置(大表拆分校验)
  [[table-config.source-tables]]
    schema = "mydb"
    table  = "orders"
    split-column = "id"
    split-range = [0, 5000000, 10000000, 15000000]

  # 校验选项
  [task.check-options]
    check-insert = true        # 校验多余行
    check-update = true        # 校验不一致值
    check-delete = true        # 校验缺失行
    chunk-size = 10000         # 每批校验行数
    sample-percent = 100      # 抽样百分比(100=全量校验)
    thread = 8                 # 校验并发线程
# 执行数据校验
tiup sync-diff-inspector diff-config.toml

# 输出示例(成功):
# [2024-01-15 10:30:00] Check passed!
# A total of 50 tables have been checked and all data is consistent.

# 输出示例(不一致):
# [2024-01-15 10:30:00] Check failed!
# mysqldiff.table_diff report saved to: ./diff-output/summary.txt

# 查看差异报告
cat ./diff-output/summary.txt

业务层校验:

-- 1. 表行数校验
SELECT
  TABLE_NAME,
  TABLE_ROWS,
  ROUND(DATA_LENGTH / 1024 / 1024, 2) AS data_mb
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mydb'
ORDER BY TABLE_ROWS DESC;

-- 2. 聚合值校验
SELECT COUNT(*) AS total_rows,
       SUM(amount) AS total_amount,
       MAX(created_at) AS latest_record
FROM orders;

-- 3. 采样比对(在源端和目标端分别执行)
SELECT id, amount, status, created_at
FROM orders
WHERE id % 1000 = 0
ORDER BY id
LIMIT 1000;

七、性能调优

7.1 TiDB 核心参数调优

组件 参数 推荐值 说明
TiDB token-limit 4096 单实例总 token 配额,控制并发度
TiDB max-server-connections 根据业务设置 最大连接数,建议预留 20%
TiDB mem-quota-query 1GB 单条 SQL 内存上限
TiKV readpool.coprocessor.low-concurrency 8 低优先级协处理器线程
TiKV readpool.coprocessor.high-concurrency 8 高优先级协处理器线程
TiKV rocksdb.write-buffer-size 128MB 写缓冲大小
TiKV raftstore.apply-pool-size 4 Raft apply 线程池
PD replication.max-replicas 3 副本数(生产环境必须 3)
PD schedule.leader-schedule-limit 4 Leader 调度频率

7.2 索引优化

-- 1. 查看热点表和热点索引
SELECT * FROM information_schema.tikv_region_status
WHERE written_keys > 100000 ORDER BY written_keys DESC;

-- 2. 统计信息手动收集(迁移后必须)
ANALYZE TABLE mydb.orders;
ANALYZE TABLE mydb.users;
ANALYZE TABLE mydb.order_items;

-- 3. 全库统计信息收集
SET GLOBAL tidb_auto_analyze_ratio = 0.5;
SET GLOBAL tidb_auto_analyze_start_time = '03:00 +0800';
SET GLOBAL tidb_auto_analyze_end_time = '05:00 +0800';

-- 4. 查看慢查询
SELECT query_time, total_keys, sql_text
FROM information_schema.slow_query
ORDER BY query_time DESC
LIMIT 20;

7.3 高可用配置

# 确认副本分布在不同可用区(AZ)
# SQL:
SELECT
  store_id, address, state_name,
  ROUND(capacity / 1024 / 1024 / 1024, 2) AS capacity_gb,
  available
FROM information_schema.tikv_store_status;

# 配置标签实现 AZ 感知调度
tiup ctl vd --host 10.0.1.101:2379 \
  store label 1 zone az1

tiup ctl vd --host 10.0.1.101:2379 \
  config set replication.location-labels "zone"

八、业务验证与压测

验证流程:

  1. 功能验证:在 TiDB 环境运行完整的业务功能测试用例,覆盖所有 CRUD 操作、事务、存储过程等关键业务逻辑
  2. 性能基准测试:使用 sysbench / mysqlslap / 自定义压测工具,对比源端和目标端的 QPS、响应延迟、吞吐量
  3. 故障注入测试:模拟节点宕机、网络分区等故障场景,验证 TiDB 的自动恢复和业务影响
  4. 灰度验证:将部分非核心业务流量路由到 TiDB,观察 1-2 周,确认稳定后再全量切换

8.1 Sysbench 压测

# 安装 sysbench
apt-get install sysbench

# OLTP 读写混合测试
sysbench oltp_read_write \
  --threads=64 \
  --time=600 \
  --report-interval=10 \
  --tables=64 \
  --table-size=1000000 \
  --db-driver=mysql \
  --mysql-host=10.0.1.201 \
  --mysql-port=4000 \
  --mysql-user=dm_migration \
  --mysql-password='Str0ngP@ss!2024' \
  --mysql-db=mydb \
  run

# OLTP 只写测试
sysbench oltp_write_only \
  --threads=32 --time=300 \
  --mysql-host=10.0.1.201 --mysql-port=4000 \
  --mysql-user=dm_migration --mysql-password='Str0ngP@ss!2024' \
  --mysql-db=mydb \
  run

8.2 性能指标参考

指标 RDS MySQL 参考 TiDB 参考目标
读写混合 QPS 2 万~5 万 10 万~30 万(随节点线性扩展)
纯写 TPS 1 万~2 万 5 万~15 万
P99 延迟(简单查询) 1~5ms 2~10ms
P99 延迟(复杂查询) 10~100ms 15~150ms
事务吞吐 1~3 万 TPS 3~10 万 TPS

九、切换上线

9.1 切换流程

Step 1 → 确认增量同步追平(DM 延迟 < 1 秒)
    ↓
Step 2 → 设置 RDS 只读模式
    ↓
Step 3 → 等待 DM 追完剩余数据
    ↓
Step 4 → 最终数据一致性校验
    ↓
Step 5 → 修改应用连接串指向 TiDB
    ↓
Step 6 → 验证业务正常运行
    ↓
Step 7 → 停止 DM 任务
# Step 1: 检查 DM 增量延迟
tiup dm ctl --config ./dmctl-config.toml query-status aws-to-tidb-migration

# Step 2: RDS 设为只读(AWS CLI)
aws rds modify-db-instance \
  --db-instance-identifier my-rds-instance \
  --enable-read-replica \
  --apply-immediately

# Step 3: 等待并确认(间隔 30 秒检查 DM 状态)
watch -n 30 "tiup dm ctl --config ./dmctl-config.toml query-status aws-to-tidb-migration"

# Step 4: 最终校验
tiup sync-diff-inspector diff-config.toml

# Step 5: 切换应用连接(以 Spring Boot 为例)
# application.yml:
# spring:
#   datasource:
#     url: jdbc:mysql://10.0.1.201:4000/mydb?useSSL=false&serverTimezone=Asia/Shanghai

# Step 7: 停止 DM 任务
tiup dm ctl --config ./dmctl-config.toml stop-task aws-to-tidb-migration

⚠️ 切换窗口建议

  • 选择业务低峰期(如凌晨 2:00 - 5:00)
  • 准备回滚方案(保留 RDS 实例至少 7 天)
  • 通知相关团队(DBA、开发、运维、业务方)
  • 提前准备应急联系渠道

9.2 回滚方案

🚨 回滚条件 — 出现以下任一情况,应立即启动回滚:

  • TiDB 集群不可用或连续错误超过 5 分钟
  • 关键业务流程出现严重错误(如订单丢失、金额计算错误)
  • P99 延迟超过业务可接受阈值的 3 倍
# 1. 将应用连接切回 Amazon RDS

# 2. 将 RDS 恢复为可读写
aws rds modify-db-instance \
  --db-instance-identifier my-rds-instance \
  --no-enable-read-replica \
  --apply-immediately

# 3. 使用 DM 反向同步切换期间 TiDB 端产生的数据
# 需要重新配置 DM 任务,将 TiDB 作为源端,RDS 作为目标端
# 注意:反向同步需要开启 TiDB 的 binlog(TiDB v7.x+ 支持)
-- TiDB 开启 binlog(用于反向同步)
SET GLOBAL tidb_enable_binlog = 1;

-- 4. 验证 RDS 端数据完整性
SELECT COUNT(*) FROM orders WHERE updated_at > '2024-01-15 02:00:00';

十、迁移后优化

10.1 统计信息与执行计划

-- 1. 全库收集统计信息
SET GLOBAL tidb_auto_analyze_ratio = 0.3;
ANALYZE TABLE mydb.orders HISTOGRAM ON id, user_id, status, created_at;

-- 2. 检查执行计划绑定(确保关键查询走正确索引)
CREATE BINDING FOR
  SELECT * FROM orders WHERE user_id = ? AND status = ?
  USING SELECT /*+ USE_INDEX(orders idx_user_status) */ * FROM orders WHERE user_id = ? AND status = ?;

-- 3. 查看绑定状态
SHOW GLOBAL BINDINGS;

10.2 监控告警配置

告警项 阈值 级别
TiDB 节点存活 任意节点不可用 P0
TiKV 副本数 副本数 < 3 P0
Region 健康度 peers < majority 的 Region 数 > 0 P0
查询延迟 P99 > 500ms P1
DML 持续阻塞 > 10s P1
PD Leader 负载 CPU > 80% P1
磁盘使用率 > 80% P2
慢查询数量 > 100/分钟 P2

10.3 备份策略

# 全量备份到 S3 / 本地存储
tiup br backup full \
  --pd "10.0.1.101:2379" \
  --storage "s3://my-backup-bucket/tidb-backup?access-key=XXX&secret-access-key=YYY&endpoint=s3.amazonaws.com" \
  --send-credentials-to-tikv=true \
  --compression lz4

# 增量备份(基于日志)
tiup br backup point \
  --pd "10.0.1.101:2379" \
  --storage "s3://my-backup-bucket/tidb-incremental" \
  --start-ts 433883834356060161 \
  --end-ts 433883834356060162

# 定时备份 (crontab 示例: 每天凌晨 3 点全量备份)
# 0 3 * * * tiup br backup full --pd "10.0.1.101:2379" --storage "s3://..." --compression lz4

十一、常见问题 FAQ

Q1: 迁移过程中 DM 报 "driver: bad connection" 怎么办?

通常是因为 Amazon RDS 连接超时或 SSL 配置问题。检查以下几点:

  • 确认 DM Worker 所在机器到 RDS 的网络连通性
  • 检查 SSL 证书路径是否正确
  • 在 DM source-config 中增加 connection-config 参数:max-idle-connectionsmax-open-connections
  • RDS 安全组是否放行了 DM Worker 的 IP

Q2: 全量迁移速度很慢怎么办?

优化建议:

  • 增大 mydumpers.thread 参数(建议 8-16)
  • 增大 loaders.pool-size 参数(建议 16-32)
  • 检查 TiKV 磁盘 IOPS 是否达到瓶颈
  • 临时关闭 TiDB 的限流参数
  • 增加 DM Worker 节点数

Q3: 迁移后某些查询变慢了?

迁移后必须收集统计信息,否则优化器可能选择错误的执行计划:

-- 强制收集全库统计信息
SET GLOBAL tidb_auto_analyze_ratio = 0.01;
ANALYZE DATABASE mydb;

-- 对关键表收集 Histogram
ANALYZE TABLE orders HISTOGRAM ON user_id, status;

-- 使用 EXPLAIN ANALYZE 查看实际执行计划
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 1000 AND status = 1;

Q4: AUTO_ID 热点问题如何处理?

TiDB 默认的 AUTO_INCREMENT 使用单一自增序列,会导致写入集中在单个 Region。解决方案:

  • 新表使用 AUTO_RANDOM 代替 AUTO_INCREMENT
  • 已有表通过 ALTER TABLE ... AUTO_RANDOM 修改
  • 业务层使用分布式 ID 生成器(如 Snowflake)

Q5: 大事务导致 OOM 怎么办?

TiDB 分布式事务对大事务敏感。建议:

  • 设置事务大小限制:SET GLOBAL txn-entry-size-limit = 62914560;(60MB)
  • 拆分大批量操作(如 DELETE 分小批量执行)
  • Batch Insert 每批不超过 5000 行
  • 使用 SET GLOBAL txn-local-lifecycle-limit = 1000000; 限制事务操作数

Q6: 从 Aurora Serverless 迁移有什么特殊注意?

Aurora Serverless v2 支持 binlog,但需要注意:

  • 必须将集群容量暂时提升以确保 binlog 写入性能
  • Serverless 的连接数限制可能导致 Dumpling 导出超时
  • 建议在迁移期间将 Aurora 切换为 Provisioned 模式

适用版本:TiDB v7.x / v8.x 源端:Amazon RDS MySQL / Aurora MySQL 参考资料

0
0
0
0

声明:本文转载于 https://docs.pingcap.com/zh/tidbcloud/migrate-from-mysql-using-aws-dms/

评论
暂无评论