MongoDB/SQL Server增量同步方案

发表于:2016-5-25 09:56

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:海-飞    来源:51Testing软件测试网采编

#
SQL
分享:
  由于SQL Server的特殊性,目前市面上没有成熟开源的SQL Server/MongoDB同步软件,可行方案需要采用软件编写的方式才能实现该功能。通过调研,总结3种可行方法。依据采用的原理不同分为如下方法:依据时间戳更新数据、通过触发器更新数据以及SQL Server特有的CDC(change data capture)机制更新数据。本文针对公司的数据库同步需求,首先介绍3种方法的优缺点,然后提出其中最可行的解决方案。
  1、方法比较
  · 时间戳
  参考数据库表中的更新时间字段,依据此字段判断是否需要更新到MongoDB。优点是对原数据库改动较小。但缺点是原平台数据库大部分表没有记录更新时间的字段。实现的难度有原有系统不是每个表都有更新时间字段,如果没有更新时间字段需要重新设计表添加该字段。
  · 触发器
  创建数据库触发器,将更新数据存放到临时表,MongoDB读取临时表。优点是能高度自定义更新条件以及更新字段。缺点是开销大,过多触发器设计、创建、更新、管理的工作。需要进行大量的设计与管理工作,开销较大。
  · 触发器
  数据库服务器开启CDC功能,MongoDB端只需从cdc相关表中获取更新数据。对原数据库改动最小,只需开启功能。但SQL Server自有的功能,安装以及开源工具太少。该功能开源工具较少,只能通过编写查询语句获得更新数据,以及已更新数据的处理。
  如上述比较可见,CDC方法为工作量相对较小的方法,下面简单介绍该方法的处理流程。
  2、CDC处理流程
  如流程图可见,CDC的大部分的数据更新比较在SQL Server内部处理完成。MongoDB(Data warehouse端)只需获得更新数据,其中数据的提取、转换通过Nodejs脚本来完成。 下面以alarmos数据库的aaaaaabbbbbb表为例,描述CDC的处理流程。
  · 开启CDC功能
  CDC的功能开启在SQL Server端执行T-SQL语句。
  USE alarmos
  GO
  EXEC sys.sp_cdc_enable_db
  GO
  执行成功后会在系统表内出现3个与cdc相关的表(schema为cdc)。
  · 追踪表的配置
  这一步开启针对表的更新追踪功能。
  USE alarmos
  GO
  EXEC sys.sp_cdc_enable_table
  @source_schema = 'dbo',
  @source_name = 'aaaaaabbbbbb',
  @role_name = 'sa'
  GO
  @source schema、@source name为定义追踪的数据表,@role_name为指定可获取CDC数据的用户。成功设置的判断是表值函数当中出现了相关项。
  · 获取更新数据
  这一步应该通过脚本实现,但为了方便表述,还是采用运行T-SQL语句。采用的是调用fn cdc get all changes dbo aaaaaabbbbbb()函数。首先成功修改数据(这里插入了一条新数据),然后调用该函数查看更新数据的结果。
  USE alarmos
  select @begin_lsn = sys.fn_cdc_get_min_lsn('dbo_aaaaaabbbbbb)
  select @end_lsn = sys.fn_cdc_get_max_lsn()
  select * from cdc.fn_cdc_get_all_changes_dbo_Customer(@begin_lsn, @end_lsn, 'all');
  运行命令后可以看到如下查询结果,可见新插入的数据能够成功捕获。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号