数据迁移

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 导出数据,如下:

  1. ./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 表明只导出 t1t2 两张表。

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

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

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

向 TiDB 导入数据

注意:目前 TiDB 支持 UTF8mb4 字符编码,假设 mydumper 导出数据为 latin1 字符编码,请使用 iconv -f latin1 -t utf-8 $file -o /data/imdbload/$basename 命令转换,$file 为已有文件,$basename 为转换后文件。

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

我们使用 loader 将之前导出的数据导入到 TiDB。Loader 的下载和具体的使用方法见 Loader 使用文档

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

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

  1. mysql -h127.0.0.1 -P4000 -uroot
  2. mysql> show tables;
  3. +----------------+
  4. | Tables_in_test |
  5. +----------------+
  6. | t1 |
  7. | t2 |
  8. +----------------+
  9. mysql> select * from t1;
  10. +----+------+
  11. | id | age |
  12. +----+------+
  13. | 1 | 1 |
  14. | 2 | 2 |
  15. | 3 | 3 |
  16. +----+------+
  17. mysql> select * from t2;
  18. +----+------+
  19. | id | name |
  20. +----+------+
  21. | 1 | a |
  22. | 2 | b |
  23. | 3 | c |
  24. +----+------+

使用 syncer 增量导入数据

上面我们介绍了如何使用 mydumper/loader 将 MySQL 的数据全量导入到 TiDB,但如果后续 MySQL 的数据有更新,我们仍然希望快速导入,使用全量的方式就不合适了。

TiDB 提供 syncer 工具能方便的将 MySQL 的数据增量的导入到 TiDB 里面。

syncer 属于 TiDB 企业版工具集,如何获取可以参考 下载 TiDB 企业版工具集

下载 TiDB 企业版工具集 (Linux)

  1. # 下载 tool 压缩包
  2. wget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.tar.gz
  3. wget http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.sha256
  4. # 检查文件完整性,返回 ok 则正确
  5. sha256sum -c tidb-enterprise-tools-latest-linux-amd64.sha256
  6. # 解开压缩包
  7. tar -xzf tidb-enterprise-tools-latest-linux-amd64.tar.gz
  8. cd tidb-enterprise-tools-latest-linux-amd64

假设我们之前已经使用 mydumper/loader 导入了 t1 和 t2 两张表的一些数据,现在我们希望这两张表的任何更新,都是实时的同步到 TiDB 上面。

获取同步 position

如上文所提,mydumper 导出的数据目录里面有一个 metadata 文件,里面就包含了我们所需的 position 信息。

medadata 文件信息内容举例:

  1. Started dump at: 2017-04-28 10:48:10
  2. SHOW MASTER STATUS:
  3. Log: mysql-bin.000003
  4. Pos: 930143241
  5. GTID:
  6. Finished dump at: 2017-04-28 10:48:11

我们将 position 相关的信息保存到一个 syncer.meta 文件里面,用于 syncer 的同步:

  1. # cat syncer.meta
  2. binlog-name = "mysql-bin.000003"
  3. binlog-pos = 930143241
  4. binlog-gtid = "2bfabd22-fff7-11e6-97f7-f02fa73bcb01:1-23,61ccbb5d-c82d-11e6-ac2e-487b6bd31bf7:1-4"
  • 注意:syncer.meta 只需要第一次使用的时候配置,后续 syncer 同步新的 binlog 之后会自动将其更新到最新的 position。

  • 注意: 如果使用 binlog position 同步则只需要配置 binlog-name binlog-pos; 使用 gtid 同步则需要设置 gtid,且启动 syncer 时带有 --enable-gtid

启动 syncer

启动 syncer 服务之前请详细阅读 Syncer 增量导入

syncer 的配置文件 config.toml:

  1. log-level = "info"
  2. server-id = 101
  3. ## meta 文件地址
  4. meta = "./syncer.meta"
  5. worker-count = 16
  6. batch = 10
  7. ## pprof 调试地址, Prometheus 也可以通过该地址拉取 syncer metrics
  8. ## 将 127.0.0.1 修改为相应主机 IP 地址
  9. status-addr = "127.0.0.1:10086"
  10. ## 跳过 DDL 或者其他语句,格式为 **前缀完全匹配**,如: `DROP TABLE ABC`,则至少需要填入`DROP TABLE`.
  11. # skip-sqls = ["ALTER USER", "CREATE USER"]
  12. ## 在使用 route-rules 功能后,
  13. ## replicate-do-db & replicate-ignore-db 匹配合表之后(target-schema & target-table )数值
  14. ## 优先级关系: replicate-do-db --> replicate-do-table --> replicate-ignore-db --> replicate-ignore-table
  15. ## 指定要同步数据库名;支持正则匹配,表达式语句必须以 `~` 开始
  16. #replicate-do-db = ["~^b.*","s1"]
  17. ## 指定要同步的 db.table 表
  18. ## db-name 与 tbl-name 不支持 `db-name ="dbname,dbname2"` 格式
  19. #[[replicate-do-table]]
  20. #db-name ="dbname"
  21. #tbl-name = "table-name"
  22. #[[replicate-do-table]]
  23. #db-name ="dbname1"
  24. #tbl-name = "table-name1"
  25. ## 指定要同步的 db.table 表;支持正则匹配,表达式语句必须以 `~` 开始
  26. #[[replicate-do-table]]
  27. #db-name ="test"
  28. #tbl-name = "~^a.*"
  29. ## 指定**忽略**同步数据库;支持正则匹配,表达式语句必须以 `~` 开始
  30. #replicate-ignore-db = ["~^b.*","s1"]
  31. ## 指定**忽略**同步数据库
  32. ## db-name & tbl-name 不支持 `db-name ="dbname,dbname2"` 语句格式
  33. #[[replicate-ignore-table]]
  34. #db-name = "your_db"
  35. #tbl-name = "your_table"
  36. ## 指定要**忽略**同步数据库名;支持正则匹配,表达式语句必须以 `~` 开始
  37. #[[replicate-ignore-table]]
  38. #db-name ="test"
  39. #tbl-name = "~^a.*"
  40. # sharding 同步规则,采用 wildcharacter
  41. # 1. 星号字符 (*) 可以匹配零个或者多个字符,
  42. # 例子, doc* 匹配 doc 和 document, 但是和 dodo 不匹配;
  43. # 星号只能放在 pattern 结尾,并且一个 pattern 中只能有一个
  44. # 2. 问号字符 (?) 匹配任一一个字符
  45. #[[route-rules]]
  46. #pattern-schema = "route_*"
  47. #pattern-table = "abc_*"
  48. #target-schema = "route"
  49. #target-table = "abc"
  50. #[[route-rules]]
  51. #pattern-schema = "route_*"
  52. #pattern-table = "xyz_*"
  53. #target-schema = "route"
  54. #target-table = "xyz"
  55. [from]
  56. host = "127.0.0.1"
  57. user = "root"
  58. password = ""
  59. port = 3306
  60. [to]
  61. host = "127.0.0.1"
  62. user = "root"
  63. password = ""
  64. port = 4000

启动 syncer:

  1. ./bin/syncer -config config.toml
  2. 2016/10/27 15:22:01 binlogsyncer.go:226: [info] begin to sync binlog from position (mysql-bin.000003, 1280)
  3. 2016/10/27 15:22:01 binlogsyncer.go:130: [info] register slave for master server 127.0.0.1:3306
  4. 2016/10/27 15:22:01 binlogsyncer.go:552: [info] rotate to (mysql-bin.000003, 1280)
  5. 2016/10/27 15:22:01 syncer.go:549: [info] rotate binlog to (mysql-bin.000003, 1280)

在 MySQL 插入新的数据

  1. INSERT INTO t1 VALUES (4, 4), (5, 5);

登录到 TiDB 查看:

  1. mysql -h127.0.0.1 -P4000 -uroot -p
  2. mysql> select * from t1;
  3. +----+------+
  4. | id | age |
  5. +----+------+
  6. | 1 | 1 |
  7. | 2 | 2 |
  8. | 3 | 3 |
  9. | 4 | 4 |
  10. | 5 | 5 |
  11. +----+------+

syncer 每隔 30s 会输出当前的同步统计,如下

  1. 2017/06/08 01:18:51 syncer.go:934: [info] [syncer]total events = 15, total tps = 130, recent tps = 4,
  2. master-binlog = (ON.000001, 11992), master-binlog-gtid=53ea0ed1-9bf8-11e6-8bea-64006a897c73:1-74,
  3. syncer-binlog = (ON.000001, 2504), syncer-binlog-gtid = 53ea0ed1-9bf8-11e6-8bea-64006a897c73:1-17
  4. 2017/06/08 01:19:21 syncer.go:934: [info] [syncer]total events = 15, total tps = 191, recent tps = 2,
  5. master-binlog = (ON.000001, 11992), master-binlog-gtid=53ea0ed1-9bf8-11e6-8bea-64006a897c73:1-74,
  6. syncer-binlog = (ON.000001, 2504), syncer-binlog-gtid = 53ea0ed1-9bf8-11e6-8bea-64006a897c73:1-35

可以看到,使用 syncer,我们就能自动的将 MySQL 的更新同步到 TiDB。

[转帖]使用 mydumper/loader 全量导入数据的更多相关文章

  1. 全量导入数据 导致solr内存溢出 崩溃问题解决

    在 data-config.xml 文件中 增加一个参数即可: batchSize="-1"    

  2. hadoop项目实战--ETL--(三)实现mysql表到HIVE表的全量导入与增量导入

    一 在HIVE中创建ETL数据库 ->create database etl; 二 在工程目录下新建MysqlToHive.py 和conf文件夹 在conf文件夹下新建如下文件,最后的工程目录 ...

  3. sqoop1.4.6 全量导入与增量导入 与使用技巧

    全量导入: sqoop import --connect jdbc:mysql://192.168.0.144:3306/db_blog --username root --password 1234 ...

  4. Sqoop(四)增量导入、全量导入、减量导入

    增量导入 一.说明 当在生产环境中,我们可能会定期从与业务相关的关系型数据库向Hadoop导入数据,导入数仓后进行后续离线分析.这种情况下我们不可能将所有数据重新再导入一遍,所以此时需要数据增量导入. ...

  5. Oracle 11g 数据库 expdp/impdp 全量导入导出

    从一个用户导出导入到另一个用户 问题 环境:oracle 11g; redhat 6 usera是具有DBA权限,密码为usera 全量导出usera用户下的所有内容,并导入到新建的userb用户 解 ...

  6. Hbase实用技巧:全量+增量数据的迁移方法

    摘要:本文介绍了一种Hbase迁移的方法,可以在一些特定场景下运用. 背景 在Hbase使用过程中,使用的Hbase集群经常会因为某些原因需要数据迁移.大多数情况下,可以跟用户协商用离线的方式进行迁移 ...

  7. Elasticsearch 全量遍历数据

    1,利用分页,from,to参数,但是当数据量特别大的时候(大约100w),分页是不现实的,排序排不开. 2,利用scan功能. 上 Python代码 from elasticsearch impor ...

  8. Solr基础知识二(导入数据)

    上一篇讲述了solr的安装启动过程,这一篇讲述如何导入数据到solr里. 一.准备数据 1.1 学生相关表 创建学生表.学生专业关联表.专业表.学生行业关联表.行业表.基础信息表,并创建一条小白的信息 ...

  9. Solr7.x学习(4)-导入数据

    导入配置可参考官网:http://lucene.apache.org/solr/guide,http://lucene.apache.org/solr/guide/7_7/ 1.数据准备(MySQL8 ...

  10. 10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.创建MySQL数据 create database solr; use solr; DROP TABLE ...

随机推荐

  1. Android学习--ListView和Tab

    产生一个ListView 其中包含很多items,第一个item启动另一个实现了Tab的Activity. 关于tab的使用方式,参见下面blog http://oldshark.blog.163.c ...

  2. 介绍一个prometheus监控数据生成工具

    prometheus-data-generator Prometheus数据模拟工具旨在通过配置文件模拟Prometheus数据,用于测试和开发目的.该工具允许您生成用于测试和开发的合成数据. 配置 ...

  3. 2021-01-16:我截获了登录token的话,是不是就获得了登录状态,这样就不安全了。如何保证安全?

    福哥答案2021-01-06: 知乎答案: 首先,Token 一般放在 Header 或者 Cookies 中,Http 是明文传输,Https 是密文传输.可以一定程度防止Token 截获. 第二, ...

  4. 第六部分_Shell脚本流程控制语句

    流程控制语句 关键词:选择(人生漫漫长路,我该何去何从) 1. 基本语法结构 ㈠ if结构 箴言1:只要正确,就要一直向前冲️ F:表示false,为假 T:表示true,为真 if [ condit ...

  5. 华为云API Explorer:自动化运维的得力助手

    华为云API Explorer为开发者提供一站式API解决方案统一平台,集成华为云服务所有开放API,支持全量快速检索.可视化调试.帮助文档.代码示例等能力,帮助开发者快速学习API,使用API开发代 ...

  6. 来喽,来喽,Python 3.9正式版发布了~~~

    摘要:2020年10月5日,在全国人员欢度国庆节和中秋节时,Python 3.9 悄摸摸地正式发布了. 2020年10月5日,在全国人员欢度国庆节和中秋节时,Python 3.9 悄摸摸地正式发布了. ...

  7. CoralCache:一个提高微服务可用性的中间件

    摘要:当数据库出问题时能降级从本地缓存的数据中查询数据,CoralCache就是这样一个提高微服务可用性的中间件. 背景 有些场景下,微服务依赖数据库中一些配置项或者数量很少的数据,但当数据库本身有问 ...

  8. Walrus 入门教程:如何创建模板以沉淀可复用的团队最佳实践

    模板是 Walrus 的核心功能之一,模板创建完成后用户可以重复使用,并在使用过程中逐渐沉淀研发和运维团队的最佳实践,进一步简化服务及资源的部署.用户可以使用 HCL 语言自定义创建模板,也可以一键复 ...

  9. 火山引擎 DataLeap:从短视频 APP 实践看如何统一数据指标口径

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 短视频正在成为越来越多人发现世界的窗口,其背后的创作者生态建设是各大短视频 APP 不可忽视的重要组成部分. 为了 ...

  10. PPT 流星动画

    https://www.bilibili.com/video/BV1w54y1Q7cZ?p=6 星空背景绘制 绘制矩形框 背景不再被拖动 处理前先复制一份,用于后面做激光效果 星星效果 再次组合 按S ...