首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请问关于sql 复制,订阅的有关问题

2012-01-14 
请教关于sql 复制,订阅的问题偶有些问题 望各位能帮忙看下.现有一主DB服务器A以及若干客户服务器(B,C,D等.

请教关于sql 复制,订阅的问题
偶有些问题 望各位能帮忙看下. 

现有一主DB服务器A以及若干客户服务器(B,C,D等..) 

主服务器中有张表 A.Table 里面有若干字段。同时有一个索引字段 A.Table.ServerID 记录着这条记录来自于哪个客户服务器。 

所有客户服务器中Table表都有相同的表结构. 假设所有服务器使用SQL SERVER 2005 SP2 

现在问题 
1.希望所有客户服务器定期(比如30分钟) 向主服务器同步数据 并且是所有客户都同步到同一张表中去.(以ServerID来区别是哪个服务器的数据 但是客户端服务器的表中仍然只保有自己的数据) 这样应该用什么方法进行复制?? 

2.如果客户端或者服务器网络故障 如何让它在下一个可用周期内自动向主服务器更新数据? 

3.如果客户服务器中数据挂掉.希望从主服务器中获得仅该客户服务器所该获得的行.(select * from a.table where serverid = 客户端服务器的id) 应该使用什么方法?(Microsoft说要一个"Host_Name()" 不太明白这个怎么操作 在哪儿进行编程呢?) 

4.如果主服务器和客户服务器在一个更新周期内分别对数据进行了修改.那两边如何进行同步?(我希望是能按顺序更新,比如主服务器中和客户服务器中数值都是3000 主服务器先执行update 值 set 值 = 值 -100 然后在还没有进行同步的时候客户服务器执行update 值 set 值 = 值 +200 则同步后结果是3000-100+200 而不是以最后一次更新的值来覆盖.这样类型的同步是否需要某种编程?) 


[解决办法]
没有遇到过
帮你UP
[解决办法]

SQL code
下介绍实现复制的步骤。(以快照复制为例)   


准备工作: 

1.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作: 

我的电脑--D:\  新建一个目录,名为:  PUB 
--右键这个新建的目录 
--属性--共享 
--选择"共享该文件夹"(另外还可以通过"权限"按纽来设置具体的用户权限 
--确定 


2.设置SQL代理(SQLSERVERAGENT)服务的启动用户 

开始--程序--管理工具--服务 
--右键SQLSERVERAGENT 
--属性--登陆--选择"此账户" 
--输入".\Administrator",或者选择其他系统管理员 
--"密码"中输入该用户的密码 

3.设置SQL  Server身份验证模式,解决连接时的权限问题 

企业管理器 
--右键SQL实例--属性 
--安全性--身份验证 
--选择"SQL  Server  和  Windows" 
--确定 

4.在发布服务器和订阅服务器上互相注册 
企业管理器 
--右键SQL  Server组 
--新建SQL  Server注册... 
--下一步--可用的服务器中,输入你要注册的远程服务器名 --添加 
--下一步--连接使用,选择第二个"SQL  Server身份验证" 
--下一步--输入用户名和密码 
--下一步--选择SQL  Server组,也可以创建一个新组 
--下一步--完成 

正式开始: 

1.配置发布服务器 

a.  选中指定  [服务器]  节点 
b.  从  [工具]  下拉菜单的  [复制]  子菜单中选择  [发布、订阅服务器和分发]  命令 
c.  系统弹出一个对话框点  [下一步]  然后看着提示操作 
--直到"指定快照文件夹" 
--在"快照文件夹"中输入准备工作中创建的目录:  \\ <服务器名>\pub 
一[下一步]  直操作到完成。 
d.  当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器 
同时也生成一个分发数据库(distribution) 


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

2.创建发布 
a.  选中指定的服务器 
b.  从  [工具]  菜单的  [复制]  子菜单中选择  [创建和管理发布]  命令。此时系统会弹出 
一个对话框 
c.  选择要创建发布的数据库,然后单击  [创建发布] 
d.  在  [创建发布向导]  的提示对话框中单击  [下一步]  系统就会弹出一个对话框。对话 
框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个 
大家可以去看看帮助) 
e.  单击  [下一步]  系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在 
不同的数据库如  ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行 
"SQL  SERVER  2000"的数据库服务器 
f.  单击  [下一步]  ,选择要发布的对象(如表,视图,存储过程,一般是表) 
g.  然后  [下一步]  直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了 
一个共享数据库。 


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

3.设计订阅 
a.  选中指定的订阅服务器 
b.  从  [工具]  下拉菜单中选择  [复制]  子菜单的  [请求订阅] 
c.  按照提示单击  [下一步]  操作直到系统会提示检查SQL  SERVER代理服务的运行状态,执行 


复制操作的前提条件是SQL  SERVER代理服务必须已经启动。 
d.  单击  [完成]  完成订阅操作。 


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

完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢? 
这里可以通过这种方法来快速看是否成功。 
展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度 
把调度设置为每一天发生,每一分钟,在0:00:00和23:59:59之间。 
接下来就是判断复制是否成功了打 
开C:\Program  Files\Microsoft  SQL  Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database下面 
看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。 
要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表 


[解决办法]
楼上的明显是为了骗分的,根本没有仔细看问题 :(
--------------------------

按照楼主要求的方法的话比较难做到,在SQL Server里面复制是不能多个发布服务器发布同一个表到一个订阅的,反向的倒是可以。如果采取程序的方法来做的话问题在于数据更新的时候如何传到主服务器,即如何维护主从服务器数据一致性这是一个难点。

不过有一个变通的方法,就是采用SQL Server的数据库合并复制加上视图来解决,将客户服务器上的表分别一不同的名字复制到主服务器比如
B.table -> A.table_B
C.table -> A.table_C
然后在创建视图
create view a.table
as
select * from A.table_B
union all
select * from A.table_C

对于问题
1、数据库复制是基本上是实时的,数据量改变不大的情况下几秒中就可以传完
2、出现网络故障会自动重传的。
3、对于这个问题可以使用@@servername这个系统全局变量来取得当前服务器的数据库名字。
4、合并复制能解决数据冲突的问题,但是难点在于数据冲突解决起来会比较麻烦。

新问题:
如果要在主服务器端更新数据的话因为是不同的表,所以最好是写一个更新的存储过程/或是动态语句,根据客服服务器的名字来更新相应的表,编程会有一点麻烦

热点排行