背景

不管是是研发同学还是测试同学,日常跟进线上问题时对如下两个场景应该都很熟悉:

  • 生产环境上出现了一个bug,想在测试环境或者本地开发环境复现这个bug,而这个bug又与特定数据相关;
  • 在本地开发环境修复了线上bug,想用线上最新特定场景的数据验证下bug是否修复成功。

在这两种情况下,都需要将生产环境的数据导入到本地环境。那么怎么进行导入呢?

说到这里,也许已经勾起了你的一把辛酸泪。通常对于这种情况都是这么做的:

  • 同步整个生产环境数据库到本地
  • 利用某些数据库管理软件(如Navicat)同步指定场景相关的几张数据表到本地

不管是采用以上哪种方式,由于线上数据库数据通常都很大,因此都会导致如下几个痛点:

  • 同步时间非常长,每同步一次都要耗费很多时间进行等待,效率极其低下
  • 同步数据量非常大,但绝大多数的数据都是不关注的
  • 对于像我这样本地笔记本电脑总共只有128GB SSD,空闲容量不足5GB的屌丝,想同步都做不到啊

解决方案

要解决以上问题,其实从原理上讲很简单,就是只同步我们想要的数据,不多一条,也不少一条,刚刚好!

以UC浏览器的性能测试平台UCTC为例,某个测试任务出现异常后,我们想要拿到这个任务相关的所有数据在本地开发环境进行复现调试。单个测试任务相关的数据分布在各个数据库表中,包括任务信息、测试用例、测试设备、测试包、原始测试数据等等。

不难看出,虽然只是一个测试任务,但其相关的数据分布在近10张表中,各张表的数据量从几百到几十万不等。而我们要刚好同步相关数据的意思就是,在测试任务相关的每张表里面,只将特定测试任务的相关数据提取出来,并导入到我们的本地开发环境。这样的话,我们每次只需要同步很少的数据,同步操作基本上可以实现瞬间完成。

如果能有这样的工具,那么前面提到的几个痛点都将不复存在,我们的工作效率必将得到极大的提升。

然而遗憾的是,经过漫长的搜索,发现目前市面上都还没有这样的工具。大多数数据库管理工具只能提供数据库的手动导出和导入整张数据表的功能,即使有些做得更便捷的,也仅限于实现两个数据库的数据同步功能,这些都不能满足我们的期望。

痛点是实实在在的,而又没有可用的工具,那么就这样忍了么?当然不行,We build things!

线上数据采摘工具(ProductionDataPicker)就此诞生了!

to be continued …