利用数据库复制技术 实现数据同步更新
复制的概念
复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。
SQL复制的基本元素包括
出版服务器、订阅服务器、分发服务器、出版物、文章
SQL复制的工作原理
SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器
SQL SERVER复制技术类型
SQL SERVER提供了三种复制技术,分别是:
1、快照复制(呆会我们就使用这个)
2、事务复制
3、合并复制
只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。
第一先来配置出版服务器
(1)选中指定[服务器]节点
(2)从[工具]下拉菜单的[复制]子菜单中选择[发布、订阅服务器和分发]命令
(3)系统弹出一个对话框点[下一步]然后看着提示一直操作到完成。
(4)当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库(distribution)
第二创建出版物
(1)选中指定的服务器
(2)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令。此时系统会弹出一个对话框
(3)选择要创建出版物的数据库,然后单击[创建发布]
(4)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助) 
(5)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行"SQL SERVER 2000"的数据库服务器
(6)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
(7)然后[下一步]直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。
第三设计订阅
(1)选中指定的订阅服务器
(2)从[工具]下拉菜单中选择[复制]子菜单的[请求订阅]
(3)按照单击[下一步]操作直到系统会提示检查SQL SERVER代理服务的运行状态,执行复制操作的前提条件是SQL SERVER代理服务必须已经启动。
(4)单击[完成]。完成订阅操作。
完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:00:00和23:59:59之间。接下来就是判断复制是否成功了打开C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表

解决方案 »

  1.   

    --如果只是几个表的同步,建议采用手工处理的方法,下面是示例:--测试环境: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
      

  2.   

    你这个问题以前我们也曾讨论过,请你看看下面的内容,或许会对你有帮助:http://expert.csdn.net/Expert/topic/2468/2468286.xml?temp=.890362
      

  3.   

    几点建议和补充:
        下面是一个解决方案(已经有实际应用):
    假设你想动态实现两台联网的计算机分别设为A,B
    A计算机中有数据库DB1,B计算机中也有数据库DB1,
    你的目的就是想让A中的DB1和B中的DB2始终保持一致,对吗?
    1.在B计算机中新增一个数据库实例,一般命名为remote,其下建立
      一个数据库,命名为remote;然后remote和DB1的数据库结构是一样的;
    2.每隔一定时间(由你们的实际情况定),在计算机A上运行一个DTS(将A计算机上的数据库数据传送到B计算机上的remote数据库中);
    3.确认数据无误后,UPDATE remote中的数据到B计算机的数据库DB2中即可;
    (如果你对数据安全性不是很敏感的话,remote数据库可不必建立,可直接用DTS在两个数据库中转换数据)
      

  4.   

    如過你的sql server的系統是windows 2000 advanced server或windows 2003 server,或更高的話,  兩台機子可實限共響硬碟的方法從硬件實現!
      當然若雙機較遠,況且右不能共響硬疊資源的話,最好採取第參方軟件來實現:  專業的備份軟件,如ca雙機熱備.
      

  5.   

    to jact007(石頭) ( ) 
    兩台機子可實限共響硬碟的方法從硬件實現!?可以讲的详细一点吗?
      

  6.   

    基于文件级的备份软件,很成熟的有 ARCSERVER,LEGATO OCTOPUS等,
    这些都是国外的软件,经过长时间的考验了,由于是基于文件级的,所以它
    不管你是SQL SERVER,还是ORACLE,只是忠实的进行文件备份,严格保证源、目标
    文件的高度一致。他们的效率还是很高的,对系统压力挺小。我们用过LEGATO 
    OCTOPUS几年,感觉还可以。但由于它的备份特点,决定了目的备份源如SQL SERVER
    在备份时,是非运行状态;当然目的数据是不是真正与源的一致就不能即时
    检验(虽然我们测过几次,都成功了)。
       还有一些专业的基于数据库级的专业备份软件,我知道的SQL TRANS(SQL BACK),
    是基于SQL SERVER,SYBASE的日志备份软件,备份实时性还可以(约10妙或稍多),
    效率、易用性都还不错,能方便的来回切换,支持多节点。
      SQL SERVER上自带的如复制订阅功能,(我认为):
        1。它的实时性不是很强;
        2。备份有一定的局限性,如俺用事务日志备份,它要求备份的表需有主键,
           (若有方法可不必有主键,请指教!!!)俺知道的差不多也就这么多了,希望大家多发表意见。
      

  7.   

    To:  zosky
    我可以發信給你,請告訴我你的e-mail address
      

  8.   

    安装一个磁盘陈列柜,供两台服务器使用将数据库安装在磁盘陈列柜上,这样一台电脑的操作系统停止服务了。另一台就可启动。
    使用windows advance server的群集服务做
    设心跳线
      

  9.   

    可以采用微软的集群方案,设置内网和外网的IP地址
    ,心跳线,资源(一般就是数据库的几个服务),然后分别在两台服务器上面安装SQL SERVER企业版,八数据库文件放在磁盘阵列上面
      

  10.   

    我也有同样的问题,感觉没有更好的解决办法,同时公司不想花钱,
    所以采用自己编程实现,通过TCP/IP协议来传送数据,数据实时性
    比较高,一般1秒以内,但数据量大之后反映就慢了。
      

  11.   

    我们公司用的cluster server做双机热备份
      

  12.   

    pengdali(大力 V3.0) :
     按你说的步骤我总觉得似乎有什么地方没说清楚。
     
     培植那些东西是不是都在原数据库中的“企业管理器”中就可以了?还是需要再到目标数据库中设置?
     所谓的选中指定的服务器是指企业管理器下的数据库所在电脑名还是具体数据库?选中“订阅服务器”是在目标数据库的企业管理器中马?对着你说的那些东西去搞,我满头雾水,没成功啊。
     如果目标数据库中的数据初始并不和原数据库相同,只是表结构相同,并每张表都有identity 自增加的主键,会有什么后果? 不好意思,我对数据库备份这块不是很清楚,请多多指教!