两台服务器上的数据同步

yanele 2011-04-27 02:01:18
假设:
1、现有两台服务器,IP分别为:192.168.0.1与192.168.0.2
2、两台服务器都安装的是用SQL2008,分别有数据库A与数据库B,两个数据库在不同的服务器,但库中的表结构完全一样。


如何实现:当数据库A中的test1,test2,test3这三个表,新增,修改,删除等动作时,同步去更新数据库B中对应的test1,test2,test3这三个表?保持两个库的这三个表数据完全一致!
...全文
319 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mannersbing 2011-04-28
  • 打赏
  • 举报
回复
复制订阅是可以实现的,11楼的办法还没有尝试过。
yanele 2011-04-28
  • 打赏
  • 举报
回复
我用7楼的方法,出现下面这个错误,不知道是什么原因,该如何解决?

yanele 2011-04-28
  • 打赏
  • 举报
回复
现在采用7楼的方法,有两个表可以成功触发了。
但有一个表添加触发后,应用程序总会报错:超时已过期!

我现在是用的SQL2008,此表数据记录在30000以上,不知道该如何处理!
yanele 2011-04-28
  • 打赏
  • 举报
回复
我现在是几乎每小时都有更新,希望能是时时的数据信息,当然几分钟的延迟是可以承受的。也许我实际与例子有些差异(实际是两台服务器在不同的网段:192.168.0.1与192.168.40.1)。不成功不知道会不会是这个原因。
haosa 2011-04-28
  • 打赏
  • 举报
回复
创建DBlinke、create proc
再用定式作业每晚零晨自动同步
yanele 2011-04-28
  • 打赏
  • 举报
回复
我按照网上 http://soft.chinabyte.com/database/416/11509416.shtml
说的方法,创建了复制订阅,且同步数据库中的3表。但从上午到现在3个小时了,查看同步状态一直处于进行中,订阅数据库的数据一直未更新。
Q315054403 2011-04-27
  • 打赏
  • 举报
回复
复制技术对系统改进或修改有副 作用,我不喜欢
自己写代码实现,但要注意效率
yanele 2011-04-27
  • 打赏
  • 举报
回复
怎么报这个错呢:
SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。


openrowset('sqloledb','xz';'sa';'',test.dbo.test)
这里改成这样对吗
openrowset('sqloledb','192.168.0.2';'sa';'密码',B.dbo.test1)
yanele 2011-04-27
  • 打赏
  • 举报
回复
这么复杂呀,得慢慢研究一番,看似没有更新动作,只有插入与删除同步。
更新不是要一个字段一个字段的弄呢?
--小F-- 2011-04-27
  • 打赏
  • 举报
回复
--不同服务器数据库之间的数据操作
--************************************************************************************
1、--创建链接服务器
exec sp_addlinkedserver 'ITSV', ' ', 'SQLOLEDB', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV', 'false ',null, '用户名', '密码'


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 '
马老虎 2011-04-27
  • 打赏
  • 举报
回复
订阅!
Help Link
yanele 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 winnerxcf 的回复:]
不用触发器的话,
就要自己写发送包,自己解包了。
这样的话,同步是有时间差的。比如在一分钟之内。。
[/Quote]
能说说具体怎么实现吗?
winnerxcf 2011-04-27
  • 打赏
  • 举报
回复
不用触发器的话,
就要自己写发送包,自己解包了。
这样的话,同步是有时间差的。比如在一分钟之内。。
yanele 2011-04-27
  • 打赏
  • 举报
回复
跨服务器怎么搞触发器呀,不太会。
xuam 2011-04-27
  • 打赏
  • 举报
回复
触发器!
mustudent 2011-04-27
  • 打赏
  • 举报
回复

/*
触发器,将表内容变化记录到中间表,然后使用工作格时执行
不知道发布订阅能不能完成你的功能
*/

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧