精华内容
下载资源
问答
  • oracle 流复制

    2019-04-13 01:40:59
    NULL 博文链接:https://wq-pro.iteye.com/blog/1731319
  • ORACLE流复制

    千次阅读 2009-05-11 10:49:00
    ORACLE流复制 Author: Rainny Date:2009-5-3 ORACLE流复制(Stream Replication)是9I以后推出的,在银行,电信等大型系统中应用广泛.相对于ORACLE前期的复制技术,流复制是新推出的技术,存在一些BUG,但它是ORACLE未来...
    ORACLE流复制
    Author: Rainny
    Date:2009-5-3


    ORACLE流复制 (Stream Replication)9I以后推出的 ,在银行 ,电信等大型系统中应用广泛 .相对于 ORACLE前期的复制技术 ,流复制是新推出的技术 ,存在一些 BUG,但它是 ORACLE未来数据同步的趋势 .原因如下 :
    (1)相当于实体化视图和高级复制 ,流复制对于 PRIMARY数据库性能的影响更小
    (2)流复制相对于高级复制来讲 ,所需的硬件成本要小
    (3)流复制更加灵活 ,支持异构数据库对象的同步

    数据同步一直是数据库技术中投资成本比较大 ,维护难度大的一点 .我们拿生活中的例子来说 ,最活生生的实例就是银行系统 .我们知道 ,银行系统的数据量非常大 ,所以 ,在全国 ,任何银行都有很多数据中心 ,哪怕是一个省一个数据中心 (像北京 ,上海 ,广州 ,深圳等这样的一线的大城市一个市需要一个数据中心 ),中国大陆就会有 31个数据中心 .最理想的状况是只有一个数据中心 ,这样就不存在同步的问题 ,可是 ,这在现实中不允许 ,由于数据量大 ,如果只使用一个数据库 ,性能无法承受 .银行系统需要同步 ,你比如 ,最简单的例子 ,我们跨省存取款 ,或跨行存取款 ,各个数据中心之间就需要同步来进行结算 ,所以 ,银行要购置大量的昂贵设备来进行这样的数据同步 .银行为什么要对异地存取款收取手续费 ,原因就在此 .同样 ,银行之所以要对借记卡收取年费 ,原因也在于成本 ,对于一个银行帐户 ,即使你很少交易,可是银行要维护这些帐户数据 ,所以需要在硬件存储 ,人力技术上花大量的金钱.大型跨国公司的IT系统和银行的例子类似.另外一个生活中的例子就是电信的系统 ,全国的手机用户这么多 ,而电信和移动需要提供的服务又这么多 ,刚就话费的管理和结算 ,电信公司就要花很多的成本来维护很多省公司的数据中心 ,而各个数据中心的数据同步 ,更需要投很多的钱 .
    我们来回顾一下 ORACLE数据同步的技术 .数据同步和复制的概念其实是重叠的 ,数据复制 ,一大部分原因是为了同步 .
    (1)DATAGUARD:物理 STANDBY本质是日志传输和应用重做 (介质恢复 ),逻辑 STANDBY本质上是日志挖掘( log miner
    (2)实体化视图 :ORACLE早期的版本称为快照 (SNAPSHOT),通过实体化日志捕获主表的变化 ,然后通过刷新机制传送到另一端 .
    (3)高级复制 :分两种 :多主体双向同步和实体化视图复制 .多主体实时双向同步本质上是触发器加队列 (TRIGGER+QUEUE),对硬件要求比较高 ,对主数据库的性能也影响也比较大
    (4)流复制 :本质上是日志挖掘 (通过 LOG MINER捕获主数据库的逻辑变化记录 LCRs,通过传播,转换成 SQL应用到复制的另一端 )加队列 .原理上和逻辑 STANDBY相似 .只不过逻辑 STANDBY是整个数据库的复制 ,而流复制可以是单个数据库对象的复制 ,所以比逻辑 STANDBY更加灵活 ,所以支技异构数据库对象的同步 .ORACLE 10G对流复制进行了增强 ,通过实时的日志挖掘 ,流复制的性能提升不少 .
    Oracle Streams enables information sharing. Using Oracle Streams, each unit of shared information is called a message, and you can share these messages in a stream. The stream can propagate information within a database or from one database to another. The stream routes specified information to specified destinations. The result is a feature that provides greater functionality and flexibility than traditional solutions for capturing and managing messages, and sharing the messages with other databases and applications. Streams provides the capabilities needed to build and operate distributed enterprises and applications, data warehouses, and high availability solutions. You can use all of the capabilities of Oracle Streams at the same time. If your needs change, then you can implement a new capability of Streams without sacrificing existing capabilities.
    Using Oracle Streams, you control what information is put into a stream, how the stream flows or is routed from database to database, what happens to messages in the stream as they flow into each database, and how the stream terminates. By configuring specific capabilities of Streams, you can address specific requirements. Based on your specifications, Streams can capture, stage, and manage messages in the database automatically, including, but not limited to, data manipulation language (DML) changes and data definition language (DDL) changes. You can also put user-defined messages into a stream, and Streams can propagate the information to other databases or applications automatically. When messages reach a destination, Streams can consume them based on your specifications.
    展开全文
  • Oracle流复制

    2015-01-20 21:03:28
    流复制(Stream replication)只是基于它的一个数据共享技术,也可以被用作一个可灵活定制的高可用性方案。 它可以实现两个数据库之间数据库级,schema级,Table级的数据同步,并且这种同步可以是双向的。 Or

    Stream 是Oracle 的消息队列(也叫Oracle Advanced Queue)技术的一种扩展应用。 Oracle 的消息队列是通过发布/订阅的方式来解决事件管理。流复制(Stream replication)只是基于它的一个数据共享技术,也可以被用作一个可灵活定制的高可用性方案。 它可以实现两个数据库之间数据库级,schema级,Table级的数据同步,并且这种同步可以是双向的。 Oracle Stream也是通过数据冗余来提高可用性,这一点和Data Guard 类型。
      Oracle 高级复制(Oracle advanced Replication) 和流复制(Stream Replication) 是从名称和功能上都相似的两种技术。 但前者是基于触发器的,后者是基于日志挖掘(Logminer)技术。
      1. Stream 的工作原理
      Stream 是Oracle Advanced Queue技术的一种扩展应用, 这种技术最基本的原理就是收集事件,把时间保存在队列中,然后把这些事件发布给不同的订阅者。 从DBA的角度来说, 就是把捕获Oracle数据库产生的Redo日志,然后把这些日志通过网络传播到多个数据库,其他数据库通过应用这些日志,达到复制变化的作用。
      在Stream 环境下, 复制的起点数据库叫作Source Database, 复制的终点数据库叫作Target Database。 在这两个数据库上都要创建一个队列,其中的Source Database上的是发送队列,而Target Database上的是接收队列。
      数据库的所有操作都会被记录在日志中。 配好Stream环境后, 在Source Database上会有一个捕获进程(Capture Process), 该进程利用Logminer技术从日志中提取DDL,DML语句,这些语句用一种特殊的格式表达,叫作逻辑变更记录(Logical Change Record, LCR). 一个LCR对应一个原子的行变更,因此源数据库上的一个DML语句,可能对应若干个LCR记录。 这些LCR会保存到Sourece Database的本地发送队列中。然后传播进程(Propagation Process)把这些记录通过网络发送到Target Database的接收队列。 在Target Database上会有一个应用进程(Apply Process), 这个进程从本地的接收队列中取出LCR记录,然后在本地应用,实现数据同步
      2. Data Guard 和Stream 区别
      Date Guard有两种类型:physical standby 和 logical standby。 这两中standby 都有3个功能模块: 日志传送;日志接收,日志恢复。两种standby在前两个模块中是一样的,都是通过LGWR或者ARCn进程发送日志,通过RFS进程接受日志。 区别在第三个模块:
      Physical Standby 使用的是Media Recovery技术直接在数据块级别进行恢复, 因此Physical Standby 能够做到两个数据库的完全同步, 没有数据类型限制。
      Logical Standby实际是通过Logminer技术,把日志中的记录还原成SQL语句,然后通过Apply Engine 执行这些语句实现数据同步, 因此Logical Standby不能保证数据的完全一致。 比如Logical Standby 不支持某些数据类型,这一点在选择Logical Standby时必须要考虑. Logical Standby 不支持的数据类型可以从DBA_LOGSTDBY_UNSUPPORTED是不里查看.
      SQL>SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;
      Stream 使用的是Logical Standby 第三个模块,也就是在Source Database一端,Capture 进程利用Logminer 技术把日志内容还原成LCR, 然后发送到Target Database, 而在Target database 一端, 也是通过Apply Engine 执行这些LCR。 因此Stream在使用上也有些限制条件。这些可以从视图ALL/DBA_STREAMS_NEWLY_SUPPORTED, ALL/DBA_STREAMS_UNSUPPORTED 查看stream复制不支持的数据类型。
      SQL>SELECT table_name, reason FROM ALL_STREAMS_NEWLY_SUPPORTED;
      SQL>SELECT table_name, reason FROM DBA_STREAMS_NEWLY_SUPPORTED;
      SQL>SELECT table_name, reason FROM DBA_STREAMS_UNSUPPORTED;
      SQL>SELECT table_name, reason FROM ALL_STREAMS_UNSUPPORTED;
      下面以图表的形式列举他们的区别:
      Streams
      Data Guard
      主要目的是数据共享
      主要目的是灾难恢复和高可用性
      可以多方向同步
      只能是单向,从Primary--> Standby
      数据粒度可以是数据库,Schema,Table三个级别
      只有数据库级别
      支持异种平台的同步(Heterogeneous Platforms)
      必须同种平台 (Homogeneous Platforms)
      参与复制的每个数据库可以读写
      只有Primary可以读写,Standby 只读
      支持Oracle 和非Oracle 数据库间的同步
      只能是Oracle数据库间
      3. 前期规划的几点:
      1). 确定复制集:如是数据库级还是表级
      2). 决定复制站点
      3). 决定LCR是本地捕获还是下游捕获
      本地捕获: 在源数据库进行,从联机日志和归档日志获得LCR
      下游捕获:在目标数据库进行,从归档日志获得LCR.
      本地捕获可以保护更多的数据,但是会占用源数据库的资源。
      4). 决定复制拓扑结构:这时要决定复制数据库的用途,是只用于预防灾难,还是平时保持空闲,或允许用户使用。
      4. Streams Replication 实例
      4.1 准备工作:
      DBA是源数据库, DBA2是目标数据库
      4.1.1 源数据库和目标数据库必须是归档的
      SQL> startup mount;
      SQL> alter database archivelog;
      SQL> alter database open;
      SQL> archive log list
      归档与非归档的切换请参考:
      http://blog.csdn.net/tianlesoftware/archive/2009/1 0/18/4693470.aspx
      或者
      http://user.qzone.qq.com/251097186/blog/1236924069
      4.1.2. 源数据库和目的数据库均需要设置的参数:
      alter system set global_names=true scope = both;
      默认为false, Database Link 使用的是数据库的global_name。

    alter system set aq_tm_processes=2 scope=both;
      以下参数都是10G的默认值, 检查下就可以了. 无需设置
      如:Show parameter job_queue_processes
      alter system set job_queue_processes = 10 scope=both;
      alter system set sga_target = 300m scope=spfile;
      alter system set open_links=4 scope=spfile;
      alter system set statistics_level='TYPICAL' scope=both;
      10g 默认为Typical, 性能统计模式
      alter system set logmnr_max_persistent_sessions=1 scope=spfile;
      10g 默认为1,持久的日志挖掘会话数。
      alter system set "_job_queue_interval"=1 scope=spfile;
      alter system set aq_tm_processes=1;
      alter system set streams_pool_size=200m scope=both;
      注意streams_pool_size一定要够大,因为如果启用了SGA_TARGET,ORACLE可能分配很少内存给stream导致大量信息被 spill到磁盘导致查询DBA_APPLY,DBA_CAPTURE,DBA_PROPGATION全部状态ENABLED但就是没有数据被同步。
      同时设置_job_queue_interval也是为了提高队列检查时间,防止apply出问题。
      注意:与复制有关的2个参数: 如果等了足够长的时间发现数据没有复制过来,仔细检查了capture/propagation/apply各进程的状态都是正常的, 并检查参数.
      alter system set "_job_queue_interval"=1 scope=spfile;
      并且将aq_tm_processes参数改为1(我原来这是为10)
      alter system set aq_tm_processes=1;
      改完后重启,发现数据就可以去了。这个隐含参数只是控制对job队列的检查频率,默认5秒。
      4.1.3 . 在源数据库上启用追加日志
      可以基于Database级别或Table级别,启用追加日志(Supplemental Log)。在建立根据Schema粒度进行复制的Oracle Stream环境中,如果确认Schema下所有Table都有合理的主键(Primary Key),则不再需要启用追加日志。
      #启用Database 追加日志
      alter database add supplemental log data;
      #启用Table追加日志
      alter table add supplement log group log_group_name(table_column_name) always;
      4.1.4 . 源数据库和目的数据库创建相同表空间和用户并赋权
      创建表空间:
      CREATE TABLESPACE streams_tbs DATAFILE 'D:\ORACLE\ORADATA\DBA\streams_tbs.dbf' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
      CREATE TABLESPACE streams_tbs DATAFILE 'D:\ORACLE\ORADATA\DBA2\streams_tbs.dbf' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
      创建用户:
      CREATE USER strmadmin IDENTIFIED BY strmadmin DEFAULT TABLESPACE streams_tbs
      QUOTA UNLIMITED ON streams_tbs;
      赋权:
      GRANT DBA to strmadmin;
      exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('strmadmin ');
      4.1.5 配置listener.ora和tnsnames.Ora
      DBA2 =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.10.80)(PORT = 1521))
      (CONNECT_DATA = http://blog.soso.com/qz.q/
      (SERVER = DEDICATED)
      (SERVICE_NAME = DBA2.anqingren.org)
      )
      )
      4.1.6 创建DBLink
      先用strmadmin登陆,在创建dblink
      4.1.6.1在源端建到目库的db link
      SQL> conn strmadmin/strmadmin;
      已连接。
      SQL> create database link DBA2 connect to strmadmin identified by strmadmin using 'dba2';
      数据库链接已创建。
      测试:
      SQL> select * from global_name@dba2;
      GLOBAL_NAME
      -------------------
      DBA2.ANQINGREN.ORG
      4.1.6.2 在目端建到源库的db link
      SQL> conn strmadmin/strmadmin;
      已连接。
      SQL> create database link dba connect to strmadmin identified by strmadmin using 'dba';
      数据库链接已创建。
      4.2 用户级的复制(不支持sys和system用户)
      4.2.1 最初的用户复制
      分别在源库和目标数据库上创建测试用户
      SQL>create user dave identified by dave;
      SQL>grant dba to dave;
      4.2.1 在源数据库上创建Source 队列
      connect strmadmin/strmadmin@dba;
      BEGIN
      DBMS_STREAMS_ADM.SET_UP_QUEUE(
      queue_table => 'SOURCE_QUEUE_TABLE', --队列表
      queue_name => 'SOURCE_QUEUE', --队列
      queue_user => 'strmadmin'); --队列用户
      END; / 或者: SQL> EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE(); PL/SQL procedure successfully completed. 该命令会创建一个队列缺省名:streams_queue,队列表缺省是:STREAMS_QUEUE_TABLE

    队列存储的object类型是anaydata
      移除队列:
      exec dbms_streams_adm.remove_queue(
      queue_name => 'streams_queue',
      cascade => true,
      drop_unused_queue_table => true);.
      可以用查询dba_queues,dba_queue_tables来检查:
      SQL> select owner,queue_table,name from dba_queues where owner='STRMADMIN';
      OWNER QUEUE_TABLE NAME
      ----------------- ------------------------- ------------------
      STRMADMIN SOURCES_QUEUE_TABLE SOURCES_QUEUE
      STRMADMIN SOURCES_QUEUE_TABLE AQ$_SOURCES_QUEUE_TABLE_E
      SQL>select owner,queue_table,object_type from dba_queue_tables where owner='STRMADMIN';
      OWNER QUEUE_TABLE OBJECT_TYPE
      -------------- --------------------- ------------------
      STRMADMIN SOURCES_QUEUE_TABLE SYS.ANYDATA
      4.2.2 在目标数据库DBA2上创建接收队列
      connect strmadmin/strmadmin@dba2;
      BEGIN
      DBMS_STREAMS_ADM.SET_UP_QUEUE(
      queue_table => 'TARGET_QUEUE_TABLE', --队列表
      queue_name => 'TARGET_QUEUE', --队列
      queue_user => 'strmadmin'); --队列用户
      END;
      /
      可以用查询dba_queues,dba_queue_tables来检查:
      SQL> select owner,queue_table,name from dba_queues where owner='STRMADMIN';
      OWNER QUEUE_TABLE NAME
      ------------------ --------------------- ----------------
      STRMADMIN TARGET_QUEUE_TABLE TARGET_QUEUE
      STRMADMIN TARGET_QUEUE_TABLE AQ$_TARGET_QUEUE_TABLE_E
      4.2.3 在源数据库上创建capture 进程
      SQL>conn strmadmin/strmadmin@DBA;
      SQL> BEGIN
      DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
      schema_name => 'dave', -- 用户名,如dave, 非sys或者system
      streams_type => 'capture',
      streams_name => 'capture_stream',
      queue_name => 'strmadmin.SOURCE_QUEUE',
      include_dml => true,
      include_ddl => true,
      source_database => 'DBA',
      include_tagged_lcr => false,
      inclusion_rule => true);
      END;
      /
      PL/SQL procedure successfully completed.
      可以通过dba_capture查看:
      SQL> select CAPTURE_NAME,QUEUE_NAME,START_SCN,STATUS,CAPTURE_T YPE from dba_capture;
      CAPTURE_NAME QUEUE_NAME START_SCN STATUS CAPTURE_TY
      ------------------------- ---------------------------- ---------- -------------- ----------------
      CAPTURE_STREAM1 SOURCES_QUEUE 1294052 DISABLED LOCAL
      SQL> select * from ALL_CAPTURE_PREPARED_SCHEMAS;
      SCHEMA_NAME TIMESTAMP SUPPLEME SUPPLEME SUPPLEME SUPPLEME
      -------------------- -------------- -------- -------- -------- --------
      SYSTEM 20-10月-09 IMPLICIT IMPLICIT IMPLICIT NO 4.2.4 在源数据库上创建传播进程
      SQL>conn strmadmin/strmadmin@DBA;
      SQL> BEGIN
      DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES(
      schema_name => 'dave',
      streams_name => 'source_to_target',
      source_queue_name => 'strmadmin.SOURCE_QUEUE',
      destination_queue_name => 'strmadmin.TARGET_QUEUE@DBA2', --此队列待创建
      include_dml => true,
      include_ddl => true,
      source_database => 'DBA',
      inclusion_rule => true,
      queue_to_queue => true);
      END;
      /
      PL/SQL procedure successfully completed.
      重新启动propagation process
      --dbms_propagation_adm.start_propagation (propagation_name)
      --其中propagation_name可以从表all_propagation中取得
      select * from all_propagation;
      SQL> exec dbms_propagation_adm.start_propagation('source_to_ target');
      exec dbms_propagation_adm.stop_propagation('source_to_t arget');

    PL/SQL procedure successfully completed.
      select * from all_propagation;
      可以通过dba_propagations查看结果:
      SQL> select PROPAGATION_NAME,SOURCE_QUEUE_NAME,DESTINATION_QUE UE_NAME,DESTINATION_DBLINK,STATUS from dba_propagation;
      PROPAGATION_NAME SOURCE_QUEUE_NA DESTINATION_QUE DESTINATION_DBLINK STATUS
      ------------------ --------------- --------------- ------------------ --------
      STREAM1_TO_STREAM2 SOURCES_QUEUE TARGET_QUEUE DBA2.ANQINGREN.ORG ENABLED
      #修改propagation休眠时间为0,表示实时传播LCR。
      begin
      dbms_aqadm.alter_propagation_schedule(
      queue_name => 'SOURCE_QUEUE',
      destination => 'DBA2',
      latency => 0);
      end;
      /
      4.2.5 在目标数据库DBA2上创建Apply进程
      SQL> BEGIN
      DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
      schema_name => 'SYSTEM',
      streams_type => 'apply',
      streams_name => 'target_apply_stream',
      queue_name => 'strmadmin.TARGET_QUEUE',
      include_dml => true,
      include_ddl => true,
      include_tagged_lcr => false,
      source_database => 'DBA',
      inclusion_rule => true);
      END;
      /
      可以通过:
      dba_apply
      v$streams_apply_reader
      v$streams_apply_coordinator
      v$streams_apply_server
      查看状态
      SQL> select apply_name,queue_name,status from dba_apply;
      APPLY_NAME QUEUE_NAME STATUS
      ------------------------------ ------------------------------ --------
      TARGET_APPLY_STREAM TARGET_QUEUE DISABLED
      4.2.6 实例化复制数据库
      4.2.6.1 用exp/imp 完成实例化
      带数据完成源端exp和目端的import: Exp USERID=SYSTEM/ADMIN@DBA OWNER=SYSTEM FILE=D:\STRM.dmp LOG=STRM.log OBJECT_CONSISTENT=Y STATISTICS = NONE imp USERID=SYSTEM/ADMIN@DBA2 FULL=Y CONSTRAINTS=Y FILE=D:\STRM.dmp IGNORE=Y COMMIT=Y LOG=D:\import.log STREAMS_INSTANTIATION=Y 或仅作实例化(不带数据):
      exp USERID=SYSTEM/ADMIN@DBA OWNER=SYSTEM FILE=D:\STRM.dmp LOG=D:\export.log OBJECT_CONSISTENT=Y STATISTICS = NONE ROWS=NO
      imp USERID=SYSTEM/ADMIN@DBA2 FULL=Y CONSTRAINTS=Y FILE=D:\STRM.dmp COMMIT=Y LOG=D:\import.log STREAMS_INSTANTIATION=Y IGNORE=Y
      4.2.6.2 直接设置SCN的方式进行实例化:
      ---获取源库互置用户的SCN
      connect strmadmin/strmadmin@DBA
      set serveroutput on
      DECLARE
      iscn NUMBER; -- Variable to hold instantiation SCN value
      BEGIN
      iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
      DBMS_OUTPUT.PUT_LINE ('Instantiation SCN is: ' || iscn);
      END;
      /
      ---设置为目标库互置用户的SCN
      connect strmadmin/strmadmin@DBA2
      BEGIN
      DBMS_APPLY_ADM.SET_SCHEMA_INSTANTIATION_SCN(
      source_schema_name => 'SYSTEM',
      source_database_name => 'DBA',
      instantiation_scn => &iscn);
      END;
      /
      4.2.7. 在目标数据库上启动Apply进程
      connect strmadmin/strmadmin@DBA2
      SQL> BEGIN
      DBMS_APPLY_ADM.SET_PARAMETER(apply_name => 'target_apply_stream', parameter
      => 'disable_on_error', VALUE =http://blog.soso.com/qz.q/>'n');
      END;
      /
      SQL> BEGIN
      DBMS_APPLY_ADM.START_APPLY(
      apply_name => 'target_apply_stream');
      END;
      /
      #停止Apply进程
      begin
      dbms_apply_adm.stop_apply(
      apply_name => 'target_apply_stream');
      end;
      /
      查看状态
      SQL> select apply_name,queue_name,status from dba_apply;

    APPLY_NAME QUEUE_NAME STATUS
      ------------------------------ ------------------------------ --------
      TARGET_APPLY_STREAM TARGET_QUEUE ENABLED
      4.2.8 在源数据库上启动capture
      connect strmadmin/strmadmin@DBA
      SQL> BEGIN
      DBMS_CAPTURE_ADM.START_CAPTURE(
      capture_name => 'capture_stream');
      END;
      /
      #停止Capture进程
      begin
      dbms_capture_adm.stop_capture(
      capture_name => 'capture_stream');
      end;
      / 查看状态:
      SQL> select capture_name,status from dba_capture;
      CAPTURE_NAME STATUS
      --------------- --------
      CAPTURE_STREAM ENABLED
      4.3 表级的复制
      maintain_tts 表空间复制
      maintain_schemas 用户复制
      maintain_tables 表复制的
      与dbms_streams_adm的maintain_global、maintain_tts、maintain_schemas等过程相比,maintain_tables过程使用则更灵活,可以为某些特殊的表拿出来单独配置,maintain_tables也象其它的过程一样,提供了一蓝子解决方案,如果要添加新的表到复制中,只需要再次执行maintain_tables过程即可。
      4.3.1 在stream进行配置前,需要做些准备工作
      A 源库与目标库初始化参数的设置
      alter system set aq_tm_processes=1 scope=spfile;
      alter system set job_queue_processes=2 scope=spfile;
      alter system set global_names=true scope=spfile;
      alter system set streams_pool_size=20m scope=spfile;
      说明streams_pool_size在生产环境中最好>200m
      B 源库与目标库tnsnames.ora配置
      见4.1
      C 源库与目标库复制管理员的创建
      见4.1
      D 在源库与目标库创建DBLINK
      见4.1
      E 源库与目标库必须处于归档模式
      见4.1
      F 源库与目标库必须创建directory
      connect strmadmin/strmadmin@DBA;
      create directory DIR_DBA as 'D:\Stream\DBA';
      connect strmadmin/strmadmin@DBA2;
      create directory DIR_DBA2 as 'D:\Stream\DBA2';
      说明:在复制表空间时,创建directory需要指定该表空间所在的目录
      G 创建测试用的表空间及表
      CREATE TABLESPACE DAVE DATAFILE 'D:\ORACLE\ORADATA\DBA\DAVE.dbf' SIZE 100M;
      create user tianle identified by tianle default tablespace DAVE;
      grant dba to tianle;
      conn TIANLE/TIANLE
      create table test(id int,name varchar2(20));
      create table test2(id int,name varchar2(20));
      insert into test values(1,'dave');
      insert into test values(2,'bl');
      不能使用默认的表空间.
      4.3.2 在源库执行MAINTAIN_TTS过程
      SQL>connect strmadmin/strmadminpw@DBA;
      declare
      v_tables dbms_utility.uncl_array;
      begin
      v_tables(1) := 'tianle.test;
      v_tables(2) := 'tianle.test2';
      dbms_streams_adm.maintain_tables(
      table_names => v_tables,
      source_directory_object => null,
      destination_directory_object => null,
      source_database => 'DBA',
      destination_database => 'DBA2',
      perform_actions => true,
      bi_directional => false,
      include_ddl => true,
      instantiation => dbms_streams_adm.instantiation_table_network);
      end;
      /
      说明:在源库执行maintain_tables时,目标库几乎什么都不用做,stream环境已经配置好啦,
      如果想复制其它的表,只用再执行maintain_tables过程即可
      4.3.3 如果在执行2的过程时失败,需要清除脚本
      --select script_id from dba_recoverable_script;
      --exec dbms_streams_adm.RECOVER_OPERATION('&1','PURGE');
      declare
      v_script_id varchar2(32);
      begin
      select script_id into v_script_id from dba_recoverable_script;
      dbms_streams_adm.RECOVER_OPERATION(v_script_id,'PU RGE');
      exception
      when no_data_found then
      DBMS_OUTPUT.PUT_LINe('no data found') ;
      when others then
      4.5 全库级复制
      以上主要为大家介绍了pre_instantiation_setup/post_instantiation_setup过程在配置全库复制的方法,以下介绍dbms_streams_adm的maintain_global过程如何配置stream全库复制方法,适用于10gR2及以后版本。
      不支持sys/ system 用户的变更。
      1.在stream进行配置前,需要做些准备工作
      a 源库与目标库初始化参数的设置
      alter system set aq_tm_processes=4 scope=spfile;
      alter system set job_queue_processes=5 scope=spfile;
      alter system set global_names=true scope=spfile;

    alter system set streams_pool_size=51m scope=spfile;
      说明streams_pool_size在生产环境中最好>200m
      b 源库与目标库tnsnames.ora配置
      见4.1
      c 源库与目标库复制管理员的创建
      见4.1
      d 源库与目标库创建互连的DBLINK
      见4.1
      e 源库与目标库必须处于归档模式
      见4.1
      f 源库与目标库必须创建directory
      create directory dir_DBA as 'D:\Stream\DBA';
      create directory dir_DBA2 as 'D:\Stream\DBA2';
      2.在源库执行MAINTAIN_GLOBAL过程
      begin
      dbms_streams_adm.maintain_global(
      source_directory_object =>'dir_DBA',
      destination_directory_object =>'dir_DBA2',
      source_database=>'DBA',
      destination_database =>'DBA2',
      perform_actions=>true,
      include_ddl=>true,
      instantiation=>DBMS_STREAMS_ADM.INSTANTIATION_FULL_ NETWORK
      );
      end;
      说明:在执行maintain_global时,源库与目标库必须创建directory,然后在源库执行, 目标库几乎什么都不用做,stream环境已经配置完毕

    展开全文
  • Oracle流复制技术在数据库系统容灾备份中的构建过程进行了详细介绍,通过对Oracle容灾备份技术的分析,引入流复制技术至电子商务数据库系统中,研究怎样通过Oracle流复制技术在数据库数据共享中的应用,实施容灾备份...
  • ORACLE流复制技术DOWNSTREAM实施步骤,网上类似资料乱七八糟
  • oracle流复制脚本

    2012-07-30 13:49:04
    oracle capture oracle cdc 流复制 数据迁移
  • ORACLE流复制(全库级复制)

    千次阅读 2013-03-17 15:41:19
    ORACLE流复制(全库级复制)   本文档介绍dbms_streams_adm的maintain_global过程如何配置stream全库复制方法,适用于10gR2及以后版本。需要注意的是不支持sys/system 用户的变更。   一.配置前检查(源库和目标...

    ORACLE流复制(全库级复制)

     

    本文档介绍dbms_streams_adm的maintain_global过程如何配置stream全库复制方法,适用于10gR2及以后版本。需要注意的是不支持sys/system 用户的变更。

     

    一.配置前检查(源库和目标库都要配置)

    1.开启归档设置:

    SQL> archive log list;

    Database log mode              Archive Mode

    Automatic archival             Enabled

    Archive destination            /log/archivelog

    Oldest online log sequence     91

    Next log sequence to archive   95

    Current log sequence           95

    2.修改golbal_names

    SQL> alter system setglobal_names=true;

    System altered.

    SQL> showparameter global_names

    NAME                                 TYPE        VALUE

    ----------------------------------------------- ------------------------------

    global_names                         boolean     TRUE

     

    3.检查数据库版本号(必须大于10.2.0.2.0)

    SQL> show parameter compatible

     

    NAME                                 TYPE        VALUE

    ------------------------------------ -----------------------------------------

    compatible                           string      11.2.0.0.0

     

    4.检查job线程个数(必须大于2):

    SQL> showparameter job_queue

     

    NAME                                 TYPE        VALUE

    ----------------------------------------------- ------------------------------

    job_queue_processes                  integer     1000

     

    5. 设置streams_pool_size指定适当的大小 ( 建议不小于200M) ,当然如果设置了sga_target,该参数也可由系统自动调节

    SQL> alter systemset streams_pool_size=200M;

    System altered.

    SQL> showparameter streams_pool_size

     

    NAME                                 TYPE        VALUE

    ----------------------------------------------- ------------------------------

    streams_pool_size                    big integer   200M

     

    二、准备环境

    1. 配置tnsname文件

    源库:

    node2=

      (DESCRIPTION =

        (ADDRESS_LIST =

          (ADDRESS = (PROTOCOL = TCP)(HOST =node2.sink.com)(PORT = 1521))

        )

        (CONNECT_DATA =

          (SERVICE_NAME = node2.sink.com)

        )

      )

     

     

    目标库:

    node1 =

      (DESCRIPTION =

        (ADDRESS_LIST =

          (ADDRESS = (PROTOCOL = TCP)(HOST =node1.sink.com)(PORT = 1521))

        )

        (CONNECT_DATA =

          (SERVICE_NAME = node1.sink.com)

        )

      )

     

    2.创建流复制管理员(源库和目标库)

     SQL>conn /as sysdba

    create tablespace stream_tbs datafile'/opt/oracle/oradata/node1/stream_tbs.dbf' size 200m;

     

    创建用户

    create user strmadmin identified by strmadmin defaulttablespace stream_tbs;

     

    授权用户

     grant dba to strmadmin;

     execdbms_streams_auth.grant_admin_privilege('strmadmin');

     

    3.创建dblink

    源库

    SQL>conn strmadmin/strmadmin

    create database link node2.sink.com connect tostrmadmin identified by stradmin using 'node2';

     

    验证一下:

    source>select sysdate from dual@node2.zqgame.com;

     

    SYSDATE

    ---------

    12-MAR-13  --取到数据,表示DBlink连接没有问题

     

     

    目标库

    SQL>conn / as sysdba

    create database link node1.sink.com connect tostrmadmin identified by strmadmin using 'node1';

     

    验证一下:

    target>select sysdate from dual@node1.zqgame.com;

     

    SYSDATE

    ---------

    12-MAR-13  –取到数据,表示DBlink连接没有问题

     

    注意:启用global_name DBlink的名字必须是global_name,否则无法连接

     

    4.创建目录

    源:

    source>conn / as sysdba

    CREATE DIRECTORY source_dir as‘/opt/oracle/source_dir’;

    grant read,write on directory source_dir to strmadmin;

     

    目标库:

    target>conn / as sysdba

    CREATE DIRECTORY target _dir as‘/opt/oracle/target_dir ’;

    grantread,write on directory target _dir to strmadmin;

     

    三. 开始流复制配置,在源库执行MAINTAIN_GLOBAL过程

    begin

     dbms_streams_adm.maintain_global( 

      3    source_directory_object=>'source_dir', 

      4    destination_directory_object=>'target_dir', 

      5    source_database=>'node1.sink.com', 

      6    destination_database =>'node2.sink.com',

      7    perform_actions=>true,

      8    include_ddl=>true,

      9   instantiation=>DBMS_STREAMS_ADM.INSTANTIATION_FULL_NETWORK);

     10  end;

     11  /

     

    PL/SQL procedure successfully completed.
      

    在执行maintain_global时,源库与目标库必须创建directory,然后在源库执行,目标库几乎什么都不用做,stream环境已经配置完毕

     

    四、验证数据是否同步

    源库:

    SQL> create user testaccount identified bytestaccount;

     

    User created.

     

    SQL> grant connect,resource to testaccount;

     

    Grant succeeded.

     

    SQL>insert into scott.dept values(99,'test','abc');

     

    1row created.

     

    SQL>commit;

     

    Commitcomplete.

     

    SQL>select * from scott.dept;

     

        DEPTNO DNAME          LOC

    ------------------------ -------------

            10 ACCOUNTING     NEW YORK

            20 RESEARCH       DALLAS

            30 SALES          CHICAGO

            40 OPERATIONS     BOSTON

            99 test           abc

     

    SQL>conn testaccount/testaccount

    Connected.

     

    SQL>create table test1(name varchar2(20),birthdate date,hometown varchar2(50));

     

    Tablecreated.

     

    SQL>insert into test1 values('tom', to_date('1986-10-18','yyyy-mm-dd'),'beijing');

     

    1row created.

     

    SQL>commit;

     

    Commitcomplete.

     

    SQL>select * from test1;

     

    NAME            BIRTHDATE     HOMETOWN

    --------------------  ------------------------   --------------------------

    tom              1986-10-18       beijing

     

     

    目标库:

    SQL>select * from scott.dept;

     

        DEPTNO DNAME                        LOC

    -------------------------------------- --------------------------

            10 ACCOUNTING                   NEW YORK

            20 RESEARCH                     DALLAS

            30 SALES                        CHICAGO

           40 OPERATIONS                  BOSTON

            99 test                         abc

     

    SQL>select * from testaccount.test1;

     

    NAME             BIRTHDATE           HOMETOWN

    --------------------      ------------------          ----------

    tom              1986-10-18    beijing

     

     数据已经同步,至此,流复制全库同步搭建成功。

    展开全文
  • oracle流复制技术

    2014-03-10 10:11:08
    本文整理自网络。...流复制(Stream replication)只是基于它的一个数据共享技术,也可以被用作一个可灵活定制的高可用性方案。 它可以实现两个数据库之间数据库级,schema级,Table级的数据同步,并且这

       本文整理自网络。

        Stream 是Oracle 的消息队列(也叫Oracle Advanced Queue)技术的一种扩展应用。 Oracle 的消息队列是通过发布/订阅的方式来解决事件管理。流复制(Stream replication)只是基于它的一个数据共享技术,也可以被用作一个可灵活定制的高可用性方案。 它可以实现两个数据库之间数据库级,schema级,Table级的数据同步,并且这种同步可以是双向的。 Oracle Stream也是通过数据冗余来提高可用性。

      Oracle 高级复制(Oracle advanced Replication) 和流复制(Stream Replication) 是从名称和功能上都相似的两种技术。 但前者是基于触发器的,后者是基于日志挖掘(Logminer)技术。
    1. Stream 的工作原理
      Stream 是Oracle Advanced Queue技术的一种扩展应用, 这种技术最基本的原理就是收集事件,把时间保存在队列中,然后把这些事件发布给不同的订阅者。 从DBA的角度来说, 就是把捕获Oracle数据库产生的Redo日志,然后把这些日志通过网络传播到多个数据库,其他数据库通过应用这些日志,达到复制变化的作用。
    在Stream 环境下, 复制的起点数据库叫作Source Database, 复制的终点数据库叫作Target Database。 在这两个数据库上都要创建一个队列,其中的Source Database上的是发送队列,而Target Database上的是接收队列。
      数据库的所有操作都会被记录在日志中。 配好Stream环境后, 在Source Database上会有一个捕获进程(Capture Process), 该进程利用Logminer技术从日志中提取DDL,DML语句,这些语句用一种特殊的格式表达,叫作逻辑变更记录(Logical Change Record, LCR). 一个LCR对应一个原子的行变更,因此源数据库上的一个DML语句,可能对应若干个LCR记录。 这些LCR会保存到Sourece Database的本地发送队列中。然后传播进程(Propagation Process)把这些记录通过网络发送到Target Database的接收队列。 在Target Database上会有一个应用进程(Apply Process), 这个进程从本地的接收队列中取出LCR记录,然后在本地应用,实现数据同步 。


       Stream在使用上也有些限制条件。这些可以从视ALL/DBA_STREAMS_NEWLY_SUPPORTED,ALL/DBA_STREAMS_UNSUPPORTED 查看stream复制不支持的数据类型。


      SQL>SELECT table_name, reason FROM ALL_STREAMS_NEWLY_SUPPORTED;
      SQL>SELECT table_name, reason FROM DBA_STREAMS_NEWLY_SUPPORTED;
      SQL>SELECT table_name, reason FROM DBA_STREAMS_UNSUPPORTED;
      SQL>SELECT table_name, reason FROM ALL_STREAMS_UNSUPPORTED;
    3. 前期规划的几点:
      1). 确定复制集:如是数据库级还是表级
      2). 决定复制站点
      3). 决定LCR是本地捕获还是下游捕获
      本地捕获: 在源数据库进行,从联机日志和归档日志获得LCR
      下游捕获:在目标数据库进行,从归档日志获得LCR.
      本地捕获可以保护更多的数据,但是会占用源数据库的资源。
      4). 决定复制拓扑结构:这时要决定复制数据库的用途,是只用于预防灾难,还是平时保持空闲,或允许用户使用。

    4. Streams Replication 实例讲解 
     4.1 准备工作:
      DBA是源数据库, DBA2是目标数据库
     4.1.1 源数据库和目标数据库必须是归档的
      SQL> startup mount;
      SQL> alter database archivelog;
      SQL> alter database open;
      SQL> archive log list
     归档与非归档的切换请参考:
      http://blog.csdn.net/tianlesoftware/archive/2009/1 0/18/4693470.aspx
     4.1.2. 源数据库和目的数据库均需要设置的参数:
      alter system set global_names=true scope = both;
      默认为false, Database Link 使用的是数据库的global_name。

        alter system set aq_tm_processes=2 scope=both;
      以下参数都是10G的默认值, 检查下就可以了. 无需设置
      如:Show parameter job_queue_processes
      alter system set job_queue_processes = 10 scope=both;
      alter system set sga_target = 300m scope=spfile;
      alter system set open_links=4 scope=spfile;
      alter system set statistics_level='TYPICAL' scope=both;
      10g 默认为Typical, 性能统计模式
      alter system set logmnr_max_persistent_sessions=1 scope=spfile;
      10g 默认为1,持久的日志挖掘会话数。
      alter system set "_job_queue_interval"=1 scope=spfile;
      alter system set aq_tm_processes=1;
      alter system set streams_pool_size=200m scope=both;
      注意streams_pool_size一定要够大,因为如果启用了SGA_TARGET,ORACLE可能分配很少内存给stream导致大量信息被 spill到磁盘导致查询DBA_APPLY,DBA_CAPTURE,DBA_PROPGATION全部状态ENABLED但就是没有数据被同步。
      同时设置_job_queue_interval也是为了提高队列检查时间,防止apply出问题。
      注意:与复制有关的2个参数: 如果等了足够长的时间发现数据没有复制过来,仔细检查了capture/propagation/apply各进程的状态都是正常的, 并检查参数.
      alter system set "_job_queue_interval"=1 scope=spfile;
      并且将aq_tm_processes参数改为1(我原来这是为10)
      alter system set aq_tm_processes=1;
      改完后重启,发现数据就可以去了。这个隐含参数只是控制对job队列的检查频率,默认5秒。
     4.1.3 . 在源数据库上启用追加日志
      可以基于Database级别或Table级别,启用追加日志(Supplemental Log)。在建立根据Schema粒度进行复制的Oracle Stream环境中,如果确认Schema下所有Table都有合理的主键(Primary Key),则不再需要启用追加日志。
      #启用Database 追加日志
      alter database add supplemental log data;
      #启用Table追加日志
      alter table add supplement log group log_group_name(table_column_name) always;
     4.1.4 . 源数据库和目的数据库创建相同表空间和用户并赋权
      创建表空间:
      CREATE TABLESPACE streams_tbs DATAFILE 'D:\ORACLE\ORADATA\DBA\streams_tbs.dbf' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
      CREATE TABLESPACE streams_tbs DATAFILE 'D:\ORACLE\ORADATA\DBA2\streams_tbs.dbf' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
      创建用户:
      CREATE USER strmadmin IDENTIFIED BY strmadmin DEFAULT TABLESPACE streams_tbs
      QUOTA UNLIMITED ON streams_tbs;
      赋权:
      GRANT DBA to strmadmin;
      exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('strmadmin ');
     4.1.5 配置listener.ora和tnsnames.Ora
      DBA2 =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.10.80)(PORT = 1521))
      (CONNECT_DATA = http://blog.soso.com/qz.q/
      (SERVER = DEDICATED)
      (SERVICE_NAME = DBA2.anqingren.org)
      )
      )
     4.1.6 创建DBLink
      先用strmadmin登陆,在创建dblink
     4.1.6.1在源端建到目库的db link
      SQL> conn strmadmin/strmadmin;
      已连接。
      SQL> create database link DBA2 connect to strmadmin identified by strmadmin using 'dba2';
      数据库链接已创建。
      测试:
      SQL> select * from global_name@dba2;
      GLOBAL_NAME
      -------------------
      DBA2.ANQINGREN.ORG
     4.1.6.2 在目端建到源库的db link
      SQL> conn strmadmin/strmadmin;
      已连接。
      SQL> create database link dba connect to strmadmin identified by strmadmin using 'dba';
      数据库链接已创建。
     4.2 用户级的复制(不支持sys和system用户)
     4.2.1 最初的用户复制
      分别在源库和目标数据库上创建测试用户
      SQL>create user dave identified by dave;
      SQL>grant dba to dave;
     4.2.1 在源数据库上创建Source 队列
      connect strmadmin/strmadmin@dba;
      BEGIN
      DBMS_STREAMS_ADM.SET_UP_QUEUE(
      queue_table => 'SOURCE_QUEUE_TABLE', --队列表
      queue_name => 'SOURCE_QUEUE', --队列
      queue_user => 'strmadmin'); --队列用户
      END; / 或者: SQL> EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE(); PL/SQL procedure successfully completed. 该命令会创建一个队列缺省名:streams_queue,队列表缺省是:STREAMS_QUEUE_TABLE

    队列存储的object类型是anaydata
      移除队列:
      exec dbms_streams_adm.remove_queue(
      queue_name => 'streams_queue',
      cascade => true,
      drop_unused_queue_table => true);.
      可以用查询dba_queues,dba_queue_tables来检查:
      SQL> select owner,queue_table,name from dba_queues where owner='STRMADMIN';
      OWNER QUEUE_TABLE NAME
      ----------------- ------------------------- ------------------
      STRMADMIN SOURCES_QUEUE_TABLE SOURCES_QUEUE
      STRMADMIN SOURCES_QUEUE_TABLE AQ$_SOURCES_QUEUE_TABLE_E
      SQL>select owner,queue_table,object_type from dba_queue_tables where owner='STRMADMIN';
      OWNER QUEUE_TABLE OBJECT_TYPE
      -------------- --------------------- ------------------
      STRMADMIN SOURCES_QUEUE_TABLE SYS.ANYDATA
     4.2.2 在目标数据库DBA2上创建接收队列
      connect strmadmin/strmadmin@dba2;
      BEGIN
      DBMS_STREAMS_ADM.SET_UP_QUEUE(
      queue_table => 'TARGET_QUEUE_TABLE', --队列表
      queue_name => 'TARGET_QUEUE', --队列
      queue_user => 'strmadmin'); --队列用户
      END;
      /
      可以用查询dba_queues,dba_queue_tables来检查:
      SQL> select owner,queue_table,name from dba_queues where owner='STRMADMIN';
      OWNER QUEUE_TABLE NAME
      ------------------ --------------------- ----------------
      STRMADMIN TARGET_QUEUE_TABLE TARGET_QUEUE
      STRMADMIN TARGET_QUEUE_TABLE AQ$_TARGET_QUEUE_TABLE_E
     4.2.3 在源数据库上创建capture 进程
      SQL>conn strmadmin/strmadmin@DBA;
      SQL> BEGIN
      DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
      schema_name => 'dave', -- 用户名,如dave, 非sys或者system
      streams_type => 'capture',
      streams_name => 'capture_stream',
      queue_name => 'strmadmin.SOURCE_QUEUE',
      include_dml => true,
      include_ddl => true,
      source_database => 'DBA',
      include_tagged_lcr => false,
      inclusion_rule => true);
      END;
      /
      PL/SQL procedure successfully completed.
      可以通过dba_capture查看:
      SQL> select CAPTURE_NAME,QUEUE_NAME,START_SCN,STATUS,CAPTURE_T YPE from dba_capture;
      CAPTURE_NAME QUEUE_NAME START_SCN STATUS CAPTURE_TY
      ------------------------- ---------------------------- ---------- -------------- ----------------
      CAPTURE_STREAM1 SOURCES_QUEUE 1294052 DISABLED LOCAL
      SQL> select * from ALL_CAPTURE_PREPARED_SCHEMAS;
      SCHEMA_NAME TIMESTAMP SUPPLEME SUPPLEME SUPPLEME SUPPLEME
      -------------------- -------------- -------- -------- -------- --------
      SYSTEM 20-10月-09 IMPLICIT IMPLICIT IMPLICIT NO 4.2.4 在源数据库上创建传播进程
      SQL>conn strmadmin/strmadmin@DBA;
      SQL> BEGIN
      DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES(
      schema_name => 'dave',
      streams_name => 'source_to_target',
      source_queue_name => 'strmadmin.SOURCE_QUEUE',
      destination_queue_name => 'strmadmin.TARGET_QUEUE@DBA2', --此队列待创建
      include_dml => true,
      include_ddl => true,
      source_database => 'DBA',
      inclusion_rule => true,
      queue_to_queue => true);
      END;
      /
      PL/SQL procedure successfully completed.
      重新启动propagation process
      --dbms_propagation_adm.start_propagation (propagation_name)
      --其中propagation_name可以从表all_propagation中取得
      select * from all_propagation;
      SQL> exec dbms_propagation_adm.start_propagation('source_to_ target');
      exec dbms_propagation_adm.stop_propagation('source_to_t arget');

    PL/SQL procedure successfully completed.
      select * from all_propagation;
      可以通过dba_propagations查看结果:
      SQL> select PROPAGATION_NAME,SOURCE_QUEUE_NAME,DESTINATION_QUE UE_NAME,DESTINATION_DBLINK,STATUS from dba_propagation;
      PROPAGATION_NAME SOURCE_QUEUE_NA DESTINATION_QUE DESTINATION_DBLINK STATUS
      ------------------ --------------- --------------- ------------------ --------
      STREAM1_TO_STREAM2 SOURCES_QUEUE TARGET_QUEUE DBA2.ANQINGREN.ORG ENABLED
      #修改propagation休眠时间为0,表示实时传播LCR。
      begin
      dbms_aqadm.alter_propagation_schedule(
      queue_name => 'SOURCE_QUEUE',
      destination => 'DBA2',
      latency => 0);
      end;
      /
     4.2.5 在目标数据库DBA2上创建Apply进程
      SQL> BEGIN
      DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
      schema_name => 'SYSTEM',
      streams_type => 'apply',
      streams_name => 'target_apply_stream',
      queue_name => 'strmadmin.TARGET_QUEUE',
      include_dml => true,
      include_ddl => true,
      include_tagged_lcr => false,
      source_database => 'DBA',
      inclusion_rule => true);
      END;
      /
      可以通过:
      dba_apply
      v$streams_apply_reader
      v$streams_apply_coordinator
      v$streams_apply_server
      查看状态
      SQL> select apply_name,queue_name,status from dba_apply;
      APPLY_NAME QUEUE_NAME STATUS
      ------------------------------ ------------------------------ --------
      TARGET_APPLY_STREAM TARGET_QUEUE DISABLED
     4.2.6 实例化复制数据库
     4.2.6.1 用exp/imp 完成实例化
      带数据完成源端exp和目端的import: Exp USERID=SYSTEM/ADMIN@DBA OWNER=SYSTEM FILE=D:\STRM.dmp LOG=STRM.log OBJECT_CONSISTENT=Y STATISTICS = NONE imp USERID=SYSTEM/ADMIN@DBA2 FULL=Y CONSTRAINTS=Y FILE=D:\STRM.dmp IGNORE=Y COMMIT=Y LOG=D:\import.log STREAMS_INSTANTIATION=Y 或仅作实例化(不带数据):
      exp USERID=SYSTEM/ADMIN@DBA OWNER=SYSTEM FILE=D:\STRM.dmp LOG=D:\export.log OBJECT_CONSISTENT=Y STATISTICS = NONE ROWS=NO
      imp USERID=SYSTEM/ADMIN@DBA2 FULL=Y CONSTRAINTS=Y FILE=D:\STRM.dmp COMMIT=Y LOG=D:\import.log STREAMS_INSTANTIATION=Y IGNORE=Y
     4.2.6.2 直接设置SCN的方式进行实例化:
      ---获取源库互置用户的SCN
      connect strmadmin/strmadmin@DBA
      set serveroutput on
      DECLARE
      iscn NUMBER; -- Variable to hold instantiation SCN value
      BEGIN
      iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
      DBMS_OUTPUT.PUT_LINE ('Instantiation SCN is: ' || iscn);
      END;
      /
      ---设置为目标库互置用户的SCN
      connect strmadmin/strmadmin@DBA2
      BEGIN
      DBMS_APPLY_ADM.SET_SCHEMA_INSTANTIATION_SCN(
      source_schema_name => 'SYSTEM',
      source_database_name => 'DBA',
      instantiation_scn => &iscn);
      END;
      /
     4.2.7. 在目标数据库上启动Apply进程
      connect strmadmin/strmadmin@DBA2
      SQL> BEGIN
      DBMS_APPLY_ADM.SET_PARAMETER(apply_name => 'target_apply_stream', parameter
      => 'disable_on_error', VALUE =http://blog.soso.com/qz.q/>'n');
      END;
      /
      SQL> BEGIN
      DBMS_APPLY_ADM.START_APPLY(
      apply_name => 'target_apply_stream');
      END;
      /
      #停止Apply进程
      begin
      dbms_apply_adm.stop_apply(
      apply_name => 'target_apply_stream');
      end;
      /
      查看状态
      SQL> select apply_name,queue_name,status from dba_apply;

    APPLY_NAME QUEUE_NAME STATUS
      ------------------------------ ------------------------------ --------
      TARGET_APPLY_STREAM TARGET_QUEUE ENABLED
     4.2.8 在源数据库上启动capture
      connect strmadmin/strmadmin@DBA
      SQL> BEGIN
      DBMS_CAPTURE_ADM.START_CAPTURE(
      capture_name => 'capture_stream');
      END;
      /
      #停止Capture进程
      begin
      dbms_capture_adm.stop_capture(
      capture_name => 'capture_stream');
      end;
      / 查看状态:
      SQL> select capture_name,status from dba_capture;
      CAPTURE_NAME STATUS
      --------------- --------
      CAPTURE_STREAM ENABLED
     4.3 表级的复制
      maintain_tts 表空间复制
      maintain_schemas 用户复制
      maintain_tables 表复制的
      与dbms_streams_adm的maintain_global、maintain_tts、maintain_schemas等过程相比,maintain_tables过程使用则更灵活,可以为某些特殊的表拿出来单独配置,maintain_tables也象其它的过程一样,提供了一蓝子解决方案,如果要添加新的表到复制中,只需要再次执行maintain_tables过程即可。
     4.3.1 在stream进行配置前,需要做些准备工作
      A 源库与目标库初始化参数的设置
      alter system set aq_tm_processes=1 scope=spfile;
      alter system set job_queue_processes=2 scope=spfile;
      alter system set global_names=true scope=spfile;
      alter system set streams_pool_size=20m scope=spfile;
      说明streams_pool_size在生产环境中最好>200m
      B 源库与目标库tnsnames.ora配置
      见4.1
      C 源库与目标库复制管理员的创建
      见4.1
      D 在源库与目标库创建DBLINK
      见4.1
      E 源库与目标库必须处于归档模式
      见4.1
      F 源库与目标库必须创建directory
      connect strmadmin/strmadmin@DBA;
      create directory DIR_DBA as 'D:\Stream\DBA';
      connect strmadmin/strmadmin@DBA2;
      create directory DIR_DBA2 as 'D:\Stream\DBA2';
      说明:在复制表空间时,创建directory需要指定该表空间所在的目录
      G 创建测试用的表空间及表
      CREATE TABLESPACE DAVE DATAFILE 'D:\ORACLE\ORADATA\DBA\DAVE.dbf' SIZE 100M;
      create user tianle identified by tianle default tablespace DAVE;
      grant dba to tianle;
      conn TIANLE/TIANLE
      create table test(id int,name varchar2(20));
      create table test2(id int,name varchar2(20));
      insert into test values(1,'dave');
      insert into test values(2,'bl');
      不能使用默认的表空间.
     4.3.2 在源库执行MAINTAIN_TTS过程
      SQL>connect strmadmin/strmadminpw@DBA;
      declare
      v_tables dbms_utility.uncl_array;
      begin
      v_tables(1) := 'tianle.test;
      v_tables(2) := 'tianle.test2';
      dbms_streams_adm.maintain_tables(
      table_names => v_tables,
      source_directory_object => null,
      destination_directory_object => null,
      source_database => 'DBA',
      destination_database => 'DBA2',
      perform_actions => true,
      bi_directional => false,
      include_ddl => true,
      instantiation => dbms_streams_adm.instantiation_table_network);
      end;
      /
      说明:在源库执行maintain_tables时,目标库几乎什么都不用做,stream环境已经配置好啦,
      如果想复制其它的表,只用再执行maintain_tables过程即可
      4.3.3 如果在执行2的过程时失败,需要清除脚本
      --select script_id from dba_recoverable_script;
      --exec dbms_streams_adm.RECOVER_OPERATION('&1','PURGE');
      declare
      v_script_id varchar2(32);
      begin
      select script_id into v_script_id from dba_recoverable_script;
      dbms_streams_adm.RECOVER_OPERATION(v_script_id,'PU RGE');
      exception
      when no_data_found then
      DBMS_OUTPUT.PUT_LINe('no data found') ;
      when others then
     4.5 全库级复制
      以上主要为大家介绍了pre_instantiation_setup/post_instantiation_setup过程在配置全库复制的方法,以下介绍dbms_streams_adm的maintain_global过程如何配置stream全库复制方法,适用于10gR2及以后版本。
      不支持sys/ system 用户的变更。
     1.在stream进行配置前,需要做些准备工作
      a 源库与目标库初始化参数的设置
      alter system set aq_tm_processes=4 scope=spfile;
      alter system set job_queue_processes=5 scope=spfile;
      alter system set global_names=true scope=spfile;

        alter system set streams_pool_size=51m scope=spfile;
      说明streams_pool_size在生产环境中最好>200m
      b 源库与目标库tnsnames.ora配置
      见4.1
      c 源库与目标库复制管理员的创建
      见4.1
      d 源库与目标库创建互连的DBLINK
      见4.1
      e 源库与目标库必须处于归档模式
      见4.1
      f 源库与目标库必须创建directory
      create directory dir_DBA as 'D:\Stream\DBA';
      create directory dir_DBA2 as 'D:\Stream\DBA2';
     2.在源库执行MAINTAIN_GLOBAL过程
      begin
      dbms_streams_adm.maintain_global(
      source_directory_object =>'dir_DBA',
      destination_directory_object =>'dir_DBA2',
      source_database=>'DBA',
      destination_database =>'DBA2',
      perform_actions=>true,
      include_ddl=>true,
      instantiation=>DBMS_STREAMS_ADM.INSTANTIATION_FULL_ NETWORK
      );
      end;
      说明:在执行maintain_global时,源库与目标库必须创建directory,然后在源库执行, 目标库几乎什么都不用做,stream环境已经配置完毕

     http://wenku.baidu.com/view/78eb18210722192e4436f606.html

    展开全文
  • Oracle流复制基本原理

    千次阅读 2014-03-10 10:11:04
     Oracle流是为提高数据库的高可用性而设计的在Oracle 9i及之前的版本这个功能被称为Advance Replication。Oracle流利用高级队列技术通过解析归档日志将归档日志解析成DDL 及DML 语句从而实现数据库之间的同步。这种...
  • Oracle Sreams 流复制技术是一种数据库复制技术。利用数据流可实现数据库 之间或数据库内部的数据和事件的共享。Oracle Streams 是提高数据库可用性, 构建灾难备份系统以及实现数据库分布的理想的技术解决方案。...
  • Oracle流复制配置最佳实践

    千次阅读 2016-12-29 09:19:59
     使用Oracle 10.2.0.4版本,并且安装所有关键补订包 2. 下游捕获需要源和目标库运行在相同平台上 3. 准备源和目标数据库的redo logs(1) 配置源和目标库的archivelog模式(2) 配置本地归档目标路径,log_...
  • Oracle 流复制(Stream Replication)

    千次阅读 2018-03-27 09:58:10
    流复制(Stream replication)只是基于它的一个数据共享技术,也可以被用作一个可灵活定制的高可用性方案。 它可以实现两个数据库之间数据库级,schema级,Table级的数据同步,并且这种同步可以是双向的。 Or...
  • oracle 两种复制方式对比
  • Oracle流配置,复制schemas关键点 Oracle流配置,复制schemas关键点 Oracle流配置,复制schemas关键点 Oracle流配置,复制schemas关键点 Oracle流配置,复制schemas关键点 Oracle流配置,复制schemas关键点 Oracle流...
  • 通过Oracle流复制实现数据库之间的同步
  • 到了Oracle 10g,有了DBMS_STREAMS_ADM之后,Stream流复制已经很好配置了 下面的只是一个最简单的stream流复制,不涉及复杂的rule配置 环境: OS:Redhat Linux Oracle 10.2.0.2 source:stream1 destnation:stream2
  • ORACLE数据库复制

    2011-07-04 11:46:14
    流复制主要是利用ORACLE的归档日志,进行增量备份来实现的,不仅可以配置只复制某些表,还可以配置仅复制某些表上的ddl或dml。可以复制到表,用户,数据库级别。 高级复制主要是基于触发器的原理来触发数据同步的...
  • oracle 单表流复制 stream

    千次阅读 2011-12-15 16:21:02
    今天运气够好,oracle单表流复制搞定,由于oracle stream 操作步骤多,之前遇到许多问题, 没有理清思路或者说自己对此的理解不够,所以失败。对于重要表,流复制类似dataguard应用日志,主服务器 捕获,然后传递...
  • 在使用Oracle 10g 流复制时出现过一些问题,现在把解决过程总结一下。 系统配置:HP-UX B.11.31 U ia64、Oracle Enterprise Edition Release 10.2.0.4.0、表级单向流复制问题现象:流复制失效,源表更新,目标表...
  • 系统配置:HP-UX B.11.31 U ia64、Oracle Enterprise Edition Release 10.2.0.4.0、表级单向流复制问题现象:流复制失效,源表更新,目标表没有更新,没有apply error信息排错过程: 1) 检查源库的alert_.log,...
  • 配置Oracle 10g 双向流复制

    千次阅读 2012-01-08 23:00:26
    构建Oracle双向流复制是一个十分复杂的过程,我写这个文档的目的是尽量有条理地列出所需做的工作,帮助DBA更有效的建设流复制环境。 1.以scott模式为复制示例,一般只要在创建数据库时选择了安装sample schema,...
  • Oracle 是一种数据共享的通用机制,可以被用于许多处理的基础,包括消息、复制和数据仓库的 ETL 过程。它是高级队列、LogMinor、作业调度等已存在技术的扩展。这里做一个简单的复制示例来说明其用法。试验环境:...
  • 流复制(Streams Replication) 备库(Dataguard) 一 dataguard: dataguard在高可用及容灾方面一般是dba的首选,毕竟dataguard在这方面 存在压倒性的优势,不管是物理备用库(physical standby database)还是逻辑...
  • 系统配置:Linux CentOS 5、Oracle Enterprise Edition Release 10.2.0.1.0、表级单向流复制问题现象:流复制失效,源表更新,目标表没有更新排错过程: 1) 查看捕获进程状态select capture_name,status from dba...
  • STREAM的功能还是十分强大的,通过配置ORACLE STREAM可以更大的提升数据库的和安全性,如此一个好用且不用花费高昂额外费用的功能还是很值得一用。
  • 受Stripe的启发,这是我们对hbase-> oracle流的实现。 初始规格 快速刷新 涉及每隔“ x”分钟刷新一次目标表。 根据我们的规格,当前的实施时间为x = 15分钟。 尽快刷新 追溯刷新。 批量刷新 每隔“ y”小时刷新一...
  • Oracle数据库同步---流复制实现数据库之间的同步 Oracle Stream功能是为提高数据库的高可用性而设计的,在Oracle 9i及之前的版本这个功能被称为Advance Replication。Oracle Stream利用高级队列技术,通过解析归档...
  • 以下是实践中大事务处理过程:1) 停止-- 源数据库停止Capture进程connect strmadminBEGINDBMS_CAPTURE_ADM.STOP_CAPTURE(capture_name => 'capture1');END;/-- 目标数据库停止Apply进程connect strmadminbegindbms...
  • 配置Oracle 10g 双向流复制 View more documents from Maclean Liu

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,800
精华内容 15,520
关键字:

oracle流复制