前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ticmp MySQL和TIDB的兼容性评估

ticmp MySQL和TIDB的兼容性评估

原创
作者头像
保持热爱奔赴山海
发布2024-04-06 22:24:35
870
发布2024-04-06 22:24:35
举报
文章被收录于专栏:数据库相关

ticmp 主要用于MySQL和TIDB的兼容性评估。

注意: 不推荐把它用于其他数据比对场景, 因为它会转发经过它的全部指令到第二个数据源(也就是update insert delete也下发了,如果2个数据库有配置了数据复制,则可能造成复制链路的中断! (当然如果配的第二个数据源的账号权限是只读的,那么也可以用ticmp来验证一些查询结果的差异性比对,但是这个结果的准确性会受到复制链路的延迟的很大的影响,仅供参考而已)

代码仓库:https://github.com/lonng/ticmp

相关案例: https://tidb.net/blog/a8748acb

当前,越来越多客户尝试将他们自己的业务从 MySQL 数据库迁移到 TiDB 中,但在迁移之前,客户都会进行兼容性的评估。虽然 TiDB 是一个 MySQL 协议兼容的数据库,但仍然有一些行为是跟 MySQL 不一样的。所以如何能更快的让客户知道他们自己的业务在哪些功能上面会有 MySQL 和 TiDB 不一致的地方,我们就能更快的去调整 TiDB 的行为或者去更改客户业务。

为了快速的定位到到底是哪一条 SQL 在 TiDB 和 MySQL 里面行为不一致,Henry Lonng 快速的构建了一个ticmp(github.com/lonng/ticomp)工具来进行验证。

原理非常的简单:

- ticmp 会将自己模拟成一个 MySQL server

- 应用程序,譬如 Corteza 将 SQL 发给 ticmp 之后

- ticmp 将 SQL 同时发给 MySQL 和 TiDB,并将两边的结果进行对比,并输出到一个控制台或者 csv 文件中

- ticmp 将 MySQL 的结果返回给应用,因为通常这些应用都是 MySQL 兼容的,所以能继续执行

- 我们直接看对比结果,就能知道哪一条 SQL 在 TiDB 和 MySQL 是不兼容的了

使用方法

下载代码后执行

代码语言:shell
复制
go build

即可

命令参数

代码语言:shell
复制
$ ./ticmp --help
Usage:
  ticmp [flags]

Flags:
  -P, --port int               Listen port of TiCmp shadow server (default 5001)
      --user string            TiCmp shadow server user name (default "root")
      --pass string            TiCmp shadow server password
      --html string            Output compare to specified html file
      --csv string             Output compare to specified csv file
      --mysql.host string      MySQL server host name (default "127.0.0.1")
      --mysql.port int         MySQL server port (default 3306)
      --mysql.user string      MySQL server user name (default "root")
      --mysql.pass string      MySQL server password
      --mysql.name string      MySQL server database name
      --mysql.options string   MySQL server connection options (default "charset=utf8mb4")
      --tidb.host string       TiDB server host name (default "127.0.0.1")
      --tidb.port int          TiDB server port (default 4000)
      --tidb.user string       TiDB server user name (default "root")
      --tidb.pass string       TiDB server password
      --tidb.name string       TiDB server database name
      --tidb.options string    TiDB server connection options (default "charset=utf8mb4")
  -h, --help                   help for ticmp

示例

在控制台输出结果

代码语言:shell
复制
会话1:
$ ./ticmp --user root  --pass root --mysql.host 127.0.0.1 --mysql.port 3306 --mysql.user  dts --mysql.pass dts --mysql.name  sbtest  --tidb.host 192.168.31.181  --tidb.port 8200 --tidb.user dts --tidb.pass dts --tidb.name  sbtest --csv
Serve successfully (mysql -h 127.0.0.1 -P 5001 -uroot -p)

会话2:
另开一个mysql客户端,mysql -h 127.0.0.1 -P 5001 -uroot -proot 登录到 ticmp ,模拟一些业务操作

当有请求进到ticmp中时候, ticmp的控制台界面会看到类似如下:

代码语言:shell
复制
Serve successfully (mysql -h 127.0.0.1 -P 5001 -uroot -p)
127.0.0.1:3536 [MySQL 5.967007ms, TiDB 1.234485ms] ==> select * from sbt2 ()
127.0.0.1:3536 MySQL >
+-----------+
| a   | b   |
+-----------+
| 44  | bcd |
| 222 | abc |
| 333 | bcd |
+-----------+
127.0.0.1:3536 TiDB  >
+-----------+
| a   | b   |
+-----------+
| 222 | abc |
| 333 | bcd |
+-----------+


127.0.0.1:3536 [MySQL 1.985635ms, TiDB 2.285895ms] ==> show tables ()
127.0.0.1:3536 MySQL >
+------------------+
| tables_in_sbtest |
+------------------+
| sbt1             |
| sbt2             |
| sbtest1          |
| sbtest2          |
| sbtest3          |
| sbtest4          |
| sbtest5          |
| sbtest6          |
| sbtest7          |
| sbtest8          |
| sbtest9          |
+------------------+
127.0.0.1:3536 TiDB  >
+------------------+
| tables_in_sbtest |
+------------------+
| sbt1             |
| sbt2             |
| sbtest1          |
+------------------+



127.0.0.1:3536 [MySQL 1.237618ms, TiDB 1.101429ms] ==> select * from sbt1 where id<=222 ()   -- 结果集相同,则不会输出结果明细

127.0.0.1:3536 [MySQL 514.341µs, TiDB 1.06104ms] ==> select * from sbt1 where id<=2222 ()
127.0.0.1:3536 MySQL >
+-----+
| id  |
+-----+
| 222 |
| 345 |
| 567 |
| 789 |
+-----+
127.0.0.1:3536 TiDB  >
+-----+
| id  |
+-----+
| 222 |
+-----+

如果要将结果存到csv文件中,可以使用

代码语言:shell
复制
./ticmp --csv out.csv --user root  --pass root --mysql.host 127.0.0.1 --mysql.port 3306 --mysql.user  dts --mysql.pass dts --mysql.name  sbtest  --tidb.host 192.168.31.181  --tidb.port 8200 --tidb.user dts --tidb.pass dts --tidb.name  sbtest

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用方法
  • 示例
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档