日期:2014-05-17  浏览次数:20534 次

sqlserver2008数据实时同步技术实测总结,高分求解。
以前一直使用第三方软件进行数据库同步。现在希望研究尝试一下使用sqlserver2008本身的功能进行同步,前几天发了几个帖子,实测了一下,遇到很多问题。

以下是应用场景描述:
1.远程服务器A,B,C等若干(可能上百个),各自的库为a,b,c等均拥有独立IP。数据库是sqlserver2008或Mysql。
2.本地服务器M,汇总库m1,数据库是sqlserver2008。
3.远程服务器中的数据量较大,最多的一个表中的数据平均80万条左右,而且还在以每分钟数十条的速度增加。
目标:将远程服务器数据汇总到本地服务器m1库中。要求本地服务器库m1中的数据与远程服务器中的数据保持同步,延迟控制在5分钟之内。

解决方法一:快照订阅
在远程A,B,C若干服务器中建立快照发布(Mysql库暂时除外),在本地服务器M中建立对应的a1,b1,c1若干库,然后建立a-a1,b-b1,c-c1这样的订阅。然后在在本地通过定时作业,将a1,b1,c1若干库数据汇总到一个中心库中m1。
测试结果:
测试没有进行完成,应为测到一半就没法测了。原因是为保证实时同步,远程服务器的发布频率定在30秒一次,结果远程服务器开销过大(远程服务器同时要采集数据不停的写入)。而且,同步上来后,还要多个步骤进行本地话处理,将若干个订阅库中的数据汇总到m1中,这样整个过程用时超过5分钟。另外,Mysql的远程库无法和sqlserver进行订阅。

解决方法二:DBLink
在本地服务器M中新建作业,在作业中建立与远程服务器的连接,然后用sql语句提取需要的数据插入本地m1中。
测试结果:可以同时提取mysql和sqlserver数据,开销也不算大,也省去了汇总的步骤,可直接将需要的数据插入m1。但是,sql语句执行效率低下。一个远程库中70万条数据,一次insert into select 语句就要执行20分钟,跟新20条数据再执行一次用时30分钟。似乎越来越慢。以下是sql语句:
insert into Test.dbo.Detect 
select a.* 
from CServer.test1.dbo.Detect1 a
left join Test.dbo.Detect b on a.[主键]=b.[主键]
where b.[主键] is null


最终我还是倾向对第二种方法的优化。怎么才能提高数据更新的速度??或者有其他解决方法?

------解决方案--------------------
插入分批。按你M1的主键排好顺序再插入。把M1表非聚集索引先禁用。插入后再重建。
更新必须得索引。
------解决方案--------------------
首先,不能能每次都要全部导,那么增量是最好的办法,如何得自每次的增量,需要其他的技术;一定要增量,这是大方向。
------解决方案--------------------
我的复制订阅(事务)5亿多数据每天产生300多万条数据 时间延迟是5秒 。使用的是 SQL SERVER 2008 企业版。自身提供的复制订阅功能

数据的延迟原因有很多种,和硬件 网络等都有很大的关系。就想楼上说的那样,一定要增量执行(SQL server 就是增量),有些第三方工具提供 增量和 每次全表 执行两种功能(DBMOTO). 如果慢一定要定位是哪个环节慢。 另外 复制订阅 里有很多参数是可以修改的,这样可以提高速度。找资料多研究研究。
------解决方案--------------------
仅供参考:
我们公司是这样处理的,凡是需要同步的数据表,都有一个自增字段。
比如远程服务器A数据库A1数据表A11,本地服务器M数据库M1数据表M11。
我们在M做链接服务器到A,然后在M建立一个自动作业,每次先读取M里M11表自增字段最大值,然后通过链接服务器读取A里A11表比这个最大值大的记录,并且根据A11表实际工作状态,每次只插入500条,如果不到500条也无所谓。例如:

declare @no int
select @no=max(id) from M11  --先获取自增字段最大值

insert into M11 select top 500 * from 链接服务器名.A.dbo.A11 where id>=@no

然后我们设置该自动作业每一小时执行一次。
楼主可以根据你们业务的实际情况进行调整。