关于两台服务器之间的数据相互同步问题。大家进来讨论讨论

pt1314917 2008-08-01 11:51:39
加精

两台数据库服务器之间的数据进行相互同步,初步设想是这样的,大家都不妨拿出自己的意见。一起讨论讨论。。
前提:服务器:A , B
表:t_p,t_p
主键:id , id
另外t_p都有7、8个子表。所以在同步主表数据的同时,还要同步子表数据
两表结构完全一样。两表数据都是百万级,每天以4W的速度递增。。。

方案:
1、建立一个同步表S_p(id,statu),statu说明:1表示需要同步,0表示不需要同步,也就是已经同步过了。
2、在t_p表上建立触发器,当t_p表发生insert、update操作时,将发生变更的数据的id存入同步表中,并设置其statu为1,
3、创建同步存储过程,
CREATE PROCEDURE Up_Syn_Data
AS
BEGIN
--定义表变量用来存储从S_p中取出来的id,这里定义表变量的目的主要是为了保持子表数据的同步,因为子表也有触发器,也有对应的同步表,为了防止同步时子表数据比主表多,所以将主表id存入表变量中。
declare @idS table(Id uniqueidentifier)
--将同步表中需要同步的id存入表变量中,
insert into @idS select id from S_P where Status!=0
begin tran

--更改同步表中对应id的状态
update S_P set Statu=0 from S_P a,@idS b
where a.Id=b.Id

------------更新T_P表数据-------------
--更改T_P_Order表状态,使触发器对下面所同步数据不处理
exec Up_UpdateStatus 'T_P','1'
--通过链接服务器往对应的T_P表中插入数据
insert into HJZX_SYN.HJZX2.dbo.T_P
select b.* from @idS a left join T_P b
on a.Id=b.Id
--该表同步完成
exec Up_UpdateStatus 'T_P','0'
--------------------------------------------

------------更新子表T_P_Insure表数据-------------
exec Up_UpdateStatus 'T_P_Insure','1' --这个存储过程是为了标志该表插入数据,不需要触发。
--通过链接服务器往对应的T_P_Insure表中插入数据
insert into HJZX_SYN.HJZX2.dbo.T_P_Insure
select b.* from @idS a left join T_P_Insure b
on a.Id=b.Id
--该表同步完成
exec Up_UpdateStatus 'T_P_Insure','0'
--------------------------------------------
下面子表同步操作一样,另外事务提交回滚等就不写了。
end
4、创建每小时执行的作业,调用存储过程。。
...全文
4170 151 打赏 收藏 转发到动态 举报
写回复
用AI写文章
151 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanyuchonglou 2012-02-07
  • 打赏
  • 举报
回复
[Quote=引用 94 楼 pt1314917 的回复:]
我是楼主,楼上有很多人提到了相互同步会不会出现死锁现象,因为两台服务器所操作的数据是完全不一样的,所以不可能会出现对同一条数据进行更新的情况,也不会出现死锁,现在只是一个简单的将两边的数据相互同步而已。。另外实时性要求也不是特别高,每小时更新一次就可以了。。
可总是无法启动分布式事务。。
[/Quote]

写程序要象我一样有崇高的职业道德、与珠穆朗玛峰一样高的做人底线,你把同步的处理放在插入TRIIGER中不就可以实现即时同步了吗?而且每次的数据量小了,成功率也会高一些的。
路人呵呵 2011-04-17
  • 打赏
  • 举报
回复
强烈关注 @_@

楼主真有分
qq1598290008 2011-01-02
  • 打赏
  • 举报
回复
自带的功能就够用了,你没必要那么复杂。
tallen2005 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xiaomeixiang 的回复:]
2005的复制弄过,但2000和2005这样不同环境的没弄过。。。
[/Quote]

单向复制2K-05没问题,双向有问题。
wangsaiming 2010-11-22
  • 打赏
  • 举报
回复
学习了哈,都挺强悍的
liuqiansubo 2010-09-06
  • 打赏
  • 举报
回复
markrrrrrrrrrrrrr
shangdaoxi 2010-08-09
  • 打赏
  • 举报
回复
做个记号,
zc_0101 2009-08-11
  • 打赏
  • 举报
回复

--已阅
SELECT GETDATE()
/*
2009-08-11 16:00:45.640
*/
zheninchangjiang 2008-10-05
  • 打赏
  • 举报
回复
使用可更新订阅的事务复制(排队更新订阅)
立即更新订阅需要使用msdtc,排队更新是使用复制启动的作业,比较简单.
你写的那些脚本基本上就是可列新订阅的事务的原型了.

CS-ZJ 2008-08-29
  • 打赏
  • 举报
回复
自己这两天正在做数据库同步,学习中...
wwwprogramer 2008-08-28
  • 打赏
  • 举报
回复
收藏了,慢慢学习
pt1314917 2008-08-25
  • 打赏
  • 举报
回复
结帖了。分布式事务的问题未解决。
用windows服务代替了。。。
kevingarnett01 2008-08-20
  • 打赏
  • 举报
回复
高深,学习...
ycqhg 2008-08-08
  • 打赏
  • 举报
回复
分布式事务到底怎么解决啊???我按照解决的步骤,都完成了,就是出现无法执行该操作,因为链接服务器 "srv_lnk" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。
要郁闷死了!
czglover 2008-08-06
  • 打赏
  • 举报
回复
正在做这个,学习ing!
Garnett_KG 2008-08-06
  • 打赏
  • 举报
回复
这么多天了,lz你的分布式事务解决了没有
zoujp_xyz 2008-08-06
  • 打赏
  • 举报
回复
jf
kenryu3450 2008-08-06
  • 打赏
  • 举报
回复
学习 蹭分~
nalnait 2008-08-06
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 zj101582 的回复:]
留下记号,好好学习
[/Quote]
stromboy007 2008-08-06
  • 打赏
  • 举报
回复
学习
加载更多回复(131)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧