日期:2014-05-18  浏览次数:20374 次

求远程数据库同步最佳实践
上下文如下:

都是 SqlServer2005 企业版

A 数据库有大量费时的查询和修改操作,但是并发数很低
B 数据库只有查询,而且都是简单查询,但是同时并发比较多

两个库的数据可以完全一致(实际上A有几个表在B那边不需要,B也有几个表在A这边不需要, 可以只同步一部分当然减少数据传输是好的,不过那些表都是些接近字典之类的几乎不会改的表,就算全库完全同步也无所谓了)

A 对外是在一个ADSL下,没有固定IP
B 有固定公网IP 

可以组建VPN服务.

现在需要的是在A库做修改要同步到B, 延时方面要求比较松,哪怕一个小时或者半天延时都可以.当然实时最好.
A每天的更新和插入集中在一两张表但是很频繁,插入操作大约每天有几万次,更新操作十几万次,插入操作的单条数据含有NVarchar(Max)字段 ,每条记录平均大小约4k, 更新操作一般只更新一个数字(虽然这个记录比较大,但只更新一个数字字段)


两个服务器都有完全的访问权限,可以重做系统或安装各种辅助工具.


现在要问的是, 建议的最佳方式是什么样的? 比如如何发布订阅,注意什么? 是应该做成异地热备份的方式吗? 要复制数据好还是复制事务好? 还有其他更好的方式没? 



------解决方案--------------------
SQL code
--不同服务器数据库之间的数据操作(来自小F)
--************************************************************************************
1、--创建链接服务器 
exec sp_addlinkedserver   'ITSV', ' ', 'SQLOLEDB', '远程服务器名或ip地址 ' 
exec sp_addlinkedsrvlogin  'ITSV', 'false ',null, '用户名', '密码' 


2、启动两台服务器的MSDTC服务 
MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。

3、打开双方的135端口
MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。
使用“telnet IP 135”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放


4、--如要创建触发器   
create   trigger   t_test   on   test   
for   insert,update,delete   
as 
--加上下面两句,否则会提示新事务不能登记到指定事务处理器
set    xact_abort   on  
begin  distributed   tran 
    delete   from   openrowset('sqloledb','xz';'sa';'',test.dbo.test)   
    where   id   in(select   id   from   deleted)   
    insert   into   openrowset('sqloledb','xz';'sa';'',test.dbo.test)   
    select   *   from   inserted   
commit tran

--查询示例 
select * from ITSV.数据库名.dbo.表名 

--导入示例 
select * into 表 from ITSV.数据库名.dbo.表名 

--以后不再使用时删除链接服务器 
exec sp_dropserver  'ITSV ', 'droplogins '

------解决方案--------------------
探讨

关键点是 A 没有固定IP

------解决方案--------------------
1.快照复制,但建议数据库不要太大,同时对表的设计有些要求,并且IP不固定需要另外写程序实现;
2.日志传送,可以写代码从A拷贝到B,或者用A的服务,但会占用A的io。日志传送对数据库管理要求较高,传送时B会短时关闭,日志文件必须连续。
------解决方案--------------------
建议日志传送,这样传输的数据量最小。
参考:http://wenku.baidu.com/view/553911212f60ddccda38a06e.html
------解决方案--------------------
可以考虑通过新建Windows服务,利用多线程技术循环执行实时同步。。。
------解决方案--------------------
探讨
关键点是 A 没有固定IP

------解决方案--------------------
A 数据库有大量费时的查询和修改操作,但是并发数很低
B 数据库只有查询,而且都是简单查询,但是同时并发比较多

A-->B 在VPN環境可以採用同步复制, 向樓主這樣情況,採用一般的事务复制即可,可以在服务器闲时,同步数据。(如安排同步時間在每天23:00到第2天02:00之間)


------解决方案--------------------
如果是 单向复制、源表只增不删改且有id字段
这个我用程序做自动上传,用的挺不错
------解决方案--------------------
你这个数据量不大,可以用三层 模式进行同步。

大致思路是这样的,
新建一张表systable,里面存放 要更新(同步的表名)的表的名称,结构是 id,要更新的表的名称,count(这个字段有要是你要客户端更新的时候就+1)。


客户端登录软件的时候,如果本地没有数据库就创建数据库(可以是mdb,或其它),然后创建 systable 表,并将systable表的 数据同步到本地,再遍历 本地 systable表,依次创建 systable中要同步的表名,并从服务器中 将表中的数据同步下来,写入本地数据库中。这样就同步了数据。


下次再登录的时候,只要比对 服务端的 systable表 与 本地的 systable表 里要更新的表的记录是否一致(只要匹配systable表 count 的值即可),不一致 则 删除本地 相应的表,然后将服务器中对应的表的数据下载下来。即可。


不知道说清楚了没有···
------解决方案--------------------
很多人不看lz说的是什么,就回复了一堆。。。

你这个vpn的我没有试过,不过发布订阅认的是机器名+实例名,理论上讲只要在一个局域网里,就应该可以使用。
------解决方案--------------------