Mysql数据迁移到TIDB详解

我从业16年来,使用了太多的数据库(RDBMS->NoSQL->NewSQL),首先我说一下数据库的变迁和发展历史:

  1. 以 MySQL 为例刚开始时,它是一个单机模式,但是随着数据库的数据量的增加及用户对性能要求的提高,它的存储容量和性能都遇到了瓶颈。
  2. 这些需求催生了新的解决方案,那就是 MySQL 主从模式,进而将读写分离,减轻了读写系统的负担。虽然可以是多从,但是主是单点的。接下来就发展到了中间件的解决方案,这个方案优点是能够在一些限制条件下实现相对扩容,
  3. 但它是由一种手动的、静态路由的方式来实现的扩容。那么对 DBA 在处理扩容操作时的要求就会比较高。之后诞生了 NoSQL 的解决方案,这里以 HBase 为例:它支持强一致,多版本等,最重要是它在扩容和性能方面都做的比较好。
  4. 但是它不支持 SQL 语法,对复杂查询没有怎么支持,还有它的分布式事务不支持跨行。从而引入了 NewSQL 的概念。那么怎么理解 NewSQL 呢?NewSQL 可以浅显地理解为 SQL + NoSQL 的概念,它支持 SQL 语法和分布式事务。

我们现在面临问题,我总结如下,

  • 数据量大,如何快速水平扩展存储
  • 大数据量下,如何快速DDL
  • 业务层分库分表造成业务逻辑非常复杂
  • 常规MySQL主从故障转移造成业务不可用
  • 开源高可用运维方案不友好

针对如上问题,我们的TiDB特点

  • 开源分布式NewSQL关系型数据库
  • 自动水平伸缩
  • 强一致性分布式事务
  • 基于Raft算法的多副本复制
  • 高度兼容MySQL协议

下面实战一下Mysql数据迁移到TIDB的方法

  • 新建Table在Mysql
  1. USE test;
  2. CREATE TABLE t1 (id INT, age INT, PRIMARY KEY(id)) ENGINE=InnoDB;
  3. CREATE TABLE t2 (id INT, name VARCHAR(256), PRIMARY KEY(id)) ENGINE=InnoDB;
  4. INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3); INSERT INTO t2 VALUES (1, "a"), (2, "b"), (3, "c");
  • 运行checker工具验证是否可以迁移

./bin/checker -host 127.0.0.1 -port 3306 -user root test 2016/10/27 13:11:49 checker.go:48: [info] Checking database test 2016/10/27 13:11:49 main.go:37: [info] Database DSN: root:@tcp(127.0.0.1:3306)/test?charset=utf8 2016/10/27 13:11:49 checker.go:63: [info] Checking table t1 2016/10/27 13:11:49 checker.go:69: [info] Check table t1 succ 2016/10/27 13:11:49 checker.go:63: [info] Checking table t2 2016/10/27 13:11:49 checker.go:69: [info] Check table t2 succ

  • 使用mydumper导出数据, https://github.com/maxbube/mydumper。
  1. 下载 mydumper 压缩包 wget http://download.pingcap.org/mydumper-linux-amd64.tar.gz wget http://download.pingcap.org/mydumper-linux-amd64.sha256 # 检查文件完整性,返回 ok 则正确 sha256sum -c mydumper-linux-amd64.sha256 # 解开压缩包 tar -xzf mydumper-linux-amd64.tar.gz cd mydumper-linux-amd64
  2. mydumper 从 MySQL 导出数据,如下:

./bin/mydumper -h 127.0.0.1 -P 3306 -u root -t 16 -F 128 -B test -T t1,t2 -o ./var/test

说明:上面,我们使用 -B test 表明是对 test 这个 database 操作,然后用 -T t1,t2 表明只导出 t1,t2 两张表。-t 16 表明使用 16 个线程去导出数据。-F 128 是将实际的 table 切分成多大的 chunk,这里就是 128MB 一个 chunk。注意:在阿里云一些需要 super privilege 的云上面,mydumper 需要加上 --no-locks 参数,否则会提示没有权限操作。

  • 使用 myloader 将之前导出的数据导入到 TiDB。

./bin/myloader -h 127.0.0.1 -P 4000 -u root -t 16 -q 1 -d ./var/test

说明:这里 -q 1 表明每个事务包含多少个 query,默认是 1000,我们这里使用 1 就可以了。

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

mysql -h127.0.0.1 -P4000 -uroot mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | t1 | | t2 | +----------------+ mysql> select * from t1; +----+------+ | id | age | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +----+------+ mysql> select * from t2; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | +----+------+

 

你可能感兴趣的:(数据库生态技术)