# 初次上云：华为云 RDS for MySQL 接入指南

> 从自建 MySQL 迁移到华为云 RDS for MySQL 的完整实施步骤与关键注意事项，涵盖安全组配置、字符集时区、参数调优和运维方式转变。

---

LLMS 索引： [llms.txt](/zh/llms.txt)

---

很多客户在以往项目中习惯了在 ECS 上自建 MySQL——SSH 进去，`yum install mysql-server`，配置文件随手改，监控靠自己搭。第一次使用托管数据库服务（RDS）时，往往会在一些细节上"踩坑"，不是因为技术难，而是思维惯性没转过来。

本文梳理了从零开始接入华为云 RDS for MySQL 的完整步骤，并重点标注了与自建数据库差异较大的地方。

---

## 主要实施步骤

### 1. 创建 RDS 实例

在华为云控制台购买并创建 RDS for MySQL 实例时，有一个选项务必在创建时就确认好：**区域（Region）和 VPC 必须与业务 ECS 保持一致**。

这不是可以事后调整的选项。RDS 实例创建完成后，其 VPC 归属无法更改。如果事后发现 RDS 和 ECS 不在同一 VPC，要么重建实例，要么配置 VPC 对等连接——两种方式都麻烦。选对 Region 和 VPC 是后续所有内网连通的前提。

### 2. 初始化数据库和账号

实例就绪后，在 RDS 控制台：

- 创建业务所需的数据库（Database）
- 创建数据库账号（User），**不要直接使用 root**
- 按最小权限原则授权，通常业务账号只需 `SELECT / INSERT / UPDATE / DELETE / CREATE / DROP` 等常用权限即可

### 3. 修改应用配置

找到业务软件的数据库配置文件，将连接参数从旧的自建 MySQL 切换过来：

| 参数 | 旧值（自建） | 新值（RDS） |
|---|---|---|
| Host | ECS 内网 IP | RDS 内网域名或内网 IP |
| Port | 3306 | 3306（默认，可自定义） |
| Database | 原库名 | 新建的库名 |
| User | 原账号 | RDS 控制台创建的账号 |
| Password | 原密码 | RDS 控制台设置的密码 |

**优先使用 RDS 提供的内网域名**，而不是内网 IP。内网域名在实例主备切换后仍然有效，IP 可能变化。

### 4. 验证网络连通性

改配置之前，先从 ECS 测试连通性：

```bash
mysql -h <RDS内网地址> -u <用户名> -P 3306 -p
```

或者用 `telnet` / `nc` 先测端口：

```bash
telnet <RDS内网地址> 3306
```

**如果连接失败，优先排查安全组**——这是新用户最常见的问题，见下文。

### 5. 启动应用并完整测试

网络连通后，修改配置文件，启动业务软件，进行完整的功能回归测试，确认所有数据库读写操作正常。

---

## 需要特别留意的要点

以下几点是自建 MySQL 与云 RDS 差异最大的地方，容易被忽略。

### ⚠️ 安全组规则（最常见问题）

RDS 实例默认不对任何来源开放 3306 端口。你需要：

1. 找到 RDS 实例绑定的**安全组**
2. 添加**入方向规则**：协议 TCP，端口 3306，源地址填写业务 ECS 的内网 IP（如 `192.168.1.10/32`）

不要图省事把源地址设成 `0.0.0.0/0`，这会将数据库端口暴露在整个 VPC 乃至公网范围内。

### ⚠️ 字符集和时区

新建 RDS 实例的默认字符集不一定是 `utf8mb4`。如果你的业务数据包含 emoji 或非 BMP 平面的 Unicode 字符，必须确认：

```sql
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'time_zone';
```

建议在 RDS 控制台的**参数组**中显式设置：

```
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
time_zone = Asia/Shanghai
```

时区不对会导致 `DATETIME` 类型数据存取出现偏差，排查起来很隐蔽。

### ⚠️ 关键参数确认

RDS 有一套默认参数组，与你自建库的配置可能不同，以下几个参数需要重点核对：

**`lower_case_table_names`（表名大小写敏感）**

这是 MySQL 8.0 上最容易踩的坑。**RDS for MySQL 8.0 不支持在实例创建后修改此参数**，必须在创建实例时就确认好。

- `0`：大小写敏感（Linux 默认，生产推荐）
- `1`：大小写不敏感（Windows 常见，迁移旧库时注意对齐）

**`innodb_flush_log_at_trx_commit` 和 `sync_binlog`**

RDS 默认均为 `1`，即每次事务提交都强制刷盘，数据最安全但写入性能最低。

| 配置 | 性能 | 数据安全 |
|---|---|---|
| 两者均为 1 | 较低 | 最强（丢数据风险最低） |
| flush=2, sync=0 | 较高 | 较弱（宕机可能丢 1 秒数据） |

如果业务对写入吞吐有要求，可以在充分测试后酌情调整，但要清楚代价。

### ⚠️ 从"管理 OS"转变为"管理服务"

这是心智模型的转变，也是最容易产生不适应的地方。

用自建 MySQL 时，你可以 SSH 进服务器，`tail -f /var/log/mysql/error.log`，`vim /etc/mysql/my.cnf`，想改什么改什么。用了 RDS 之后，这些操作入口都不存在了。

日常运维对应关系：

| 自建操作 | RDS 对应方式 |
|---|---|
| 修改 `my.cnf` | 控制台 → 参数组 |
| 查看 error log | 控制台 → 日志管理 |
| 手动备份 | 控制台 → 备份恢复 → 创建手动备份 |
| 监控慢查询 | 控制台 → 慢日志 |
| 服务重启 | 控制台 → 重启实例（谨慎操作） |

### ⚠️ 备份策略

RDS 默认开启自动备份，但默认配置不一定符合你的业务要求。建议第一时间确认：

- **备份时间窗口**：设置在业务低峰期（如凌晨 2-4 点）
- **备份保留天数**：默认 7 天，根据业务重要性可调整为 14~30 天
- **定期手动验证恢复**：自动备份有没有用，只有恢复测试说了算

---

## 总结

整体迁移工作量不大，核心就三件事：**改配置、调参数、测连通性**。

容易出问题的地方集中在安全组规则、字符集时区设置，以及 MySQL 8.0 下 `lower_case_table_names` 的不可变性。提前确认这几个点，接入过程基本能顺滑完成。

云 RDS 的价值不在于"用起来更简单"，而在于把备份、高可用、监控、故障切换这些运维成本转移给了云厂商——你不需要操心这些，但需要学会通过控制台而不是命令行来完成这些操作。
