您的位置:首页 > 其它

利用复制实现数据同步

2006-08-11 12:33 417 查看
利用复制实现数据同步
上个星期老大要我做两个服务器之间的数据同步,看了网上一些资料,配置的过程中遇到了许多古怪的问题.最终还是把问题解决了.
以下是我使用的两种同步方式的配置过程和遇到的问题以及解决方法.
发给大家参考一下,如有错误或者别的处理方法请贴来,大家一起学习.
========================

同步两个SQLServer数据库

  如何同步两个sqlserver数据库的内容?数据库同步就非常麻烦,只能自己改了一个后再去改另一个,如果忘记了更改另一个经常造成两个数据库的结构或内容上不一致.

(强制订阅方式)
  一、分发与复制

  用强制订阅实现数据库同步操作. 大量和批量的数据可以用数据库的同步机制处理:

说明:
为方便操作,所有操作均在发布服务器(分发服务器)上操作,并使用推模式在客户机器使用强制订阅方式。

  二、测试通过

  1:环境

  服务器环境:
  机器名称: joyce
  操作系统:windows 2000 server
  数据库版本:sql 2000 server 个人版

  客户端
  机器名称:anne
  操作系统:windows 2000 server
  数据库版本:sql 2000 server 服务版

  2:建用户帐号

  在服务器端建立域用户帐号
  我的电脑管理->本地用户和组->用户->建立
username:joyce
userpwd:joyce

  3:重新启动服务器mssqlserver

  我的电脑->控制面版->管理工具->服务->mssqlserver 服务
  (更改为:域用户帐号,我们新建的joyce用户 ./joyce,密码:joyce)
(默认用户为ADMINISTRATOR)

  4:安装分发服务器

  a:配置分发服务器
选择服务器节点->工具->复制->配置发布、订阅服务器和分发->下一步->下一步(所有的均采用默认配置)

  b:配置发布服务器
选择服务器节点->工具->复制->创建和管理发布->选择要发布的数据库(test_db)->下一步->快照发布->下一步->选择要发布的内容->下一步->下一步->下一步->完成

  c:强制配置订阅服务器(推模式,拉模式与此雷同)
工具->复制->配置发布、订阅服务器和分发->订阅服务器->新建->sql server数据库->输入客户端服务器名称(anne)->使用sql server 身份验证(sa,密码)->确定->应用->确定

  d:初始化订阅
复制监视器->发布服务器(joyce)->右击test_db:test_db->强制新订阅->下一步->选择启用的订阅服务器->anne->下一步->下一步->下一步->下一步->完成

  5:测试配置是否成功
  查看:
  复制监视器->发布服务器(joyce)->test_db:test_db->选择anne:test_db(类型强制)->鼠标右键->启动同步处理

  如果没有错误标志(红色叉),恭喜您配置成功

  6:测试数据

  在服务器执行:

  选择一个表,执行如下sql
insert into test_tab (test_col) values 'abc'

  复制监视器->发布服务器(joyce)->test_db:test_db->快照->启动代理程序
  复制监视器->发布服务器(joyce)->test_db:test_db->anne:test_db(强制)->启动同步处理

  去查看同步的 anne.test_db.dbo.test_tab 是否插入了一条新的记录

  测试完毕,通过。
  7:修改数据库的同步时间。

--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------

(请求订阅/合并发布)
下面是按顺序列出配置复制的步骤:

  1、建立发布和分发服务器

[服务器节点] -> [工具] -> [复制] -> [配置发布、订阅服务器和分发(o)...]
-> [欢迎使用配置发布和分发向导] -> [选择分发服务器]
-> [使"joyce"成为它自己的分发服务器,sql server将创建分发数据库和日志]
-> [制定快照文件夹] -> [自定义配置]
-> [否,使用下列的默认配置] -> [完成]

  上述步骤完成后, 会在当前"joyce" sql server数据库里建立了一个distribion库和 一个distributor_admin管理员级别的用户(可以任意修改密码)。

  服务器上新增加了四个作业:
[ 代理程序历史记录清除: distribution ]
[ 分发清除: distribution ]
[ 复制代理程序检查 ]
[ 重新初始化存在数据验证失败的订阅 ]

  sql server企业管理器里多了一个复制监视器, 当前的这台机器就可以发布、分发、订阅了。
  再次在sql server企业管理器里
[复制]-> 右键选择 ->[配置发布、订阅服务器和分发] ->
[发布服务器和分发服务器的属性] 窗口-> [发布服务器] -> [确定]
[发布数据库] -> [事务]/[合并] -> [确定]
[订阅服务器] -> [新增] -> [确定]

  2、新建立另一台发布服务器(anne)选择分发服务器

[服务器节点]->[工具]->[复制]->[配置发布、订阅服务器和分发(o)...]->[欢迎使用配置发布和分发向导]->[选择分发服务器]
-> 使用下列服务器(选定的服务器必须已配置为分发服务器) -> [选定服务器](joyce)
-> [下一步] -> [输入分发服务器(joyce)的distributor_admin/sa 用户的密码两次]
-> [下一步] -> [自定义配置] -> [否,使用下列的默认配置]
-> [下一步] -> [完成] -> [确定]

  建立一个数据库复制发布的过程:

[复制] -> [发布内容] -> 右键选择 -> [新建发布]
-> [下一步] -> [选择发布数据库] -> [选中一个待发布的数据库]
-> [下一步] -> [选择发布类型] -> [事务发布]/[合并发布]
-> [下一步] -> [指定订阅服务器的类型] -> [运行sql server 2000的服务器]
-> [下一步] -> [指定项目] -> [在事务发布中只可以发布带主键的表] -> [选中一个有主键的待发布的表]
->[在合并发布中会给表增加唯一性索引和 rowguidcol 属性的唯一标识符字段[rowguid],默认值是newid()]
(添加新列将: 导致不带列列表的 insert 语句失败,增加表的大小,增加生成第一个快照所要求的时间)
->[选中一个待发布的表]
-> [下一步] -> [选择发布名称和描述] ->
-> [下一步] -> [自定义发布的属性] -> [否,根据指定方式创建发布]
-> [下一步] -> [完成] -> [关闭]

  建立一个数据库复制订阅的过程:
[复制] -> [订阅] -> 右键选择 -> [新建请求订阅]
-> [下一步] -> [查找发布] -> [查看已注册服务器所做的发布]
-> [下一步] -> [选择发布] -> [选中已经建立发布服务器上的数据库发布名]
-> [下一步] -> [指定同步代理程序登录] -> [当代理程序连接到代理服务器时:使用sql server身份验证]
(输入发布服务器上distributor_admin/sa用户名和密码)
-> [下一步] -> [选择目的数据库] -> [选择在其中创建订阅的数据库名]/[也可以新建一个库名]
-> [下一步] -> [允许匿名订阅] -> [是,生成匿名订阅]
-> [下一步] -> [初始化订阅] -> [是,初始化架构和数据]
-> [下一步] -> [快照传送] -> [使用该发布的默认快照文件夹中的快照文件]
(订阅服务器要能访问发布服务器的repldata文件夹,如果有问题,可以手工设置网络共享及共享权限)
-> [下一步] -> [快照传送] -> [使用该发布的默认快照文件夹中的快照文件]
-> [下一步] -> [设置分发代理程序调度] -> [使用下列调度] -> [更改] -> [例如每五分钟调度一次]
-> [下一步] -> [启动要求的服务] -> [该订阅要求在发布服务器上运行sqlserveragent服务]
-> [下一步] -> [完成] -> [确定]
  成功建立了订阅后,订阅服务器上新增加了一个类别是[分发]作业(合并复制的时候类别是[合并])
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

注意说明:
服务器一端不能以(local/最好也不要用IP)进行数据的发布与分发,需要先删除注册,然后新建注册本地计算机名称
卸载方式:工具->复制->禁止发布->是在"joyce"上静止发布,卸载所有的数据库同步配置服务器
注意:发布服务器、分发服务器中的sqlserveragent服务必须启动
采用推模式: "d:/microsoft sql server/mssql/repldata/unc" 目录文件可以不设置共享
拉模式:则需要共享!

  少量数据库同步也可以采用触发器实现,同步单表即可,但对于修改表结构时要注意两台备份服务器也要修改表结构。
  
配置过程中可能出现的问题

  在sql server 2000里设置和使用数据库复制之前,应先检查相关的几台sql server服务器下面几点是否满足:

  1、mssqlserver和sqlserveragent服务是否是以域用户身份启动并运行的(./administrator用户也是可以的)

如果登录用的是本地系统帐户local,将不具备网络功能,会产生以下错误:

进程未能连接到distributor '@server name'

(如果您的服务器已经用了sql server全文检索服务, 请不要修改mssqlserver和sqlserveragent服务的local启动。会造成全文检索服务不能用。请换另外一台机器来做sql server 2000里复制中的分发服务器。)

修改服务启动的登录用户,需要重新启动mssqlserver和sqlserveragent服务才能生效。

  2、检查相关的几台sql server服务器是否改过名称(需要srvid=0的本地机器上srvname和datasource一样)

  在查询分析器里执行:
use master
select srvid,srvname,datasource from sysservers

  如果没有srvid=0或者srvid=0(也就是本机器)但srvname和datasource不一样.或者在配置过程中出现:18482、18483错误时.需要按如下方法修改:

use master
go
-- 设置两个变量
declare @serverproperty_servername varchar(100),
@servername varchar(100)
-- 取得windows nt 服务器和与指定的 sql server 实例关联的实例信息
select @serverproperty_servername = convert(varchar(100),serverproperty('servername'))
-- 返回运行 microsoft sql server 的本地服务器名称
select @servername = convert(varchar(100), @@servername)
-- 显示获取的这两个参数
select @serverproperty_servername,@servername
--如果@serverproperty_servername和@servername不同(因为你改过计算机名字),再运行下面的
--删除错误的服务器名
exec sp_dropserver @server=@servername
--添加正确的服务器名
exec sp_addserver @server=@serverproperty_servername, @local='local'

  修改这项参数,需要重新启动mssqlserver和sqlserveragent服务才能生效。这样一来就不会在创建复制的过程中出现18482、18483错误了。

  3、检查sql server企业管理器里面相关的几台sql server注册名是否和上面第二点里介绍的srvname一样不能用ip地址的注册名。
  (我们可以删掉ip地址的注册,新建以sql server管理员级别的用户注册的服务器名)
   这样一来就不会在创建复制的过程中出现14010、20084、18456、18482、18483错误了。

__________________
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: