复制的概念
复制是将一组数据从一个数据源拷贝到多个数据源的技术是将一份数据发布到多个存储站点上的有效方式使用复制技术用户可以将一份数据发布到多台服务器上从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据复制技术可以确保分布在不同地点的数据自动同步更新从而保证数据的一致性
SQL复制的基本元素包括
出版服务器订阅服务器分发服务器出版物文章
SQL复制的工作原理
SQL SERVER 主要采用出版物订阅的方式来处理复制源数据所在的服务器是出版服务器负责发表数据出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器分发服务器包含有一个分发数据库可接收数据的所有改变并保存这些改变再把这些改变分发给订阅服务器
SQL SERVER复制技术类型
SQL SERVER提供了三种复制技术分别是
快照复制(呆会我们就使用这个)
事务复制
合并复制
只要把上面这些概念弄清楚了那么对复制也就有了一定的理解接下来我们就一步一步来实现复制的步骤
第一先来配置出版服务器
()选中指定[服务器]节点
()从[工具]下拉菜单的[复制]子菜单中选择[发布订阅服务器和分发]命令
()系统弹出一个对话框点[下一步]然后看着提示一直操作到完成
()当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器同时也生成一个分发数据库(distribution)
第二创建出版物
()选中指定的服务器
()从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令此时系统会弹出一个对话框
()选择要创建出版物的数据库然后单击[创建发布]
()在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框对话框上的内容是复制的三个类型我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
()单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型SQLSERVER允许在不同的数据库如 ORACLE或ACCESS之间进行数据复制但是在这里我们选择运行SQL SERVER 的数据库服务器
()单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
()然后[下一步]直到操作完成当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库
第三设计订阅
()选中指定的订阅服务器
()从[工具]下拉菜单中选择[复制]子菜单的[请求订阅]
()按照单击[下一步]操作直到系统会提示检查SQL SERVER代理服务的运行状态执行复制操作的前提条件是SQL SERVER代理服务必须已经启动
()单击[完成]完成订阅操作
完成上面的步骤其实复制也就是成功了但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生每一分钟在和之间接下来就是判断复制是否成功了打开C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表—
一个手工同步的方案
定时同步服务器上的数据
例子:
测试环境SQL Server远程服务器名:xz用户名为:sa无密码测试数据库:test
服务器上的表(查询分析器连接到服务器上创建)
create table [user](id int primary keynumber varchar()name varchar())
go
以下在局域网(本机操作)
本机的表state说明:null 表示新增记录 表示修改过的记录 表示无变化的记录
if exists (select * from dbosysobjects where id = object_id(N[user]) and OBJECTPROPERTY(id NIsUserTable) = )
drop table [user]
GO
create table [user](id int identity()number varchar()name varchar()state bit)
go
创建触发器维护state字段的值
create trigger t_state on [user]
after update
as
update [user] set state=
from [user] a join inserted b on aid=bid
where astate is not null
go
为了方便同步处理创建链接服务器到要同步的服务器
这里的远程服务器名为:xz用户名为:sa无密码
if exists(select from mastersysservers where srvname=srv_lnk)
exec sp_dropserver srv_lnkdroplogins
go
exec sp_addlinkedserver srv_lnkSQLOLEDBxz
exec sp_addlinkedsrvlogin srv_lnkfalsenullsa
go
创建同步处理的存储过程
if exists (select * from dbosysobjects where id = object_id(N[dbo][p_synchro]) and OBJECTPROPERTY(id NIsProcedure) = )
drop procedure [dbo][p_synchro]
GO
create proc p_synchro
as
set XACT_ABORT on
启动远程服务器的MSDTC服务
exec masterxp_cmdshell isql /Sxz /Usa /P /qexec masterxp_cmdshell net start msdtcno_outputno_output
启动本机的MSDTC服务
exec masterxp_cmdshell net start msdtcno_output
进行分布事务处理如果表用标识列做主键用下面的方法
BEGIN DISTRIBUTED TRANSACTION
同步删除的数据
delete from srv_lnktestdbo[user]
where id not in(select id from [user])
同步新增的数据
insert into srv_lnktestdbo[user]
select idnumbername from [user] where state is null
同步修改的数据
update srv_lnktestdbo[user] set
number=bnumbername=bname
from srv_lnktestdbo[user] a
join [user] b on aid=bid
where bstate=
同步后更新本机的标志
update [user] set state= where isnull(state)=
COMMIT TRAN
go
创建作业定时执行数据同步的存储过程
if exists(SELECT from msdbsysjobs where name=数据处理)
EXECUTE msdbdbosp_delete_job @job_name=数据处理
exec msdbsp_add_job @job_name=数据处理
创建作业步骤
declare @sql varchar()@dbname varchar()
select @sql=exec p_synchro 数据处理的命令
@dbname=db_name() 执行数据处理的数据库名
exec msdbsp_add_jobstep @job_name=数据处理
@step_name = 数据同步
@subsystem = TSQL
@database_name=@dbname
@command = @sql
@retry_attempts = 重试次数
@retry_interval = 重试间隔
创建调度
EXEC msdbsp_add_jobschedule @job_name = 数据处理
@name = 时间安排
@freq_type = 每天
@freq_interval = 每天执行一次
@active_start_time = 点执行
go