SQL Server2000的复制功能类似与Mysql的复制,起到负载均衡和备份的作用。

复制的类型:
1、快照复制
2、事务性复制
3、合并复制

实例服务器架构:
a、发布、分发服务器 192.168.0.9 WIN2K3
b、订阅服务器 192.168.0.3 GOODLUCK-PC
都打了sp4补丁,只有打了补丁别的机器才能远程访问SQL Server,无补丁的不会建立socket监听

一、快照复制的部署
    发布服务器会按照用户指定的时间间隔定期用已更新的快照更新订阅服务器的数据,适用于订阅服务器的数据不需要始终保持为最新的情形,即,不是实时性的。数据在发布服务器更新后,会等待用户指定的时间间隔(在:展开SQL Server注册树-->复制-->发布内容-->已发布的项上右键-->属性-->状态-->代理程序属性-->调度-->编辑-->更改-->发生周期1分钟,起始于0:00:00,无结束日期)后订阅服务器中才更新。类似cron。

1、在两台服务器上作:
企业管理器 --> SQL Server 实例-->属性-->安全性-->身份验证--> SQL Server和Windows

2、在两台服务器上作:
企业管理器-->删除默认的SQL Server注册,一般是“(local) (Windows NT)“,新建SQL Server注册,用本机计算机名注册SQL Server。

3、 在两台服务器上作:
企业管理器,彼此添加对方SQL Server注册,也要用对方计算机名注册。

4、 在两台服务器上作:
建立快照文件夹共享用户,我的电脑-->右键-->管理-->本地用户和组-->用户-->新建用户syncuser密码syncuser密码永不过期,用户不能更改密码。将用户加入到administrators组,在“隶属于”里添加即可

5、 在两台服务器上作:
设置SQL Server Agent服务的启动账号,开始-->运行-->services.msc,右键sqlserveragent-->属性-->登陆-->此账户-->用户和密码为前面建立的账号

6、 在发布服务器(192.168.0.9)上新建快照文件夹
在C盘下新建文件夹pub,右键-->属性-->共享-->共享此文件夹-->权限,删除everyone,添加syncuser,并设置权限为完全控制

7、开始配置发布服务器
企业管理器,点击SQL Server实例-->工具菜单-->复制-->配置发布、订阅服务器和分发-->选择第一项(使”WIN2K3”成为它自己的分发服务器;SQL Server将创建分发数据库和日志)-->是,将SQL Server代理服务配置为自动启动-->快照文件夹\\WIN2K3\pub-->否,使用下面的默认设置-->下一步,完成。完成后会在SQL Server注册树形结构下出现一个“复制监视器“和数据库distribution

8、创建发布
先创建一个要发布的数据库test和一个test表
create database test
use test
go
create table test (id int,message varchar(255))
在树形结构下双击“复制“--> 右键 发布内容--> 新建发布 --> 选择test库--> 快照发布--> 运行SQL Server2000的服务器--> 全部发布--> 否,根据指定方式创建发布--> 下一步,完成

9、修改发布属性(启用匿名订阅,调整发布间隔,因为快照发布是非实时性的)
在树形结构下双击“复制“-->发布内容--> 右键 ”test:test”--> 属性--> 订阅选项--> 使用独立于该数据库的其他发布的分发代理程序,始终可以立即使用快照文件初始化新订阅,允许匿名请求订阅
在树形结构下双击“复制“-->发布内容--> 属性 ”test:test”--> 状态--> 代理程序属性--> 调度--> 编辑--> 更改--> 发布周期,1 分钟,起始于0:00:00,无结束日期--> 确定,完成

10、创建订阅(192.168.0.3)
本地创建test数据库
create  database test
展开SQL Server注册树,双击“复制”--> 右键 订阅--> 新建请求订阅--> 查看已注册服务器所作的发布--> 展开WIN2K3,选择test:test--> 模拟SQL Server代理账户--> 选择test--> 是,生成匿名订阅--> 是,初始化数据和架构--> 使用该发布的默认快照文件夹中的快照文件--> 使用下列调度--> 更改--> 发生周期,1 分钟--> 下一步,完成

可以观看效果了,大约1分钟后,看看订阅服务器test数据库中是否有test表:
Ok,test表快照复制成功了,我们在发布服务器插入一条记录
约等一分钟后,看看订阅服务器的test库test表是否有记录呢
Ok,数据也过来了,大功告成。

二、事务性复制
    这是实时性的复制,也就是说在发布服务器更新的数据,会立即更新到订阅服务器,是基于操作的。
其他步骤和快照复制相同,只是在创建发布时不同,并且数据表要有主键,如下:(192.168.0.9)
1、创建发布
先创建一个要发布的数据库test和一个test表
create database test
use test
go
create table test (id int primary key,message varchar(255))
展开SQL Server注册树,双击“复制“--> 右键 发布内容 --> 新建发布--> 选择test数据库--> 事务发布--> 运行SQL Server2000的服务器--> 全部发布--> 否,根据指定方式创建发布--> 完成

2、修改发布属性(启用匿名订阅)
在树形结构下双击“复制“-->发布内容 --> 右键 ”test:test”--> 属性--> 订阅选项--> 使用独立于该数据库的其他发布的分发代理程序,始终可以立即使用快照文件初始化新订阅,允许匿名请求订阅

3、创建订阅
展开SQL Server注册树,双击“复制“-->右键订阅-->属性-->新建请求订阅-->查看已注册服务器所作的发布-->展开WIN2K3选择test:test-->模拟SQL Server代理账户-->选择test库 --> 是,生成匿名订阅--> 是,初始化架构和数据--> 使用该发布的默认快照文件夹中的快照文件--> 连续地-提供从发布服务器上一个操作发生到该操作被传播到订阅服务器的最短滞后时间--> 下一步,完成

ok,开始测试,在发布服务器test库test表插入一条数据
立即去订阅服务器查看
看到数据很快就同步过来了


注意事项:
1、SQL Server2000个人版 不支持事务复制,需要安装SQL Server2000企业版在Server版服务器上,如2003Server
2、如果SQL Server2000所在服务器,主机更改了计算机名称,需要运行下列sql语句进行主机名和SQL Server内部名称同步:
if     serverproperty( 'servername')    <>    @@servername    
begin    
                     declare    @server    sysname    
                     set    @server  =  @@servername    
                     exec     sp_dropserver    @server  =  @server ,  @droplogins = 'droplogins'
                     set    @server    =     cast( serverproperty( 'servername')     as    sysname)
                     exec     sp_addserver    @server = @server , @local =   'LOCAL'    
end
其中
@@servername是SQL Server内部名称
serverproperty('servername')是外部名称,也就是主机名
执行成功后重启SQL Server服务,即可成功同步主机名