--a.在srv1..author中创建触发器,实现数据即时同步 --新增同步 create trigger tr_insert_author on author for insert as set xact_abort on insert srv2.库名.dbo.author(id,name,telphone) select id,name,telphone from inserted go
--修改同步 create trigger tr_update_author on author for update as set xact_abort on update b set name=i.name,telphone=i.telphone from srv2.库名.dbo.author b,inserted i where b.id=i.id go
--删除同步 create trigger tr_delete_author on author for delete as set xact_abort on delete b from srv2.库名.dbo.author b,deleted d where b.id=d.id go
可以选择合并复制、可即时更新的事务复制、可队列更新的事务复制、对等事务复制。合并复制适用于以下情况:多个订阅服务器会在不同的时间更新同一数据,并将其同步到所有的服务器上;订阅服务器需要离线更新发布数据,并在联机时将其同步到所有的服务器上;每个订阅服务器负责不同的数据分区;只需要访问到最终的数据更新结果,而不是中间状态。服务订阅的合并复制支持再发布。事务复制适用于以下情况:希望同步发布数据的更新;要求较小的同步时间延迟(要求服务器间有快速而可靠的网络连接);发布数据有频繁的更新,希望访问到数据更新过程中的每一个状态,而不是最终结果。可更新的事务复制,通过链接服务器或消息队列,允许在订阅服务器上更改发布数据-更改首先被传播回发布服务器,再传播到其他订阅服务器。与合并复制相比,可更新的事务复制只允许较少的订阅服务器,且可立即更新要求服务器间有可靠的网络连接,而可队列更新允许离线修改发布。可立即更新和可队列更新的事务复制能够进行相互切换。对等事务复制,复制拓扑中的服务器既为订阅也为发布,所有的服务器(节点)上都有相同的发布(架构和数据),可在所有的节点上更改发布;复制会考虑更改传播到节点的时间,防止更改事务在节点间循环复制。与对等事务复制相比,标准的事务复制是层级结构,更改会逐层传播。与合并复制相比,对等事务复制不支持数据过滤;同一行一次只允许在一个节点上进行更改(由用户和应用程序确保),因此不会出现复制冲突。通过应用程序的设计,可以利用对等事务复制平衡程序的查询操作,实现故障转移;对于修改操作,可以通过划分范围将修改操作应用到不同的节点上,也可以将修改操作应用到单独的节点上。对等事务复制只被 SQL SERVER 2K5 企业版支持。根据你的要求“最好能实现同步”,可使用可更新的事务复制。另外,可即时更新的事务复制和可队列更新的事务复制可以相互切换。
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例
select * from ITSV.数据库名.dbo.表名 --导入示例
select * into 表 from ITSV.数据库名.dbo.表名 --以后不再使用时删除链接服务器
exec sp_dropserver 'ITSV ', 'droplogins ' --连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset --查询示例
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) --生成本地表
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) --把本地表导入远程表
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
select *from 本地表 --更新本地表
update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1 --openquery用法需要创建一个连接 --首先创建一个连接创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
--查询
select *
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
--把本地表导入远程表
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A --3、opendatasource/openrowset
SELECT *
FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
select * from用强制订阅实现数据库同步操作
大量和批量的数据可以用数据库的同步机制处理:
//
说明:
为方便操作,所有操作均在发布服务器(分发服务器)上操作,并使用推模式
在客户机器使用强制订阅方式。有疑问联系作者:[email protected]测试通过
少量数据库同步可以采用触发器实现,同步单表即可:----------------------------
/*
作者:邹建
*/ /*--同步两个数据库的示例 有数据
srv1.库名..author有字段:id,name,phone,
srv2.库名..author有字段:id,name,telphone,adress 要求:
srv1.库名..author增加记录则srv1.库名..author记录增加
srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新
--*/ --大致的处理步骤
--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步
exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip'
exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码'
go --2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动
我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动
go
--然后创建一个作业定时调用上面的同步处理存储过程就行了 企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句: exec p_process
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排
然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
--3.实现同步处理的方法2,定时同步 --在srv1中创建如下的同步处理存储过程
create proc p_process
as
--更新修改过的数据
update b set name=i.name,telphone=i.telphone
from srv2.库名.dbo.author b,author i
where b.id=i.id and
(b.name <> i.name or b.telphone <> i.telphone) --插入新增的数据
insert srv2.库名.dbo.author(id,name,telphone)
select id,name,telphone from author i
where not exists(
select * from srv2.库名.dbo.author where id=i.id) --删除已经删除的数据(如果需要的话)
delete b
from srv2.库名.dbo.author b
where not exists(
select * from author where id=b.id)
go
1.在发布服务器上建立一个共享目录,作为发布快照文件的存放目录。例如:在D盘根目录下建文件夹名为Pub;
2.设置SQL 代理(发布服务器和订阅服务器均设置)
步骤:
――打开服务(控制面板---管理工具---服务)――右击SQLSERVER AGENT---属性---登录---选择“此帐户”――输入或选择第一步中创建的WINDOWS 用户“密码”中输入该用户密码;
3.设置SQL SERVER 身份验证,解决连接时的权限问题(发布、订阅服务器均设置)〕步骤:
对象资源管理器----右击SQL实例-----属性----安全性----服务器身份验证------选“SQL Server和WINDOWS”,然后点确定
4. 开启SQL Server 2005的网络协议TCP/IP和管道命名协议并重启网络服务。
5.在SQL Server中创建步骤1中对应的系统用户登陆名,作为发布数据库的拥有者(设置为dbo_owner和public)。 6.发布服务器和订阅服务器互相注册
步骤:视图----单击以注册服务器----右键数据库引擎----新建服务器注册-----填写要注册的远程服务器名称------身份验证选“SQL Server验证“-----用户名(sa) 密码------创建组(也可不建)-----完成;
7.对于只能用IP,不能用计算机名的,为其注册服务器别名。
二、开始
发布服务器配置(在发布服务器上配置发布和订阅)
1. 选择 复制 节点
2. 右键本地发布 ----下一步-----系统弹出对话框看提示----直到“指定快照文件夹”----在“快照文件夹“中输入准备工作中创建的目录(指向步骤1所建的共享文件夹)------选择发布数据库-------选择发布类型-------选择合并发布类型(半钢条码物流系统采用的是合并复制)-------选择要发布的对象------设置快照代理-------填写发布名称。 3. 右键本地订阅--------选择发布服务器-------选择订阅方式(如果是在服务器方订阅的话选择推送订阅反之
选择请求订阅)-------填加订阅服务器--------选择代理计划(一般选择连续运行)---------其余选择默认项。
至此, 半钢条码物流系统系统SQL SERVER 2005 同步复制就完成了。
说明:使用复制技术,用户可以将一份客户端的数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性,就无需编程实现客户端和服务器端数据同步了!大大提高了工作效率!
注意:
启用网络 DTC 访问
在Windows Server 2003 SP2 上启用网络 DTC 访问和配置 Windows 防火墙的步骤:
1. 依次单击“开始”、“运行”,键入 dcomcnfg,然后单击“确定”打开“组件服务”。
2. 在控制台树中,依次单击展开“组件服务”、“计算机”、“我的电脑”、“分布式事务协调器”,然后单击“本地 DTC”。
3. 右键单击“本地 DTC”,并单击“属性”以显示“本地 DTC 属性”对话框。
4. 单击“安全”选项卡。
5. 在“本地 DTC 属性”对话框的“安全”选项卡上设置以下选项,然后单击“确定”。
配置选项 默认值 推荐值
网络 DTC 访问 已禁用 已启用
客户端和管理
允许远程客户端 已禁用 已禁用
允许远程管理 已禁用 已禁用
事务管理器通信
允许入站 已禁用 已启用
允许出站 已禁用 已启用
要求进行相互身份验证 已启用 在所有远程计算机运行 Win2K3 SP1、XP SP2 或更高版本时启用。
要求对呼叫方进行身份验证 已禁用 在群集上运行 MSDTC 时启用。
不要求任何身份验证 已禁用 在远程计算机为 Windows Server 2003 SP1 之前的版本或 Windows XP SP2 之前的版本时启用。
启用 TIP 已禁用 在运行 BAM 门户时启用。
启用 XA 事务 已禁用 在与基于 XA 的事务性系统进行通信时启用,例如与使用 MQSeries 适配器的 IBM WebSphere MQ 进行通信时。
6. 依次打开“控制面板”、“Windows 防火墙”,然后单击“更改设置”以显示“Windows 防火墙设置”。
7. 单击“例外”选项卡。
8. 选中“分布式事务协调器”框,然后单击“确定”。
其他注意事项
• 请按照 http://go.microsoft.com/fwlink/?LinkId=79803 中的步骤在基于 Windows 2003 的计算机上启用网络 DTC 访问和配置 Windows 防火墙。
作者:邹建
*/
/*--同步两个数据库的示例
有数据
srv1.库名..author有字段:id,name,phone,
srv2.库名..author有字段:id,name,telphone,adress
要求:
srv1.库名..author增加记录则srv1.库名..author记录增加
srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新
--*/
--大致的处理步骤
--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步
exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip'
exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码'
go
--2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动
我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动
go
--3.实现同步处理
--a.在srv1..author中创建触发器,实现数据即时同步
--新增同步
create trigger tr_insert_author on author
for insert
as
set xact_abort on
insert srv2.库名.dbo.author(id,name,telphone)
select id,name,telphone from inserted
go
--修改同步
create trigger tr_update_author on author
for update
as
set xact_abort on
update b set name=i.name,telphone=i.telphone
from srv2.库名.dbo.author b,inserted i
where b.id=i.id
go
--删除同步
create trigger tr_delete_author on author
for delete
as
set xact_abort on
delete b
from srv2.库名.dbo.author b,deleted d
where b.id=d.id
go
1.快照复制:是单向复制的,就是只能从A到B同步。这种复制方式不是实时的。
2.事务复制:是单向复制的,也是只能从A到B同步。这种复制方式是实时的。
3.合并复制:是双向复制的,就是从A到B,从B到A都会同步。你可以根据自己的需求来选择一种复制方式。
http://topic.csdn.net/u/20081231/10/624c68b9-e9b6-4c01-910f-c116bdd14c63.html?2546
1用複製
2用存儲過程
3用觸發器
方法1 :好象我比較笨,配置起來會不會很麻煩?
方法2: 存儲過程大概要設為多久執行一次? A地北京 500M的數據庫,每天新增記錄應該在1000條以內,沒有圖片之類的大字段.B地香港.
方法3: 對我這種情況,應該要在兩邊的數據庫都要加觸發器.運行起來會不會慢?