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 是不兼容的了
下载代码后执行
go build
即可
命令参数
$ ./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
在控制台输出结果
会话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的控制台界面会看到类似如下:
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文件中,可以使用
./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 删除。