两台SQL Server数据同步解决方案

本文详细介绍了SQL Server的数据复制技术,包括快照复制、事务复制和合并复制等三种类型,并通过具体步骤指导如何配置出版服务器、创建出版物及设计订阅。
转:http://www.cnblogs.com/nbwzy/archive/2007/04/30/732922.html

复制的概念
  
  复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。
  
  SQL复制的基本元素包括
  
  出版服务器、订阅服务器、分发服务器、出版物、文章
  
  SQL复制的工作原理
  
  SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器
  
  SQL SERVER复制技术类型
  
  SQL SERVER提供了三种复制技术,分别是:
  
  
1 、快照复制(呆会我们就使用这个)
  
2 、事务复制
  
3 、合并复制
  
  只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。
  
  第一先来配置出版服务器
  
  (
1 )选中指定 [ 服务器 ] 节点
  (
2 )从 [ 工具 ] 下拉菜单的 [ 复制 ] 子菜单中选择 [ 发布、订阅服务器和分发 ] 命令
  (
3 )系统弹出一个对话框点 [ 下一步 ] 然后看着提示一直操作到完成。
  (
4 )当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库(distribution)
  
  第二创建出版物
  
  (
1 )选中指定的服务器
  (
2 )从 [ 工具 ] 菜单的 [ 复制 ] 子菜单中选择 [ 创建和管理发布 ] 命令。此时系统会弹出一个对话框
  (
3 )选择要创建出版物的数据库,然后单击 [ 创建发布 ]
  (
4 )在 [ 创建发布向导 ] 的提示对话框中单击 [ 下一步 ] 系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
  (
5 )单击 [ 下一步 ] 系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行"SQL SERVER  2000 "的数据库服务器
  (
6 )单击 [ 下一步 ] 系统就弹出一个定义文章的对话框也就是选择要出版的表
  (
7 )然后 [ 下一步 ] 直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。
  
  第三设计订阅
  
  (
1 )选中指定的订阅服务器
  (
2 )从 [ 工具 ] 下拉菜单中选择 [ 复制 ] 子菜单的 [ 请求订阅 ]
  (
3 )按照单击 [ 下一步 ] 操作直到系统会提示检查SQL SERVER代理服务的运行状态,执行复制操作的前提条件是SQL SERVER代理服务必须已经启动。
  (
4 )单击 [ 完成 ] 。完成订阅操作。
  
  完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:
00 :00和23: 59 :59之间。接下来就是判断复制是否成功了打开C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表—

一个手工同步的方案
  
  
-- 定时同步服务器上的数据
  
  
-- 例子:
  
  
-- 测试环境,SQL Server2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test
  
  
-- 服务器上的表(查询分析器连接到服务器上创建)
  
  
create   table   [ user ] (id  int   primary   key , number   varchar ( 4 ),name  varchar ( 10 ))
  
go
  
  
-- 以下在局域网(本机操作)
  
  
-- 本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
  
  
if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [user] ' and   OBJECTPROPERTY (id, N ' IsUserTable ' =   1 )
  
drop   table   [ user ]
  
GO
  
create   table   [ user ] (id  int   identity ( 1 , 1 ), number   varchar ( 4 ),name  varchar ( 10 ),state  bit )
  
go
  
  
-- 创建触发器,维护state字段的值
  
  
create   trigger  t_state  on   [ user ]
  after 
update
  
as
  
update   [ user ]   set  state = 1
  
from   [ user ]  a  join  inserted b  on  a.id = b.id
  
where  a.state  is   not   null
  
go
  
  
-- 为了方便同步处理,创建链接服务器到要同步的服务器
  
  
-- 这里的远程服务器名为:xz,用户名为:sa,无密码
  
  
if   exists ( select   1   from  master..sysservers  where  srvname = ' srv_lnk ' )
  
exec  sp_dropserver  ' srv_lnk ' , ' droplogins '
  
go
  
exec  sp_addlinkedserver  ' srv_lnk ' , '' , ' SQLOLEDB ' , ' xz '
  
exec  sp_addlinkedsrvlogin  ' srv_lnk ' , ' false ' , null , ' sa '
  
go
  
  
-- 创建同步处理的存储过程
  
  
if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[p_synchro] ' and   OBJECTPROPERTY (id, N ' IsProcedure ' =   1 )
  
drop   procedure   [ dbo ] . [ p_synchro ]
  
GO
  
create   proc  p_synchro
  
as
  
-- set XACT_ABORT on
  
  
-- 启动远程服务器的MSDTC服务
  
  
-- exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output
  
  
-- 启动本机的MSDTC服务
  
  
-- exec master..xp_cmdshell 'net start msdtc',no_output
  
  
-- 进行分布事务处理,如果表用标识列做主键,用下面的方法
  
  
-- BEGIN DISTRIBUTED TRANSACTION

-- 同步删除的数据
  
  
delete   from  srv_lnk.test.dbo. [ user ]
  
where  id  not   in ( select  id  from   [ user ] )
  
  
-- 同步新增的数据
  
  
insert   into  srv_lnk.test.dbo. [ user ]
  
select  id, number ,name  from   [ user ]   where  state  is   null
  
  
-- 同步修改的数据
  
  
update  srv_lnk.test.dbo. [ user ]   set
  
number = b. number ,name = b.name
  
from  srv_lnk.test.dbo. [ user ]  a
  
join   [ user ]  b  on  a.id = b.id
  
where  b.state = 1
  
  
-- 同步后更新本机的标志
  
  
update   [ user ]   set  state = 0   where   isnull (state, 1 ) = 1
  
-- COMMIT TRAN
   go
  
  
-- 创建作业,定时执行数据同步的存储过程
  
  
if   exists ( SELECT   1   from  msdb..sysjobs  where  name = ' 数据处理 ' )
  
EXECUTE  msdb.dbo.sp_delete_job  @job_name = ' 数据处理 '
  
exec  msdb..sp_add_job  @job_name = ' 数据处理 '
  
  
-- 创建作业步骤
  
  
declare   @sql   varchar ( 800 ), @dbname   varchar ( 250 )
  
select   @sql = ' exec p_synchro '   -- 数据处理的命令
  , @dbname = db_name ()  -- 执行数据处理的数据库名
   exec  msdb..sp_add_jobstep  @job_name = ' 数据处理 ' ,
  
@step_name   =   ' 数据同步 ' ,
  
@subsystem   =   ' TSQL ' ,
  
@database_name = @dbname ,
  
@command   =   @sql ,
  
@retry_attempts   =   5 -- 重试次数
   @retry_interval   =   5   -- 重试间隔
  
  
-- 创建调度
  
  
EXEC  msdb..sp_add_jobschedule  @job_name   =   ' 数据处理 ' ,
  
@name   =   ' 时间安排 ' ,
  
@freq_type   =   4 -- 每天
   @freq_interval   =   1 -- 每天执行一次
   @active_start_time   =   00000   -- 0点执行
   go
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值