1、两台SQL Server数据同步解决方案两台SQL Server数据同步解决方案 复制的概念复 制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器 上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。SQL复制的基本元素包括出版服务器、订阅服务器、分发服务器、出版物、文章SQL复制的工作原理 SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数
2、据的所有改变情况的拷贝复制到分发服务 器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器SQL SERVER复制技术类型SQL SERVER提供了三种复制技术,分别是:1、快照复制(呆会我们就使用这个)2、事务复制3、合并复制只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。第一先来配置出版服务器(1)选中指定服务器节点(2)从工具下拉菜单的复制子菜单中选择发布、订阅服务器和分发命令(3)系统弹出一个对话框点下一步然后看着提示一直操作到完成。(4)当完成了出版服务器的设置以后系统会为该服务器的树形结
3、构中添加一个复制监视器。同时也生成一个分发数据库(distribution)第二创建出版物(1)选中指定的服务器(2)从工具菜单的复制子菜单中选择创建和管理发布命令。此时系统会弹出一个对话框(3)选择要创建出版物的数据库,然后单击创建发布(4)在创建发布向导的提示对话框中单击下一步系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)(5)单击下一步系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行SQL SERVER 200
4、0的数据库服务器(6)单击下一步系统就弹出一个定义文章的对话框也就是选择要出版的表(7)然后下一步直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。第三设计订阅(1)选中指定的订阅服务器(2)从工具下拉菜单中选择复制子菜单的请求订阅(3)按照单击下一步操作直到系统会提示检查SQL SERVER代理服务的运行状态,执行复制操作的前提条件是SQL SERVER代理服务必须已经启动。(4)单击完成。完成订阅操作。 完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制发布内容 右键发布内容属性击活
5、状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:00:00和 23:59:59之间。接下来就是判断复制是否成功了打开C:Program FilesMicrosoft SQL ServerMSSQLREPLDATAuncXIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的 文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表一个手工同步的方案-定时同步服务器上的数据-例子:-测试环境,SQL Server2000,远程服务器名:xz,用户名
6、为: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(Nuser) and OBJECTPROPERTY(id, NIsUserTable) = 1)drop table userG
7、Ocreate table user(id int identity(1,1),number varchar(4),name varchar(10),state bit)go-创建触发器,维护state字段的值create trigger t_state on userafter updateasupdate user set state=1from user a join inserted b on a.id=b.idwhere a.state is not nullgo-为了方便同步处理,创建链接服务器到要同步的服务器-这里的远程服务器名为:xz,用户名为:sa,无密码if exists(
8、select 1 from master.sysservers where srvname=srv_lnk)exec sp_dropserver srv_lnk,droploginsgoexec sp_addlinkedserver srv_lnk,SQLOLEDB,xzexec sp_addlinkedsrvlogin srv_lnk,false,null,sago-创建同步处理的存储过程if exists (select * from dbo.sysobjects where id = object_id(Ndbo.p_synchro) and OBJECTPROPERTY(id, NIs
9、Procedure) = 1)drop procedure dbo.p_synchroGOcreate proc p_synchroas-set XACT_ABORT on-启动远程服务器的MSDTC服务-exec master.xp_cmdshell isql /Sxz /Usa /P /qexec master.xp_cmdshell net start msdtc,no_output,no_output-启动本机的MSDTC服务-exec master.xp_cmdshell net start msdtc,no_output-进行分布事务处理,如果表用标识列做主键,用下面的方法-BEG
10、IN DISTRIBUTED TRANSACTION-同步删除的数据delete from srv_lnk.test.dbo.userwhere id not in(select id from user)-同步新增的数据insert into srv_lnk.test.dbo.userselect id,number,name from user where state is null-同步修改的数据update srv_lnk.test.dbo.user setnumber=b.number,name=b.namefrom srv_lnk.test.dbo.user ajoin user
11、b on a.id=b.idwhere b.state=1-同步后更新本机的标志update user set state=0 where isnull(state,1)=1-COMMIT TRANgo-创建作业,定时执行数据同步的存储过程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(25
12、0)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,
13、-每天freq_interval = 1, -每天执行一次active_start_time = 00000 -0点执行go 两台SQL Server数据同步解决方案 复制的概念复 制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器 上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。SQL复制的基本元素包括出版服务器、订阅服务器、分发服务器、出版物、文章SQL复制的工作原理 SQL SERVER 主要采用出版物、订阅
14、的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务 器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器SQL SERVER复制技术类型SQL SERVER提供了三种复制技术,分别是:1、快照复制(呆会我们就使用这个)2、事务复制3、合并复制只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。第一先来配置出版服务器(1)选中指定服务器节点(2)从工具下拉菜单的复制子菜单中选择发布、订阅服务器和分发命令(3)系统弹出一个对话框点下一步
15、然后看着提示一直操作到完成。(4)当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库(distribution)第二创建出版物(1)选中指定的服务器(2)从工具菜单的复制子菜单中选择创建和管理发布命令。此时系统会弹出一个对话框(3)选择要创建出版物的数据库,然后单击创建发布(4)在创建发布向导的提示对话框中单击下一步系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)(5)单击下一步系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 ORAC
16、LE或ACCESS之间进行数据复制。但是在这里我们选择运行SQL SERVER 2000的数据库服务器(6)单击下一步系统就弹出一个定义文章的对话框也就是选择要出版的表(7)然后下一步直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。第三设计订阅(1)选中指定的订阅服务器(2)从工具下拉菜单中选择复制子菜单的请求订阅(3)按照单击下一步操作直到系统会提示检查SQL SERVER代理服务的运行状态,执行复制操作的前提条件是SQL SERVER代理服务必须已经启动。(4)单击完成。完成订阅操作。 完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可
17、以通过这种方法来快速看是否成功。展开出版服务器下面的复制发布内容 右键发布内容属性击活状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:00:00和 23:59:59之间。接下来就是判断复制是否成功了打开C:Program FilesMicrosoft SQL ServerMSSQLREPLDATAuncXIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的 文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表一个手工同步的方案-定时同步服务
18、器上的数据-例子:-测试环境,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(Nuser) and OBJECTPROP
19、ERTY(id, NIsUserTable) = 1)drop table userGOcreate table user(id int identity(1,1),number varchar(4),name varchar(10),state bit)go-创建触发器,维护state字段的值create trigger t_state on userafter updateasupdate user set state=1from user a join inserted b on a.id=b.idwhere a.state is not nullgo-为了方便同步处理,创建链接服务器到
20、要同步的服务器-这里的远程服务器名为:xz,用户名为:sa,无密码if exists(select 1 from master.sysservers where srvname=srv_lnk)exec sp_dropserver srv_lnk,droploginsgoexec sp_addlinkedserver srv_lnk,SQLOLEDB,xzexec sp_addlinkedsrvlogin srv_lnk,false,null,sago-创建同步处理的存储过程if exists (select * from dbo.sysobjects where id = object_id
21、(Ndbo.p_synchro) and OBJECTPROPERTY(id, NIsProcedure) = 1)drop procedure dbo.p_synchroGOcreate proc p_synchroas-set XACT_ABORT on-启动远程服务器的MSDTC服务-exec master.xp_cmdshell isql /Sxz /Usa /P /qexec master.xp_cmdshell net start msdtc,no_output,no_output-启动本机的MSDTC服务-exec master.xp_cmdshell net start msd
22、tc,no_output-进行分布事务处理,如果表用标识列做主键,用下面的方法-BEGIN DISTRIBUTED TRANSACTION-同步删除的数据delete from srv_lnk.test.dbo.userwhere id not in(select id from user)-同步新增的数据insert into srv_lnk.test.dbo.userselect id,number,name from user where state is null-同步修改的数据update srv_lnk.test.dbo.user setnumber=b.number,name=b
23、.namefrom srv_lnk.test.dbo.user ajoin user b on a.id=b.idwhere b.state=1-同步后更新本机的标志update user set state=0 where isnull(state,1)=1-COMMIT TRANgo-创建作业,定时执行数据同步的存储过程if exists(SELECT 1 from msdb.sysjobs where name=数据处理)EXECUTE msdb.dbo.sp_delete_job job_name=数据处理exec msdb.sp_add_job job_name=数据处理-创建作业步
24、骤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
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1