同步两个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错误了。
利用复制实现数据同步
最新推荐文章于 2022-01-27 21:23:00 发布