日期:2014-05-18  浏览次数:20701 次

两台机子都装有sql server2008,a做主机 ,b做备机。任何a的更改,同步或异步到b机
平时都访问a机

一、任何a的更改,同步或异步到b机

手动功能:
1
当a死机不可用时,访问b可以更改这个数据的内容

2
当a恢复时,将b的数据同步到a。

3
b继续接受a的异同或同步数据




谢绝粘贴2000,或2005不适用的转贴。

------解决方案--------------------
SQL code
其实也可以考虑触发器同步
--====================================================
--发布/订阅的效果最好.   
--自己写触发器同步的实时性和可控制性最好.
--====================================================


如果只是简单的数据同步,可以用触发器来实现.下面是例子:   
    
  --测试环境:SQL2000,远程主机名:xz,用户名:sa,密码:无,数据库名:test   
    
  --创建测试表,不能用标识列做主键,因为不能进行正常更新   
  --在本机上创建测试表,远程主机上也要做同样的建表操作,只是不写触发器   
  if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[test]')   and   OBJECTPROPERTY(id,   N'IsUserTable')   =   1)   
  drop   table   [test]   
    
  create   table   test(id   int   not   null   constraint   PK_test   primary   key   
  ,name   varchar(10))   
  go   
    
  --创建同步的触发器   
  create   trigger   t_test   on   test   
  for   insert,update,delete   
  as   
  set     XACT_ABORT   on   
  --启动远程服务器的MSDTC服务   
  exec   master..xp_cmdshell   'isql   /S"xz"   /U"sa"   /P""   /q"exec   master..xp_cmdshell   ''net   start   msdtc'',no_output"',no_output   
    
  --启动本机的MSDTC服务   
  exec   master..xp_cmdshell   'net   start   msdtc',no_output   
    
  --进行分布事务处理,如果表用标识列做主键,用下面的方法   
  BEGIN   DISTRIBUTED   TRANSACTION   
  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   
  go   
    
  --插入数据测试   
  insert   into   test   
  select   1,'aa'   
  union   all   select   2,'bb'   
  union   all   select   3,'c'   
  union   all   select   4,'dd'   
  union   all   select   5,'ab'   
  union   all   select   6,'bc'   
  union   all   select   7,'ddd'   
    
  --删除数据测试   
  delete   from   test   where   id   in(1,4,6)   
    
  --更新数据测试   
  update   test   set   name=name+'_123'   where   id   in(3,5)   
    
  --显示测试的结果   
  select   *   from   test   a   full   join   
  openrowset('sqloledb','xz';'sa';'',test.dbo.test)   b   on   a.id=b.id

------解决方案--------------------
2000:Standby Server 2005: Standby Server or Mirror
据说SQL 2005的MIRROR不够稳定
建议找个顾问咨询,而且提供后续技术支持,出点费用根本不多
若你自己在不很熟悉的情况下去玩,若出点什么异常,很难收摊子
------解决方案--------------------
安装windows Server 2003 企业版 + SQL 企业版做群集吧.
------解决方案--------------------
--启动远程服务器的MSDTC服务
exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output

--启动本机的MSDTC服务
exec master..xp_cmdshell 'net start msdtc',no_output
这两句语句是创建连接吗? 能否详细解译一下是怎么创建的。初学都请谅解。本人用的是MS SQL SERVER 2000