复制的概念 复制是将一组 数据 从一个 数据 源拷贝到多个 数据 源的技术,是将一份 数据 发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份 数据 发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份 数据 。复制技
复制的概念
复制是将一组 数据 从一个 数据 源拷贝到多个 数据 源的技术,是将一份 数据 发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份 数据 发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份 数据 。复制技术可以确保分布在不同地点的 数据 自动 同步 更新,从而保证 数据 的一致性。
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 点执行
查看更多关于两台SQLServer数据同步解决方案(推荐)的详细内容...