假如有两台服务器A和B,都装有Sql2005,同样有数据库DB1,同样含有表T1,只不过T1里边的数据不同。
现在我想以A为准,每天凌晨一点让B里边表T1里边的数据跟A相同(可能流水号除外吧),两方应该执行什么样的操作?
注,只是让某个表同步,而不是整个库同步,因为库里边其他表的数据是有用的。
我搜索了一下,结果有什么日志、镜像、订阅等方法,请问哪种方法比较好?
请配以详细的步骤和说明,本人新手,还不是很熟。谢谢。

解决方案 »

  1.   

    http://topic.csdn.net/u/20081221/23/a3c0a8ed-5fe2-43b2-b403-df1420fb7959.html
      

  2.   

    用JOB
    企业管理器
    --管理
    --SQL Server代理
    --右键作业
    --新建作业
    --"常规"项中输入作业名称
    --"步骤"项
    --新建
    --"步骤名"中输入步骤名
    --"类型"中选择"Transact-SQL 脚本(TSQL)"
    --"数据库"选择执行命令的数据库
    --"命令"中输入要执行的语句:
                          update base set flag=0 where datediff(dd,date,getdate())=0--确定
    --"调度"项
    --新建调度
    --"名称"中输入调度名称
    --"调度类型"中选择你的作业执行安排
    --如果选择"反复出现"
    --点"更改"来设置你的时间安排为一天一次
    然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行设置方法:
    我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
      

  3.   


    --====================================================
    --发布/订阅的效果最好.   
    --自己写触发器同步的实时性和可控制性最好.
    --====================================================
    如果只是简单的数据同步,可以用触发器来实现.下面是例子:   
        
      --测试环境: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   
        
      
      

  4.   

    --另一个手工同步的,定时同步   
        
      --定时同步服务器上的数据   
        
      --例子:   
      --测试环境,SQL   Server2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test   
      --服务器上的表(查询分析器连接到服务器上创建)   
      create   table   [user](id   int   primary   key,number   varchar(4),name   varchar(10))   
      go   
      --以下在局域网(本机操作)   
      --本机的表,state说明:null   表示新增记录,1   表示修改过的记录,0   表示无变化的记录   
      if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[user]')   and   OBJECTPROPERTY(id,   N'IsUserTable')   =   1)   
      drop   table   [user]   
      GO   
      create   table   [user](id   int   identity(1,1),number   varchar(4),name   varchar(10),state   bit)   
      go   
      --创建触发器,维护state字段的值   
      create   trigger   t_state   on   [user]   
      after   update   
      as   
      update   [user]   set   state=1   
      from   [user]   a   join   inserted   b   on   a.id=b.id   
      where   a.state   is   not   null   
      go   
        
      --为了方便同步处理,创建链接服务器到要同步的服务器   
      --这里的远程服务器名为:xz,用户名为:sa,无密码   
      if   exists(select   1   from   master..sysservers   where   srvname='srv_lnk')   
      exec   sp_dropserver   'srv_lnk','droplogins'   
      go   
      exec   sp_addlinkedserver     'srv_lnk','','SQLOLEDB','xz'   
      exec   sp_addlinkedsrvlogin   'srv_lnk','false',null,'sa'   
      go   
        
      --创建同步处理的存储过程   
      if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_synchro]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)   
      drop   procedure   [dbo].[p_synchro]   
      GO   
      create   proc   p_synchro   
      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   srv_lnk.test.dbo.[user]   
      where   id   not   in(select   id   from   [user])   
        
      --同步新增的数据   
      insert   into   srv_lnk.test.dbo.[user]   
      select   id,number,name   from   [user]   where   state   is   null   
        
      --同步修改的数据   
      update   srv_lnk.test.dbo.[user]   set   
      number=b.number,name=b.name   
      from   srv_lnk.test.dbo.[user]   a   
      join   [user]   b   on   a.id=b.id   
      where   b.state=1   
        
      --同步后更新本机的标志   
      update   [user]   set   state=0   where   isnull(state,1)=1   
      --COMMIT   TRAN   
      go   
        
      --创建作业,定时执行数据同步的存储过程   
      if   exists(SELECT   1   from   msdb..sysjobs   where   name='数据处理')   
      EXECUTE   msdb.dbo.sp_delete_job   @job_name='数据处理'   
      exec   msdb..sp_add_job   @job_name='数据处理'   
        
      --创建作业步骤   
      declare   @sql   varchar(800),@dbname   varchar(250)   
      select   @sql='exec   p_synchro'     --数据处理的命令   
      ,@dbname=db_name() --执行数据处理的数据库名   
        
      exec   msdb..sp_add_jobstep   @job_name='数据处理',   
      @step_name   =   '数据同步',   
      @subsystem   =   'TSQL',   
      @database_name=@dbname,   
            @command   =   @sql,   
      @retry_attempts   =   5,   --重试次数   
      @retry_interval   =   5     --重试间隔   
        
      --创建调度   
      EXEC   msdb..sp_add_jobschedule   @job_name   =   '数据处理',     
      @name   =   '时间安排',   
      @freq_type   =   4,   --每天   
      @freq_interval   =   1, --每天执行一次   
      @active_start_time   =   00000 --0点执行   
      go   
        
      

  5.   

    job可以,也是最简单的方式了。其他的就是麻烦一点了。
      

  6.   

    支持这个。
    打开SQL AGENT。
    设置数据库维护计划。写插入的语句,定时。然后执行。
      

  7.   

    此问题已解决,只要定时执行T-sql脚本即可。谢谢。
      

  8.   

    lz,具体执行什么T-sql脚本,可以贴出来吗?