-
Notifications
You must be signed in to change notification settings - Fork 1.2k
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
Changes from 10 commits
b7bca53
75d16cd
3f4787e
e1e0888
d40027b
b36f3bd
b1e6acd
0712049
e86bcc7
5a78016
598458a
c78affa
4c9b737
46cdcbc
110bab4
46a9fcd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,124 +1,24 @@ | ||
--- | ||
title: 全量数据迁移 | ||
title: 从 MySQL 迁移数据 | ||
category: how-to | ||
--- | ||
|
||
# 全量数据迁移 | ||
# 从 MySQL 迁移数据 | ||
|
||
`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,详细使用方法参见 [DM (Data Migration)](/dev/reference/tools/data-migration/overview.md)。 | ||
WangXiangUSTC marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- **Mydumper + TiDB Lightning**:先使用 Mydumper 将数据从 MySQL 导出,然后使用 TiDB Lightning 将数据导入至 TiDB。仅在全量数据在 T 级别以上以及对全量数据的导入速度有较高要求的场景下推荐使用该方案,详细使用方法参见 [Mydumper](/dev/reference/tools/mydumper.md) 和 [TiDB Lightning](/dev/reference/tools/tidb-lightning/overview.md)。 | ||
WangXiangUSTC 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,详细使用方法参见 [DM (Data Migration)](/dev/reference/tools/data-migration/overview.md)。 | ||
WangXiangUSTC marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- **Mydumper + TiDB Lightning + DM**:先使用 Mydumper 将数据从 MySQL 导出,然后使用 TiDB Lightning 将数据导入至 TiDB,再使用 DM 创建增量同步任务将 MySQL binlog 数据同步至 TiDB。仅在全量数据在 T 级别以上以及对全量数据的导入速度有较高要求的场景下推荐使用该方案,详细使用方法参见 [Mydumper](/dev/reference/tools/mydumper.md)、[TiDB Lightning](/dev/reference/tools/tidb-lightning/overview.md) 和 [DM (Data Migration)](/dev/reference/tools/data-migration/overview.md)。 | ||
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)。 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 尽量不推进 loader 了,使用 lightning 的 tidb backend 模式吧 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 目前 lightning 的文档还没有更新,等文档更新后我再更新下描述吧 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 等 lightning 文档合并吧,应该可以用这个文章 https://docs.google.com/document/d/13U0Cud3YSThQFOzIQwt-aWjwd4M4fOKBb3JMtlQYQV4/edit There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 好,那再等等
yikeke 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)。 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
--- | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. And no need to add this file to Also this file |
||
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 | | ||
+----+------+ | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
一二级标题间最好加一段介绍性概述,可以参考这一段或稍微写两句话总结一下这篇文章。