1. Oracle 复制 means replication ?   Actually you can realize data sharing between 2 databases by using Database Link , Snapshot , replication . Details please refer oracle manual , it's a quite big topic

解决方案 »

  1.   

    Oracle 8高级数据复制技术
    (作者:石骁騑)  本文首先简单介绍和数据库复制有关的基本概念,然后探讨Oracle8数据复制技术中的几个重要模型,最后介绍Oracle8的数据复制管理器以及如何利用它来配置和维护复制环境。   在文章的开头,我想首先简单谈一下复制的基本概念,也就是什么是复制?复制简单地说就是在由两个或者多个数据库系统构成的一个分布式数据库环境中拷贝数据的过程。Oracle高级复制,也称为对称复制,第一次是在Oracle 7.1.6版本中出现的,在这之前的Oracle版本中,Oracle数据复制方法仅有只读快照形式的基本复制一种方法。随着Oracle版本的每一次升级,数据复制的功能、管理以及速度等方面都得到了很大的改进和完善。目前,由于对分布式数据环境需求的不断增长,越来越多的应用提出了数据复制的需求。 一、基本概念 
      1.分布式数据库技术   分布式数据库技术是目前我们经常提及的分布式计算的一个重要组成部分,该技术允许数据在多个服务器端共享。采用分布式数据库技术,一个本地服务器可以存取不同物理地点的远程服务器上的数据;也可以使所有的服务器均可以持有数据的拷贝/复制,这样分布式系统中的所有服务器均可进行本地存取。   设计一个分布式计算解决方案首先需要考虑的问题就是应用的完整性、复杂性、性能和可用性以及响应时间等,同时还需要考虑的是对于不同的应用需求是采用实时存取远程数据还是采用延迟存取远程数据。这对于数据复制来讲就是采取实时更新复制方案还是延迟数据复制方案。   2.同步和异步的概念   同步分发数据库技术是一种实时远程存取和实时更新数据的技术。这种技术可以保证应用的完整性降低了应用的复杂性,但是如果系统存在网络存取速度很慢这样的问题,相应响应时间就会很慢。   异步分发数据库技术是一种延迟远程存取和延迟传播对数据更新的技术。这种技术具有很高的可用性和很短的响应时间。相比同步分发数据库技术就显得复杂一些,为了确保应用的完整性需要仔细考虑和设计。   对于实际的商业问题,必须权衡这两种技术的利弊最终选择最佳的解决方案,有些问题选用同步技术比较适合,也有一些问题采用异步技术是比较好的解决方案,还有一些问题必须综合这两种技术。   3.复制的概念   复制,顾名思义就是将数据库中的数据拷贝到不同物理地点的数据库中以支持分布式应用,它是整个分布式计算解决方案的一个重要组成部分。上面介绍了同步和异步的概念,这里针对复制也存在同步复制和异步复制的问题。   同步复制,复制数据在任何时间在任何复制节点均保持一致。如果复制环境中的任何一个节点的复制数据发生了更新操作,这种变化会立刻反映到其他所有的复制节点。这种技术适用于那些对于实时性要求较高的商业应用中。   异步复制,所有复制节点的数据在一定时间内是不同步的。如果复制环境中的其中的一个节点的复制数据发生了更新操作,这种改变将在不同的事务中被传播和应用到其他所有复制节点。这些不同的事务间可以间隔几秒,几分种,几小时,也可以是几天之后。复制节点之间的数据临时是不同步的,但传播最终将保证所有复制节点间的数据一致。   4.更新冲突   在异步复制环境中,对于所有应用最关键的就是要确保数据的一致性。我们来看下面这种情况会有什么后果发生呢?在同一时间对同一个表的同一行数据的同一列在两个不同的地点作更新。这种情况就会发生称之为更新冲突的错误。为保证数据的一致性,更新冲突必须被检测到并且处理以确保在不同地点的数据元素保持同样的值。更新冲突可以通过限制"所有权" 到单一节点或者将更新某个特定数据元素的权利限制到某一具体节点的方法来避免。 二、Oracle 8数据复制应用模型(usage models) 
      为确保实际应用数据的一致性,必须在异步复制应用模型中考虑冲突避免或者冲突检测和消除的方法。例如,对于一个实际商业应用,首先必须在逻辑上了解该商业应用采取的冲突避免方法和在某个节点有那些数据以及这些数据中那些是可更新的,而那些又是不可更新的。在下面的这一部分中,我们首先将详细讨论两种常用的冲突避免方法:主站点所有权模型和动态所有权模型。然后,讨论共享所有权模型以及这种模型引起的冲突检测和处理问题,最后,讨论针对Fail-over的复制配置,这种复制方案同时考虑了冲突避免和冲突检测与消除两种情况。   1.主站点所有权   主站点所有权,异步复制数据被一个单一节点"所有",这些要复制的数据仅能被该节点更新,其他节点向拥有该数据的主节点订阅(subscribe)数据,这意味着他们在本地系统上只能够存取这些复制数据的只读拷贝。下面是一些这样的例子。   (1)决策支持系统(DSS)的联机事务处理数据的卸载。来自一个或者多个OLTP系统的数据可以被卸载到一个独立的局部DSS中,用于只读分析。   (2)中央信息的分发。产品信息,如价格列表等在总部节点上维护,然后将这些信息复制到远程销售办事处的只读产品目录系统中。   (3)远程信息的集中。许多远程节点上的产品目录数据复制到总部节点,这里总部节点只需要有数据只读的权限。   一个主节点拥有一个表的完全所有权,而其他节点只能订阅这个表的只读拷贝。也可以是多个主节点拥有同一个表的截然不同子集或者划分,而另一些节点则订阅这些子集或者划分的只读拷贝。如,一个分布的产品目录系统可以让不同的销售办事处拥有一个表的属于自己的一个"水平"部分,如在客户(CUSTOMERS)表, 订单(ORDERS)表和目录(ITEMS)这些表中含有每个销售办事处为之服务的客户和产品信息。中心总部节点可以通过订阅每个办事处拥有的数据来保持一个完整的所有产品和客户信息的只读拷贝。   2.动态所有权   动态所有权,异步更新将复制数据从一个节点移到另一个节点,而在该过程中,必须保证在同一时刻只有一个特定的节点可以对数据进行更新。一个典型实际应用就是"海关订单处理系统",订单处理的典型步骤是,报关→同意→装运→开单→收单→入帐等。应用模型可以执行其中的任何步骤,但必须保证各个不同模块的同一个数据应该在一个综合数据库中。在该系统中,当且仅当订单的状态表明前一个步骤已经完成时,下一个应用模块才可以执行更新订单数据的操作。例如,"装运"应用模块仅能在"报关"并且得到"同意"后才能被执行。   通过使用动态所有权复制模型,可以将一个系统分布在多个节点和数据库上,也就是说应用模型可以建立在不同的系统上。我们还是来看上面的例子,"报关"和"批准"这两部分可以运行在一个系统上,"装运"在另一个系统上,"开单"和"收单"等又可在一个系统上。在这个分布式系统中,数据可以被复制到不同的节点上,这些节点对复制的数据只要具有只读的权限即可。如,利用复制,"报关"节点可以监视已经报关的订单处理过程。   前面讨论的主节点所有权和动态所有权复制模型具有一个共同的特征:在任何一个给定的时间点,只允许一个节点有更新数据的权利,而其余节点对于复制的数据拷贝仅有只读权限。然而,还存在这样的情况,允许多个节点可以更新同一个数据,在极端情况下可以是在同一时刻,这就是所说的共享所有权。   3.共享所有权   共享所有权使用异步复制,这对于主节点和动态所有权模型来讲存在一些限制。在共享所有权情况下,整个系统可以存在暂时的不一致,同时必须使用冲突检测和消除。共享所有权模型相对于前面两种模型具有一些新的特点。   例如,对于前面我们讨论的那个采用具有水平划分主节点复制方案来的分布式"订单处理系统"的例子。采用共享所有权模型,每个销售办事处都有库表中不同的水平划分,该库表含有每一个办事处为之服务的一些订单信息和与消费者有关的顾客信息。每一个销售办事处只输入与自己有关的顾客订单情况,而不管其余顾客信息。   然而,在实际商业应用中,这个模型不是最佳的选择。例如,这种情况,一个零售集团在一个大城市中可以有好几个商场。顾客可能经常去离他们住的最近的那个商场,但是偶尔也可能到其他商场去购物。这时,如果多家商场执行更新同一个顾客和其订单数据的信息,更新冲突就会发生。所以在这种情况下必须要采用冲突检测和消除方案。   Oracle8高级复制支持同时既考虑冲突避免又考虑冲突检测和消除的复制模型。Oracle8高级复制之所以又称为对称复制,其原因之一就是支持对称复制模型,也就是可以在任何地方更新,即所有的复制节点都可以进行更新处理。为了避免冲突,一种方法就是将应用设计为将更新限制在一些特定的节点。对于共享所有权,Oracle 8提供了自动冲突检测和消除方案。   4.备用数据库(Fail-Over )   异步复制通过将一个主系统数据复制到另一系统,可以起到对主系统的崩溃提供保护的作用,这也就是所说的fail-over系统,如果主系统出现问题,业务依旧可以通过复制数据库进行。   Oracle 8高级复制支持这种fail-over配置。同时,Oracle也针对fail-over提供了另外两个可选的解决方案:Oracle并行服务器和备用数据库配置。用户可以根据吞吐量、可用性、事务损失的可能性和其他一些如数据一致性、方法的局限性等参考指标来权衡选择合适的fail-over方案。 
    三、Oracle 高级复制配置 
      Oracle 8高级复制即可支持基于整个表的复制也可支持基于部分表的复制两种复制方案。这两种复制方案主要是通过Oracle的两种复制机制来完成的,即多主复制和可更新快照复制,同时还可以将这两种复制机制结合起来以满足不断变化的业务需求。   1.多主复制   多主复制方案支持全表在各个主节点间的对称复制,允许所有主节点对主表都有更新操作的权利。任何一个主节点上的复制表的更新都会被传播并被直接应用到其他所有主表。一个主节点出现问题,不会对其他主节点之间变化的传播造成影响。   多主复制采用一种称为"延迟远程过程调用(deferred remote p
      

  2.   

    在Oracle中实现数据库的复制
     在Internet上运作数据库经常会有这样的需求:把遍布全国各城市相似的数据库应用统一起来,一个节点的数据改变不仅体现在本地,还反映到远端。复制技术给用户提供了一种快速访问共享数据的办法。 
    一、实现数据库复制的前提条件 
    1、数据库支持高级复制功能 
    您可以用system身份登录数据库,查看v$option视图,如果其中Advanced replication为TRUE,则支持高级复制功能;否则不支持。 
    2、数据库初始化参数要求 
    ①、db_domain = test.com.cn 
    指明数据库的域名(默认的是WORLD),这里可以用您公司的域名。 
    ②、global_names = true 
    它要求数据库链接(database link)和被连接的数据库名称一致。 
    现在全局数据库名:db_name+”.”+db_domain 
    ③、有跟数据库job执行有关的参数 
    job_queue_processes = 1 
    job_queue_interval = 60 
    distributed_transactions = 10 
    open_links = 4  
    第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。  
    第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。  
    如果修改了以上这几个参数,需要重新启动数据库以使参数生效。 
    二、实现数据库同步复制的步骤 
    假设在Internet上我们有两个数据库:一个叫深圳(shenzhen),一个叫北京(beijing)。 
    具体配置见下表: 
    数据库名 shenzhen beijing 
    数据库域名 test.com.cn test.com.cn 
    数据库sid号 shenzhen beijing 
    Listener端口号 1521 1521 
    服务器ip地址 10.1.1.100 10.1.1.200 
     
    1、确认两台数据库之间可以互相访问,在tnsnames.ora里设置数据库连接字符串。 
    ①、例如:深圳这边的数据库连接字符串是以下的格式 
    beijing = 
    (DESCRIPTION = 
    (ADDRESS_LIST = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.200)(PORT = 1521)) 

    (CONNECT_DATA = 
    (SERVICE_NAME = beijing) 

    )  
    运行$tnsping beijing  
    出现以下提示符: 
    Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.200)(PORT=1521)) 
    OK(n毫秒)  
    表明深圳数据库可以访问北京数据库。 
    ②、在北京那边也同样配置,确认$tnsping shenzhen 是通的。 
    2、改数据库全局名称,建公共的数据库链接。 
    ①、用system身份登录shenzhen数据库 
    SQL>alter database rename global_name to shenzhen.test.com.cn; 
    用system身份登录beijing数据库: 
    SQL>alter database rename global_name to beijing.test.com.cn; 
    ②、用system身份登录shenzhen数据库 
    SQL>create public database link beijing.test.com.cn using 'beijing'; 
    测试数据库全局名称和公共的数据库链接 
    SQL>select * from [email protected]
    返回结果为beijing.test.com.cn就对了。 
    用system身份登录beijing数据库: 
    SQL>create public database link shenzhen.test.com.cn using 'shenzhen'; 
    测试数据库全局名称和公共的数据库链接 
    SQL>select * from [email protected]
    返回结果为shenzhen.test.com.cn就对了。 
    3、建立管理数据库复制的用户repadmin,并赋权。 
    ①、用system身份登录shenzhen数据库 
    SQL>create user repadmin identified by repadmin default tablespace users temporary tablespace temp; 
    SQL>execute dbms_defer_sys.register_propagator('repadmin'); 
    SQL>grant execute any procedure to repadmin; 
    SQL>execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin'); 
    SQL>grant comment any table to repadmin; 
    SQL>grant lock any table to repadmin; 
    ②、同样用system身份登录beijing数据库,运行以上的命令,管理数据库复制的用户repadmin,并赋权。 
    说明:repadmin用户名和密码可以根据用户的需求自由命名。 
    4、在数据库复制的用户repadmin下创建私有的数据库链接。 
    ①、用repadmin身份登录shenzhen数据库 
    SQL>create database link beijing.test.com.cn connect to repadmin identified by repadmin; 
    测试这个私有的数据库链接: 
    SQL>select * from [email protected]
    返回结果为beijing.test.com.cn就对了。 
    ②、用repadmin身份登录beijing数据库 
    SQL>create database link shenzhen.test.com.cn connect to repadmin identified by repadmin; 
    测试这个私有的数据库链接 
    SQL>select * from [email protected]
    返回结果为shenzhen.test.com.cn就对了。 
    5、创建或选择实现数据库复制的用户和对象,给用户赋权,数据库对象必须有主关键字。 
    假设我们用ORACLE里举例用的scott用户,dept表。 
    ①、用internal身份登录shenzhen数据库,创建scott用户并赋权 
    SQL>create user scott identified by tiger default tablespace users temporary tablespace temp; 
    SQL>grant connect, resource to scott; 
    SQL>grant execute on sys.dbms_defer to scott; 
    ②、用scott身份登录shenzhen数据库,创建表dept 
    SQL>create table dept 
    (deptno number(2) primary key, 
    dname varchar2(14), 
    loc varchar2(13) ); 
    ③、如果数据库对象没有主关键字,可以运行以下SQL命令添加: 
    SQL>alter table dept add (constraint dept_deptno_pk primary key (deptno)); 
    ④、在shenzhen数据库scott用户下创建主关键字的序列号,范围避免和beijing的冲突。 
    SQL> create sequence dept_no increment by 1 start with 1 maxvalue 44 cycle nocache; 
    (说明:maxvalue 44可以根据应用程序及表结构主关键字定义的位数需要而定) 
    ⑤、在shenzhen数据库scott用户下插入初始化数据 
    SQL>insert into dept values (dept_no.nextval,'accounting','new york'); 
    SQL>insert into dept values (dept_no.nextval,'research','dallas'); 
    SQL>commit; 
    ⑥、在beijing数据库那边同样运行以上①,②,③ 
    ⑦、在beijing数据库scott用户下创建主关键字的序列号,范围避免和shenzhen的冲突。 
    SQL> create sequence dept_no increment by 1 start with 45 maxvalue 99 cycle nocache; 
    ⑧、在beijing数据库scott用户下插入初始化数据 
    SQL>insert into dept values (dept_no.nextval,'sales','chicago'); 
    SQL>insert into dept values (dept_no.nextval,'operations','boston'); 
    SQL>commit; 
    6、创建要复制的组scott_mg,加入数据库对象,产生对象的复制支持 
    ①、用repadmin身份登录shenzhen数据库,创建主复制组scott_mg 
    SQL> execute dbms_repcat.create_master_repgroup('scott_mg'); 
    说明:scott_mg组名可以根据用户的需求自由命名。 
    ②、在复制组scott_mg里加入数据库对象 
    SQL>execute dbms_repcat.create_master_repobject(sname=>'scott',oname=>'dept', type=>'table',use_existing_object=>true,gname=>'scott_mg'); 
    参数说明: 
    sname 实现数据库复制的用户名称 
    oname 实现数据库复制的数据库对象名称 
    (表名长度在27个字节内,程序包名长度在24个字节内) 
    type 实现数据库复制的数据库对象类别 
    (支持的类别:表,索引,同义词,触发器,视图,过程,函数,程序包,程序包体) 
    use_existing_object true表示用主复制节点已经存在的数据库对象 
    gname 主复制组名 
    ③、对数据库对象产生复制支持 
    SQL>execute dbms_repcat.generate_replication_support('scott','dept','table'); 
    (说明:产生支持scott用户下dept表复制的数据库触发器和程序包) 
    ④、确认复制的组和对象已经加入数据库的数据字典 
    SQL>select gname, master, status from dba_repgroup;  
    SQL>select * from dba_repobject; 
    7、创建主复制节点 
    ①、用repadmin身份登录shenzhen数据库,创建主复制节点 
    SQL>execute dbms_repcat.add_master_database  
    (gname=>'scott_mg',master=>'beijing.test.com.cn',use_existing_objects=>true, copy_rows=>false, propagation_mode => 'asynchronous'); 
    参数说明: 
    gname 主复制组名 
    master 加入主复制节点的另一个数据库 
    use_existing_object true表示用主复制节点已经存在的数据库对象 
    copy_rows false表示第一次开始复制时不用和主复制节点保持一致 
    propagation_mode 异步地执行 
    ②、确认复制的任务队列已经加入数据库的数据字典 
    SQL>select * from user_jobs; 
    8、使同步组的状态由停顿(quiesced )改为正常(normal) 
    ①、用repadmin身份登录shenzhen数据库,运行以下命令 
    SQL> execute dbms_repcat.resume_master_activity('scott_mg',false); 
    ②、确认同步组的状态为正常(normal) 
    SQL> select gname, master, status from dba_repgroup; 
    ③、如果这个①命令不能使同步组的状态为正常(normal),可能有一些停顿的复制,运行以下命令再试试(建议在紧急的时候才用): 
    SQL> execute dbms_repcat.resume_master_activity('scott_mg',true); 
    9、创建复制数据库的时间表,我们假设用固定的时间表:10分钟复制一次。 
    ①、用repadmin身份登录shenzhen数据库,运行以下命令 
    SQL>begin 
    dbms_defer_sys.schedule_push ( 
    destination => 'beijing.test.com.cn', 
    interval => 'sysdate + 10/1440', 
    next_date => sysdate); 
    end; 

      
    SQL>begin 
    dbms_defer_sys.schedule_purge ( 
    next_date => sysdate, 
    interval => 'sysdate + 10/1440', 
    delay_seconds => 0, 
    rollback_segment => ''); 
    end; 

      
    ②、用repadmin身份登录beijing数据库,运行以下命令 
    SQL>begin 
    dbms_defer_sys.schedule_push ( 
    destination => ' shenzhen.test.c
      

  3.   

    谢谢 楼上 各位大虾 的指定,再请教一个问题: 
      当 ADSL 如果 断口连接(10小时),
      在这10小时中远端 数据库 发生了 改变,  下次 ADSL 连上后, 在前 10小时的数据 还会
    重新 更新吗? 如果重新更新,他会 自动识别将 远端的数据 传如 ADSL 的数据库,  而不会将ADSL 中数据库中的数据 导入 远端数据库???先谢了!!!
      

  4.   

    3yugui(亿硅):“您可以用system身份登录数据库,查看v$option视图,如果其中Advanced replication为TRUE,”我以 system 登陆,没看到 v$option 这个视图,是不是 名称错了?
      

  5.   

    to 3yugui(亿硅):请问如果我的数据库里有些表、触发器和sequence是动态创建的,有些表、触发器和sequence会被删除,那么将怎样实现两台服务器之间数据的同步?我是要把第二个数据库作为备份数据库实时备份第一个数据库的所有东西,包括表、存储过程、触发器、sequence等。sql server是很容易实现,但oracle怎么做到呢?还有你这个复制要不要 v$option视图里的advanced replication为true?
      

  6.   

    http://www.csdn.net/expert/topic/857/857182.xml?temp=.3185083