Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tools: update document about migration data from mysql #1921

Closed
wants to merge 16 commits into from
Closed
Show file tree
Hide file tree
Changes from 3 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
4 changes: 1 addition & 3 deletions dev/TOC.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,7 @@
- [监控 TiDB Binlog 集群](/dev/how-to/monitor/tidb-binlog.md)
+ 迁移
- [概述](/dev/how-to/migrate/overview.md)
+ 从 MySQL 迁移
- [全量迁移](/dev/how-to/migrate/from-mysql.md)
- [增量复制](/dev/how-to/migrate/incrementally-from-mysql.md)
- [从 MySQL 迁移](/dev/how-to/migrate/from-mysql.md)
- [从 Amazon Aurora MySQL 迁移数据](/dev/how-to/migrate/from-aurora.md)
- [从 CSV 迁移](/dev/reference/tools/tidb-lightning/csv.md)
+ 运维
Expand Down
124 changes: 12 additions & 112 deletions dev/how-to/migrate/from-mysql.md
Original file line number Diff line number Diff line change
@@ -1,124 +1,24 @@
---
title: 全量数据迁移
title: 从 MySQL 迁移数据
category: how-to
---

# 全量数据迁移
# 从 MySQL 迁移数据

Copy link
Contributor

@yikeke yikeke Oct 15, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

一二级标题间最好加一段介绍性概述,可以参考这一段或稍微写两句话总结一下这篇文章。

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

> **注意:**
>
> 虽然 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 导出数据
要将数据从 MySQL 全量迁移至 TiDB,可以采用以下三种方案中一种:
WangXiangUSTC marked this conversation as resolved.
Show resolved Hide resolved

我们使用 `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` 参数,否则会提示没有权限操作。
- **DM**:直接使用 DM 将数据从 MySQL 导出,然后将数据导入至 TiDB。一般场景推荐使用 DM。
- **Mydumper + TiDB Lightning**:先使用 Mydumper 将数据从 MySQL 导出,然后使用 TiDB Lightning 将数据导入至 TiDB。仅在全量数据在 T 级别以上以及对全量数据的导入速度有较高要求的场景下推荐使用该方案。
csuzhangxc marked this conversation as resolved.
Show resolved Hide resolved
- **Mydumper + Loader**:先使用 Mydumper 将数据从 MySQL 导出,然后使用 Loader 将数据导入至 TiDB。适合在数据量较少的场景及测试环境中使用该方案,详细操作参见 [MySQL 数据到 TiDB 的全量迁移](/dev/how-to/migrate/full-from-mysql.md)。

## 向 TiDB 导入数据
## MySQL 数据的全量迁移和增量同步

> **注意:**
>
> 目前 TiDB 支持 UTF8mb4 [字符编码](/dev/reference/sql/character-set.md),假设 Mydumper 导出数据为 latin1 字符编码,请使用 `iconv -f latin1 -t utf-8 $file -o /data/imdbload/$basename` 命令转换,$file 为已有文件,$basename 为转换后文件
- **DM**:先使用 DM 将数据从 MySQL 全量迁移至 TiDB,然后使用 DM 将 MySQL binlog 数据增量同步至 TiDB。一般场景推荐使用 DM。
- **Mydumper + TiDB Lightning + DM**:先使用 Mydumper 将数据从 MySQL 导出,然后使用 TiDB Lightning 将数据导入至 TiDB,再使用 DM 创建增量同步任务 将 MySQL binlog 数据同步至 TiDB。仅在全量数据在 T 级别以上以及对全量数据的导入速度有较高要求的场景下推荐使用该方案。
WangXiangUSTC marked this conversation as resolved.
Show resolved Hide resolved
- - **Mydumper + Loader + Syncer**:先使用 Mydumper 将数据从 MySQL 导出,然后使用 Loader 将数据导入至 TiDB,再使用 Syncer 将 MySQL binlog 数据增量同步至 TiDB。适合在数据量较少的场景及测试环境中使用该方案,详细操作参见 [MySQL 数据到 TiDB 的增量同步](/dev/how-to/migrate/incrementally-from-mysql.md)
WangXiangUSTC marked this conversation as resolved.
Show resolved Hide resolved

> **注意:**
>
> 如果 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 |
+----+------+
```
> 在将 MySQL binlog 数据增量同步至 TiDB 前,需要[在 MySQL 中开启 binlog 功能](http://dev.mysql.com/doc/refman/5.7/en/replication-howto-masterbaseconfig.html),并且 binlog 必须[使用 `ROW` 格式](https://dev.mysql.com/doc/refman/5.7/en/binary-log-formats.html)。
124 changes: 124 additions & 0 deletions dev/how-to/migrate/full-from-mysql.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
---
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommend using the file name "full-data-from-mysql.md", so the directory will be dev/how-to/migrate/full-data-from-mysql.md which conveys a clearer meaning~

Copy link
Contributor

@yikeke yikeke Oct 15, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And no need to add this file to TOC.md?

Also this file /dev/how-to/migrate/incrementally-from-mysql.md is not in TOC.md now.

title: 全量数据迁移
category: how-to
---
WangXiangUSTC marked this conversation as resolved.
Show resolved Hide resolved

# 全量数据迁移

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

> **注意:**
>
> 虽然 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` 参数,否则会提示没有权限操作。
csuzhangxc marked this conversation as resolved.
Show resolved Hide resolved

## 向 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 |
+----+------+
```
27 changes: 7 additions & 20 deletions dev/how-to/migrate/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,37 +11,24 @@ category: how-to

在上述数据迁移过程中会用到如下工具:

- [DM (Data Migration)](/dev/reference/tools/data-migration/overview.md):集成了 Mydumper、Loader、Syncer 的功能,支持 MySQL 数据的全量导出和到 TiDB 的全量导入,还支持 MySQL binlog 数据到 TiDB 的增量同步。
- [TiDB Lightning](/dev/reference/tools/tidb-lightning/overview.md):用于将全量数据高速导入到 TiDB 集群。例如,如果要导入超过 1TiB 的数据,使用 Loader 往往需花费几十个小时,而使用 TiDB-Lightning 的导入速度至少是 Loader 的三倍。
csuzhangxc marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

说明一下只能进行离线导入吧

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已改 e86bcc7

- [Mydumper](/dev/reference/tools/mydumper.md):用于从 MySQL 导出数据。建议使用 Mydumper,而非 mysqldump。
- [Loader](/dev/reference/tools/loader.md):用于将 Mydumper 导出格式的数据导入到 TiDB。
- [Syncer](/dev/reference/tools/syncer.md):用于将数据从 MySQL 增量同步到 TiDB。
- [DM (Data Migration)](/dev/reference/tools/data-migration/overview.md):集成了 Mydumper、Loader、Syncer 的功能,支持 MySQL 数据的全量导出和到 TiDB 的全量导入,还支持 MySQL binlog 数据到 TiDB 的增量同步。
- [TiDB Lightning](/dev/reference/tools/tidb-lightning/overview.md):用于将全量数据高速导入到 TiDB 集群。例如,如果要导入超过 1TiB 的数据,使用 Loader 往往需花费几十个小时,而使用 TiDB-Lightning 的导入速度至少是 Loader 的三倍。

## 迁移场景

本小节将通过几个示例场景来说明如何选择和使用 TiDB 的迁移工具。

### MySQL 数据的全量迁移

要将数据从 MySQL 全量迁移至 TiDB,可以采用以下三种方案中一种:

- **Mydumper + Loader**:先使用 Mydumper 将数据从 MySQL 导出,然后使用 Loader 将数据导入至 TiDB。
- **Mydumper + TiDB Lightning**:先使用 Mydumper 将数据从 MySQL 导出,然后使用 TiDB Lightning 将数据导入至 TiDB。
- **DM**:直接使用 DM 将数据从 MySQL 导出,然后将数据导入至 TiDB。

详细操作参见 [MySQL 数据到 TiDB 的全量迁移](/dev/how-to/migrate/from-mysql.md)。

### MySQL 数据的全量迁移和增量同步
### MySQL 数据源的数据迁移

- **Mydumper + Loader + Syncer**:先使用 Mydumper 将数据从 MySQL 导出,然后使用 Loader 将数据导入至 TiDB,再使用 Syncer 将 MySQL binlog 数据增量同步至 TiDB。
- **Mydumper + TiDB Lightning + Syncer**:先使用 Mydumper 将数据从 MySQL 导出,然后使用 TiDB Lightning 将数据导入至 TiDB,再使用 Syncer 将 MySQL binlog 数据增量同步至 TiDB。
- **DM**:先使用 DM 将数据从 MySQL 全量迁移至 TiDB,然后使用 DM 将 MySQL binlog 数据增量同步至 TiDB。
DM 集成了全量备份、全量恢复、增量备份以及增量同步功能,且对 MySQL 分库分表场景有很好的支持,因此一般情况下推荐使用 DM 迁移 MySQL 的数据,只有在一些特殊场景下推荐使用其他工具,例如:

详细操作参见 [MySQL 数据到 TiDB 的增量同步](/dev/how-to/migrate/incrementally-from-mysql.md)。
- 全量数据在 T 级别以上且对全量数据的导入速度有较高要求的场景下,可以使用 Mydumper + TiDB Lightning 做全量数据导入,再使用 DM 创建增量模式的任务同步增量数据。
- 测试环境且数据量较少,可以使用 Mydumper、Loader、Syncer 做数据的迁移。

> **注意:**
>
> 在将 MySQL binlog 数据增量同步至 TiDB 前,需要[在 MySQL 中开启 binlog 功能](http://dev.mysql.com/doc/refman/5.7/en/replication-howto-masterbaseconfig.html),并且 binlog 必须[使用 `ROW` 格式](https://dev.mysql.com/doc/refman/5.7/en/binary-log-formats.html)。
具体的迁移方案参见 [从 MySQL 迁移数据](/dev/how-to/migrate/from-mysql.md)
WangXiangUSTC marked this conversation as resolved.
Show resolved Hide resolved

### 非 MySQL 数据源的数据迁移

Expand Down