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

数据库同步
小弟想做一个数据库同步的功能,不知道有没有现有的数据库函数,或是怎么做。
求大神教我.....

------解决方案--------------------
--Merge表同步功能测试
--2010.10.28
--wgl
-------------------------------------------------------
--建立环境
IF OBJECT_ID('B1') IS NOT NULL DROP TABLE B1
IF OBJECT_ID('B2') IS NOT NULL DROP TABLE B2
GO
CREATE TABLE B1 (ID1 INT,VAL1 VARCHAR(50),l1 int,l2 int,l3 int)
CREATE TABLE B2 (ID2 INT,VAL2 VARCHAR(50),l1 int,l2 int,l3 int)
GO
INSERT INTO B1 VALUES(1,'A',1,1,1),(2,'B',2,2,2),(3,'C',3,3,3),(4,'D',4,4,4)
GO

--SELECT * FROM B1
--SELECT * FROM B2

--同步语句 Merge,T1与T2同步。
MERGE INTO B2 AS tb_target USING B1 AS tb_source ON tb_target.id2=tb_source.id1
WHEN NOT MATCHED BY TARGET THEN INSERT(id2,val2,l1,l2,l3) VALUES(id1,val1,l1,l2,l3) 
WHEN NOT MATCHED BY SOURCE THEN DELETE 
WHEN MATCHED  THEN UPDATE SET tb_target.val2=tb_source.val1 --AND tb_target.val2<>tb_source.val1
OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,DELETED.l1,DELETED.l2,DELETED.l3,INSERTED.VAL2,INSERTED.l1,INSERTED.l2,INSERTED.l3;

--输出结果:
/*
%ACTION ID  VAL2   VAL2
----------------------
INSERT 1 NULL A
INSERT 2 NULL B
INSERT 3 NULL C
*/
--T2 内容:
/*
ID2 VAL2
--------
1 A
2 B
3 C
*/
--这说明T1的数据已经同步到T2了。现在做一些其他操作,修改,更新,插入,删了。

UPDATE B1 SET VAL1='E' WHERE ID1=2
GO
DELETE FROM B1 WHERE ID1 =3
GO
INSERT B1 VALUES (5,'F',5,5,5)
GO
UPDATE B1 SET l3=99999 WHERE ID1=4
GO
SELECT * FROM B1
SELECT * FROM B2
--结果:
/*
ID1 VAL1
--------
1 A
2 E
5 F
*/

--修改之后,再运行MERGE语句。
MERGE INTO B2 AS tb_target USING B1 AS tb_source ON tb_target.id2=tb_source.id1
WHEN NOT MATCHED BY TARGET THEN INSERT(id2,val2,l1,l2,l3) VALUES(id1,val1,l1,l2,l3)  --如果与源表不匹配,则插入
WHEN NOT MATCHED BY SOURCE THEN DELETE --如果源表没有,则删除
WHEN MATCHED  THEN UPDATE SET tb_target.val2=tb_source.val1,tb_target.l1=tb_source.l1,tb_target.l2=tb_source.l2,tb_target.l3=tb_source.l3 --AND tb_target.val2<>tb_source.val1  全部更新
OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,DELETED.l1,DELETED.l2,DELETED.l3,INSERTED.VAL2,INSERTED.l1,INSERTED.l2,INSERTED.l3;

--执行结果:
/*
$ACTION ID VAL2 VAL2
------------------------
INSERT 5 NULL F
UPDATE 2 B E
DELETE 3 C NULL
*/

--查询T2的内容:
/*
ID2 VAL2
--------
1 A
2 E
5 F

*/
--T2 的内容已经正明同步了。

------解决方案--------------------
SQLServer本身的高可用性(HA)不就可以吗
1)集群
2)镜像
3)日志传送
4)发布订阅
------解决方案--------------------
网上搜索下数据库复制吧.一个数据库做发布,另外一个数据库做订阅.可以实现的.
------解决方案--------------------
针对你这个应用,sqlserver群集是最简单的解决方案,以下仅提供个思路
1.通过群集增加高可用性
2.对数据库经常备份