Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 125 additions & 0 deletions how-to/migrate/full-from-mysql.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
---
title: 全量数据迁移
category: how-to
aliases: ['/docs-cn/dev/how-to/migrate/from-mysql/']
---

# 全量数据迁移

`mydumper` 是一个强大的数据迁移工具,具体可以参考 [https://github.com/maxbube/mydumper](https://github.com/maxbube/mydumper)。你可以使用 `mydumper` 从 MySQL 导出数据,然后用 `loader` 将其导入到 TiDB。

> **注意:**
>
> 虽然 TiDB 也支持使用 MySQL 官方的 `mysqldump` 工具来进行数据的迁移工作,但相比于 `mydumper`/`loader`,性能会慢很多,大量数据的迁移会花费很多时间,这里我们并不推荐。

## `mydumper`/`loader` 全量导入数据最佳实践

为了快速的迁移数据 (特别是数据量巨大的库),可以参考以下建议:

* Mydumper 导出数据至少要拥有 `SELECT`,`RELOAD`,`LOCK TABLES` 权限
* 使用 Mydumper 导出来的数据文件尽可能的小,最好不要超过 64M,可以设置参数 -F 64
* loader的 `-t` 参数可以根据 TiKV 的实例个数以及负载进行评估调整,例如 3个 TiKV 的场景,此值可以设为 `3 *(1 ~ n)`;当 TiKV 负载过高,loader 以及 TiDB 日志中出现大量 `backoffer.maxSleep 15000ms is exceeded` 可以适当调小该值,当 TiKV 负载不是太高的时候,可以适当调大该值。

导入示例及相关配置:

- Mydumper 导出后总数据量 214G,单表 8 列,20 亿行数据
- 集群拓扑
- TiKV * 12
- TiDB * 4
- PD * 3
- Mydumper `-F` 设置为 16,Loader `-t` 参数设置为 64

结果:导入时间 11 小时左右,19.4 G/小时

## 从 MySQL 导出数据

我们使用 `mydumper` 从 MySQL 导出数据,如下:

{{< copyable "shell-regular" >}}

```bash
./bin/mydumper -h 127.0.0.1 -P 3306 -u root -t 16 -F 64 -B test -T t1,t2 --skip-tz-utc -o ./var/test
```

上面,我们使用 `-B test` 表明是对 `test` 这个 database 操作,然后用 `-T t1,t2` 表明只导出 `t1`,`t2` 两张表。

`-t 16` 表明使用 16 个线程去导出数据。`-F 64` 是将实际的 table 切分成多大的 chunk,这里就是 64MB 一个 chunk。

`--skip-tz-utc` 添加这个参数忽略掉 MySQL 与导数据的机器之间时区设置不一致的情况,禁止自动转换。

> **注意:**
>
> 在阿里云等一些需要 `super privilege` 的云上面,`mydumper` 需要加上 `--no-locks` 参数,否则会提示没有权限操作。

## 向 TiDB 导入数据

> **注意:**
>
> 目前 TiDB 支持 UTF8mb4 [字符编码](/dev/reference/sql/character-set.md),假设 Mydumper 导出数据为 latin1 字符编码,请使用 `iconv -f latin1 -t utf-8 $file -o /data/imdbload/$basename` 命令转换,$file 为已有文件,$basename 为转换后文件。

> **注意:**
>
> 如果 Mydumper 使用 -m 参数,会导出不带表结构的数据,这时 loader 无法导入数据。

我们使用 `loader` 将之前导出的数据导入到 TiDB。Loader 的下载和具体的使用方法见 [Loader 使用文档](/dev/reference/tools/loader.md)

{{< copyable "shell-regular" >}}

```bash
./bin/loader -h 127.0.0.1 -u root -P 4000 -t 32 -d ./var/test
```

导入成功之后,我们可以用 MySQL 官方客户端进入 TiDB,查看:

{{< copyable "shell-regular" >}}

```sql
mysql -h 127.0.0.1 -P 4000 -u root
```

{{< copyable "sql" >}}

```sql
show tables;
```

```
+----------------+
| Tables_in_test |
+----------------+
| t1 |
| t2 |
+----------------+
```

{{< copyable "sql" >}}

```sql
select * from t1;
```

```
+----+------+
| id | age |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
```

{{< copyable "sql" >}}

```sql
select * from t2;
```

```
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
+----+------+
```