两台Sql server数据同步
发布时间:2018-08-23 06:32:15 所属栏目:电商 来源:站长网
导读:复制的观念 复制是将一组数据从一个数据源拷贝到多个数据源的技能,是将一份数据宣布到多个存储站点上的有用方法。行使复制技能,用户可以将一份数据宣布到多台处事器上,从而使差异的处事器用户都可以在权限的容许的范畴内共享这份数据。复制技能可以确保
复制的观念 复制是将一组数据从一个数据源拷贝到多个数据源的技能,是将一份数据宣布到多个存储站点上的有用方法。行使复制技能,用户可以将一份数据宣布到多台处事器上,从而使差异的处事器用户都可以在权限的容许的范畴内共享这份数据。复制技能可以确保漫衍在差异所在的数据自动同步更新,从而担保数据的同等性。 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 FilesMicrosoft SQL ServerMSSQLREPLDATAuncXIAOWANGZI_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 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |