两台数据库服务器之间的数据进行相互同步,初步设想是这样的,大家都不妨拿出自己的意见。一起讨论讨论。。
前提:服务器: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、创建每小时执行的作业,调用存储过程。。