一、 预备工作
1 .发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户
-- 管理工具
-- 计算机管理
-- 用户和组
-- 右键用户
-- 新建用户
-- 建立一个隶属于administrator组的登陆windows的用户(SynUser)
2 .在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:
我的电脑 -- D: 新建一个目录,名为: PUB
-- 右键这个新建的目录
-- 属性--共享
-- 选择"共享该文件夹"
-- 通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser) 具有对该文件夹的所有权限
-- 确定
3 .设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布 / 订阅服务器均做此设置)
开始 -- 程序--管理工具--服务
-- 右键SQLSERVERAGENT
-- 属性--登陆--选择"此账户"
-- 输入或者选择第一步中创建的windows登录用户名(SynUser)
-- "密码"中输入该用户的密码
4 .设置SQL Server身份验证模式,解决连接时的权限问题(发布 / 订阅服务器均做此设置)
企业管理器
-- 右键SQL实例--属性
-- 安全性--身份验证
-- 选择"SQL Server 和 Windows"
-- 确定
5 .在发布服务器和订阅服务器上互相注册
企业管理器
-- 右键SQL Server组
-- 新建SQL Server注册...
-- 下一步--可用的服务器中,输入你要注册的远程服务器名 --添加
-- 下一步--连接使用,选择第二个"SQL Server身份验证"
-- 下一步--输入用户名和密码(SynUser)
-- 下一步--选择SQL Server组,也可以创建一个新组
-- 下一步--完成
6 .对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到)
? (在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)
开始 -- 程序--Microsoft SQL Server--客户端网络实用工具
-- 别名--添加
-- 网络库选择"tcp/ip"--服务器别名输入SQL服务器名
-- 连接参数--服务器名称中输入SQL服务器ip地址
-- 如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号
二、 正式配置
1 、配置发布服务器
打开企业管理器,在发布服务器(B、C、D)上执行以下步骤:
( 1 ) 从 [ 工具 ] 下拉菜单的 [ 复制 ] 子菜单中选择 [ 配置发布、订阅服务器和分发 ] 出现配置发布和分发向导
( 2 ) [ 下一步 ] 选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)
( 3 ) [ 下一步 ] 设置快照文件夹
采用默认servernamePub
( 4 ) [ 下一步 ] 自定义配置
可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置
否,使用下列默认设置(推荐)
( 5 ) [ 下一步 ] 设置分发数据库名称和位置 采用默认值
( 6 ) [ 下一步 ] 启用发布服务器 选择作为发布的服务器
( 7 ) [ 下一步 ] 选择需要发布的数据库和发布类型
( 8 ) [ 下一步 ] 选择注册订阅服务器
( 9 ) [ 下一步 ] 完成配置
2 、创建出版物
发布服务器B、C、D上
( 1 )从 [ 工具 ] 菜单的 [ 复制 ] 子菜单中选择 [ 创建和管理发布 ] 命令
( 2 )选择要创建出版物的数据库,然后单击 [ 创建发布 ]
( 3 )在 [ 创建发布向导 ] 的提示对话框中单击 [ 下一步 ] 系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
( 4 )单击 [ 下一步 ] 系统要求指定可以订阅该发布的数据库服务器类型,
SQLSERVER允许在不同的数据库如 orACLE或ACCESS之间进行数据复制。
但是在这里我们选择运行"SQL SERVER 2000 "的数据库服务器
( 5 )单击 [ 下一步 ] 系统就弹出一个定义文章的对话框也就是选择要出版的表
注意: 如果前面选择了事务发布 则再这一步中只能选择带有主键的表
( 6 )选择发布名称和描述
( 7 )自定义发布属性 向导提供的选择:
是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性
否 根据指定方式创建发布 (建议采用自定义的方式)
( 8 ) [ 下一步 ] 选择筛选发布的方式
( 9 ) [ 下一步 ] 可以选择是否允许匿名订阅
1 )如果选择署名订阅,则需要在发布服务器上添加订阅服务器
方法: [ 工具 ] -> [ 复制 ] -> [ 配置发布、订阅服务器和分发的属性 ] -> [ 订阅服务器 ] 中添加
否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅
如果仍然需要匿名订阅则用以下解决办法
[ 企业管理器 ] -> [ 复制 ] -> [ 发布内容 ] -> [ 属性 ] -> [ 订阅选项 ] 选择允许匿名请求订阅
2 )如果选择匿名订阅,则配置订阅服务器时不会出现以上提示
( 10 ) [ 下一步 ] 设置快照 代理程序调度
( 11 ) [ 下一步 ] 完成配置
当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。
-- --------------------------
-- 参考:
/*
作者:邹建
*/
/* --同步两个数据库的示例
有数据
srv1.库名..author有字段:id,name,phone,
srv2.库名..author有字段:id,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,telphone)
select ?? id,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 、 -- 创建链接服务器
exec sp_addlinkedserver?? ' ITSV ' ,' ' ,' SQLOLEDB ' ,' 远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin? ' ITSV ' ,' false ' ,' 用户名 ' ,' 密码 '
2 、启动两台服务器的MSDTC服务
MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC( Distributed Transaction Coordinator)服务。
3 、打开双方的135端口
MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。
使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放
4 、 -- 如要创建触发器??
create ?? trigger ?? t_test?? on ?? test??
for ?? insert , update , delete ??
as
-- 加上下面两句,否则会提示新事务不能登记到指定事务处理器
set ??? xact_abort?? on ?
begin ? distributed ?? tran
??? delete ?? from ?? openrowset ( ' sqloledb ' , ' xz ' ; ' sa ' ; '' ,test.dbo.test)??
??? where ?? id?? in ( select ?? id?? from ?? deleted)??
??? insert ?? into ?? openrowset ( ' sqloledb ' , ' xz ' ; ' sa ' ; '' ,test.dbo.test)??
??? select ?? * ?? from ?? inserted??
commit tran
-- 查询示例
select * from ITSV.数据库名.dbo.表名
-- 导入示例
select * into 表 from ITSV.数据库名.dbo.表名
-- 以后不再使用时删除链接服务器
exec sp_dropserver? ' ITSV ' ,' droplogins '