MySQL数据库同步工具的设计与实现

一、背景

  在测试过程中,对于不同的测试团队,出于不同的测试目的,我们可能会有多套测试环境。在产品版本迭代过程中,根据业务需求,会对数据库的结构进行一些修改,如:新增表、字段、索引,修改表、字段索引等操作,在一些流程不规范的公司,开发人员不按照规范操作,不及时将这些修改数据库的 SQL 提交到 SVN/Git,当修改后的业务代码部署到新环境时就会引起错误,从而影响测试效率。换个角度再说,就算流程规范的大公司,核心业务都采取分库分表的架构,上千张表难道我们都采用手工执行 SQL 的方式去添加和修改字段吗?这样当然不妥,也许会有同学想到,我们可以采取使用脚本语言的方式批量更新和修改对应数据库,这样也是一种方式,但这种情况的前提是执行人员非常清楚两个数据库的差异,如果执行人员自己也不清楚两个数据库之间的差异呢?可能有的同学又想到可以把源数据库的结构和数据都导入到目标数据库当中,这样就解决了。这样看似可行,但实际不妥。前面我们说了,有多套测试环境,他们的作用可能不一样,举个例子:测试环境用于内部测试,联调环境用于和外部系统的联调,如果我们把测试环境的数据库结构和所有数据都导入联调环境,那么联调环境原有的数据不存在了,无法再和外部进行联调了,所以这也不是一种好的方式。

  基于以上种种原因,一个数据库结构同步工具貌似是一个比较好的解决方案。

二、实现功能

基于以上的分析,该工具需要实现以下三个功能

  • 分析(diff):分析源数据库和目标数据库结构上的差异,在执行同步和拷贝前建议先执行分析来确定源数据库和目标数据库的差异;
  • 同步(sync):只同步数据库的结构,不同步数据;
  • 拷贝(copy): 对于数据没有要求的情况,可以直接使用拷贝将源数据库的数据库结构和数据全部导入目标数据库;

三、实现思路

具体流程如下:

  • 对传入指令进行解析,包括:源数据库和目标数据库的 IP、端口、用户名、密码、数据库名以及执行动作(diff、sync、copy);
  • 分析 db,执行 SQL;
  • 分析 db 下的表,执行 SQL;
  • 分析表的字段和索引,执行 SQL;

四、分析过程

我们要对数据库的结构进行比对和分析,包括:数据库、数据库下面表、表中的字段和索引,那具体我们应该如何来进行分析和比对呢?

既然我们要做的是MySQL数据库的同步工具,那么我们对 MySQL 数据库就需要有深入一点的了解。在MySQL中,把 INFORMATION_SCHEMA 看作是一个数据库,确切说是信息数据库。其中保存着关于当前 MySQL 服务器所维护的所有其他数据库的信息。如数据库名,数据库的表、表的字段与索引以及访问权限等等。所以我们应该关注的是 INFORMATION_SCHEMA 中的以下几张表:

扫描二维码关注公众号,回复: 7463641 查看本文章
  • SCHEMATA:提供了当前mysql实例中所有数据库的信息。SHOW DATABASES 的结果取之此表;
  • TABLES:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个 schema,表类型,表引擎,创建时间等信息。SHOW TABLES FROM SCHEMANAME的结果取之此表;
  • COLUMNS:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。SHOW COLUMNS FROM SCHEMANAME.TABLENAME 的结果取之此表;
  • STATISTICS:提供了关于表索引的信息。SHOW INDEX FROM SCHEMANAME.TABLENAME 的结果取之此表;

关键 SQL:

  • SELECT * FROM SCHEMATA WHERE SCHEMA_NAME='XXX';
  • SELECT * FROM TABLES WHERE TABLE_SCHEMA='XXX' AND TABLE_NAME='XX';
  • SELECT * FROM COLUMNS WHERE TABLE_SCHEMA='XXX' AND TABLE_NAME='XX';
  • SELECT * FROM STATISTICS WHERE TABLE_SCHEMA='XXX' AND TABLE_NAME='XX';

五、代码实现

六、问题

猜你喜欢

转载自www.cnblogs.com/L-Test/p/11668928.html