CDC不同模式在ODI体现系列之二 异步模式

CDC不同模式在ODI体现系列之二 异步模式 2

异步模式需要在数据库中做一些准备工作:

改数据为归档并启用logminer:

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount

ORACLE 例程已经启动。

Total System Global Area  599785472 bytes

Fixed Size                  1288820 bytes

Variable Size             171967884 bytes

Database Buffers          423624704 bytes

Redo Buffers                2904064 bytes

数据库装载完毕。

SQL> alter database force logging;

数据库已更改。

SQL> alter database archivelog;

数据库已更改。

SQL> alter database add supplemental log data;

数据库已更改。

设置权限:

发布用户必须有管理Oracle Stream的权限.

用DMBS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE赋予权限.

授权管理权限给用户户,允许用户户改实例参数和创建对象.

SQL> grant select_catalog_role to scott;

Grant succeeded.

SQL> grant execute_catalog_role to scott;

Grant succeeded.

SQL> grant create table to scott;

Grant succeeded.

SQL> grant create session to scott;

Grant succeeded.

SQL> grant dba to scott;

Grant succeeded.

SQL> grant execute on dbms_cdc_publish to scott;

Grant succeeded.

SQL> grant select on change_sets to scott;

Grant succeeded.

SQL> grant create tablespace to scott;

Grant succeeded.

SQL> grant create sequence to scott;

Grant succeeded.

SQL> grant unlimited tablespace to scott;

Grant succeeded.

SQL> execute dbms_streams_auth.grant_admin_privilege(grantee=>‘scott‘);

PL/SQL procedure successfully completed.

工作对象(Work schema)必须有select any table权限

SQL> grant select any table to scott;

Grant succeeded.

设置数据库参数,因为要用logminer和stream,设置相应内存参数;

SQL> alter system set java_pool_size=50m;

系统已更改。

SQL> alter system set streams_pool_size=100m;

系统已更改。

需要把table添加到日志组 (后来测试,这步骤在KM已经有,而且做了以后反而导致错误)

SQL> conn scott/tiger

Connected.

SQL> alter table dept add supplemental log data(all) columns;

Table altered.

这个时候要确认数据库打开了Streams Capture功能

SQL> select * from v$option where parameter =’Streams Capture’;

PARAMETER            VALUE

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

Streams Capture      TRUE

标准版不支持Advanced Replication 和 Stream.
1. 不支持Streams

2. 不支持Advanced Replication的multimaster方式

解决需:1.安装企业版  2.安装Advanced Replication 组件  3.执行CATREP.SQL 。

fact: Oracle Server - Standard Edition
symptom: ORA-00439: feature not enabled: %s

fix:
1. Install Enterprise Edition (see Note 117048.1)
2. Install Advanced Replication Option using installer
3. Run CATREP.SQL script.

UNIX: $ORACLE_HOME/rdbms/admin/catrep.sql
NT: ORACLE_HOME\rdbms\admin\catrep.sql

导入JKM的知识模块:

这里,我们把三种模式的JKM都导入,然后引入时候,我们做一个对比,看看JKM的差别

编辑模型,点击日志记录 TAB页,选择相应的日志记录模式和JKM:

我们选择一致性设置,可以看到我们刚才引入的三个JKM,都属于一致性读

每个JKM具体是怎么实现,差别是什么呢?我们通过编辑JKM来看他们具体做什么?

选择项目栏:

我们可以看到这个JKM的顺序180的命令,删除触发器,通过下面知道,它还是利用触发器实现.

我们那么再看JKM Oracle consistent (update date)

看到顺序500创建了一个删除后的触发器,双机这个命令,可以看到相应的创建语法,这些JKM虽然是是一致的模式,但不是异步CDC的概念.

我们看JKM Oracle consistent (LOGMINER)

我们可以看到它是通过强制数据库记录日志实现的,这个是异步CDC的方法.这时,我们在模型编辑的时候,选择这个JKM.

选择JKM Oracle 10g consistent (LOGMINER).CDC,可以看到有3个选项,一个是异步模式,就是我们提到的HotLog模式,还有一个是自动配置,是下一节要介绍的AUTOLOG模式.

最后一个参数是定义日志表的存储表空间,手工输入就可以,这里输入USERS.

看下面的说明: 如果选择异步模式,JKM最小化在源系统上的负载,用Oracle CDC HotLog模式,.这个选项要求归档模式,强制日志.

启动日志报错,查看operator

SQL> l

1  BEGIN

2     DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(

3          change_set_name    => ‘CDC‘,

4          description        => ‘Sunopsis change set for model : CDC‘,

5

6          change_source_name => ‘HOTLOG_SOURCE‘,

7          begin_date => sysdate

8

9     );

10* END;

SQL> /

*

1031 : 42000 : java.sql.SQLException: ORA-01031: insufficient privileges

ORA-06512: at "SYS.DBMS_CDC_PUBLISH", line 705

ORA-06512: at line 1

因为没有select any change_sets权限,查了10多分钟.

再次启动日志又报错:

查看描述:

30567 : 99999 : java.sql.BatchUpdateException: ORA-30567: name already used by an existing log group

30567 : 99999 : java.sql.SQLException: ORA-30567: name already used by an existing log group

java.sql.BatchUpdateException: ORA-30567: name already used by an existing log group

因为我们在前面做了下面动作

alter table dept add supplemental log data(all) columns;

删除这个日志数据

SQL> alter table dept drop supplemental log data(all) columns;

Table altered.

检查日志组

SQL> select owner,table_name,log_group_name from all_log_groups;

OWNER      TABLE_NAME LOG_GROUP_NAME

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

SYS        ENC$       ENC$_LOG_GRP

SCOTT      EMP        LOG_GROUP_EMP

SCOTT      DEPT       LOG_GROUP_DEPT

SCOTT      EMP        SYS_C0011135

SCOTT      EMP        SYS_C0011136

SCOTT      EMP        SYS_C0011137

SCOTT      DEPT       SYS_C0011175

SCOTT      DEPT       SYS_C0011176

SCOTT      DEPT       SYS_C0011177

SCOTT      DEPT       DEPT

SCOTT      DEPT       SYS_C0011442

11 rows selected.

删除同名日志组

SQL> alter table dept drop supplemental log group dept;

Table altered.

重新启动 operator

又报了一个新错误

BEGIN

DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(

owner          => ‘SCOTT‘,

change_table_name      => ‘J$DEPT‘,

change_set_name => ‘CDC‘,

source_schema    => ‘SCOTT‘,

source_table  => ‘DEPT‘,

column_type_list  => ‘DEPTNO NUMBER(2) ‘,

capture_values     => ‘new‘,

rs_id            => ‘n‘,

row_id         => ‘n‘,

user_id         => ‘n‘,

timestamp            => ‘y‘,

object_id              => ‘n‘,

source_colmap     => ‘n‘,

target_colmap      => ‘n‘,

ddl_markers  => ‘n‘,

options_string      => ‘users‘

);

END;

ERROR at line 1:

ORA-00922: missing or invalid option

ORA-06512: at "SYS.DBMS_CDC_PUBLISH", line 783

ORA-06512: at line 2

做10046跟踪:

SQL> conn scott/tiger

Connected.

SQL> alter session set events ‘10046 trace name context forever, level 8‘;

Session altered.

SQL> BEGIN

2     DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(

3          owner              => ‘SCOTT‘,

change_table_name  => ‘J$DEPT‘,

4    5             change_set_name    => ‘CDC‘,

source_schema      => ‘SCOTT‘,

source_table       => ‘DEPT‘,

6    7    8        column_type_list   => ‘DEPTNO NUMBER(2) ‘,

capture_values     => ‘new‘,

rs_id              => ‘n‘,

row_id             => ‘n‘,

9   10   11   12           user_id            => ‘n‘,

timestamp          => ‘y‘,

13   14             object_id          => ‘n‘,

source_colmap      => ‘n‘,

target_colmap      => ‘n‘,

15   16   17        ddl_markers        => ‘n‘,

18          options_string     => ‘users‘

19     );

20  END;

21  /

BEGIN

*

ERROR at line 1:

ORA-00922: missing or invalid option

ORA-06512: at "SYS.DBMS_CDC_PUBLISH", line 783

ORA-06512: at line 2

SQL> alter session set events ‘10046 trace name context off‘;

Session altered.

查看trace发现是创建J$DEPT表时出现的错误

PARSE ERROR #7:len=253 dep=1 uid=81 ct=1 lid=81 tim=1241053855723263 err=922

CREATE
TABLE SCOTT.J$DEPT ( OPERATION$ CHAR(2), CSCN$ NUMBER,
COMMIT_TIMESTAMP$ DATE, XIDUSN$ NUMBER, XIDSLT$ NUMBER, XIDSEQ$ NUMBER

, TIMESTAMP$ DATE, DEPTNO NUMBER(2)  ) USERS PARTITION BY RANGE (cscn$) (PARTITION p1 VALUES LESS THAN (281474976710656))

EXEC #3:c=0,e=56,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=1241053855731599

Akkkkkkkkkkkkkkkk

FETCH #3:c=0,e=514,p=0,cr=4,cu=0,mis=0,r=1,dep=1,og=4,tim=1241053855732165

=====================

PARSING IN CURSOR #6 len=83 dep=1 uid=0 ct=3 lid=0 tim=1241053855735395 hv=1936881461 ad=‘2fa86004‘ sqlid=‘9gbtbxttr4xtp‘

select jarname from javajarobjects$ where bjname=:1 and owner#=:2 and namespace=:3

END OF STMT

PARSE #6:c=2000,e=1106,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=1241053855735387

EXEC #6:c=999,e=1650,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=1241053855737156

FETCH #6:c=1000,e=280,p=0,cr=4,cu=0,mis=0,r=0,dep=1,og=4,tim=1241053855737494

STAT #6 id=1 cnt=0 pid=0 pos=1 bj=12468 p=‘TABLE ACCESS FULL JAVAJAROBJECTS$ (cr=4 pr=0 pw=0 time=0 us cost=2 size=44 card=1)‘

oracle.jdbc.driver.OracleSQLException: ORA-00922: missing or invalid option

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java)

at oracle.jdbc.driver.T2SConnection.check_error(T2SConnection.java)

at oracle.jdbc.driver.T2SStatement.checkError(T2SStatement.java)

at oracle.jdbc.driver.T2SStatement.executeForRows(T2SStatement.java)

at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java)

at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java)

at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java)

at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java)

at oracle.CDC.ChangeTable.createTable(ChangeTable.java:1657)

at oracle.CDC.ChangeTable.create(ChangeTable.java:1527)

at oracle.CDC.PublishApi.createChangeTable(PublishApi.java:427)

我们到数据库执行发现,原来是创建表时,语法有错,没有加tablespace 参数.

SQL> CREATE TABLE SCOTT.J$DEPT (

2  OPERATION$ CHAR(2), CSCN$ NUMBER, COMMIT_TIMESTAMP$ DATE, XIDUSN$ NUMBER,

3  XIDSLT$ NUMBER, XIDSEQ$ NUMBER,

4  TIMESTAMP$ DATE, DEPTNO NUMBER(2)  )

5  users

6  PARTITION BY RANGE (cscn$) (PARTITION p1 VALUES LESS THAN (281474976710656));

users

*

ERROR at line 5:

ORA-00922: missing or invalid option

SQL> l5

5* users

SQL> c/users/tablespace users

5* tablespace users

SQL> l

1  CREATE TABLE SCOTT.J$DEPT (

2  OPERATION$ CHAR(2), CSCN$ NUMBER, COMMIT_TIMESTAMP$ DATE, XIDUSN$ NUMBER,

3  XIDSLT$ NUMBER, XIDSEQ$ NUMBER,

4  TIMESTAMP$ DATE, DEPTNO NUMBER(2)  )

5  tablespace users

6* PARTITION BY RANGE (cscn$) (PARTITION p1 VALUES LESS THAN (281474976710656))

SQL> /

Table created.

到此我们已经找到原因是ODI JKM的参数定义有问题

这个时候,我们进行修改,再次执行

SQL> BEGIN

2     DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(

3          owner              => ‘SCOTT‘,

4          change_table_name  => ‘J$DEPT‘,

change_set_name    => ‘CDC‘,

source_schema      => ‘SCOTT‘,

5    6    7        source_table       => ‘DEPT‘,

8          column_type_list   => ‘DEPTNO NUMBER(2) ‘,

9          capture_values     => ‘new‘,

rs_id              => ‘n‘,

row_id             => ‘n‘,

10   11   12        user_id            => ‘n‘,

13          timestamp          => ‘y‘,

14          object_id          => ‘n‘,

source_colmap      => ‘n‘,

15   16             target_colmap      => ‘n‘,

17          ddl_markers        => ‘n‘,

18          options_string     => ‘tablespace users‘

);

19   20  END;

21  /

PL/SQL procedure successfully completed.

可以看到执行成功.

修改JKM,加入tablespace

重新启动日志,需要做下面动作

SQL> alter table dept drop supplemental log group dept;

Table altered.

SQL> BEGIN

2  DBMS_CDC_PUBLISH.DROP_CHANGE_TABLE(

3  owner              => ‘SCOTT‘,

4  change_table_name  => ‘J$DEPT‘,

5  FORCE_FLAG         => ‘Y‘);

6  end;

7  /

PL/SQL procedure successfully completed.

BEGIN

DBMS_CDC_PUBLISH.DROP_CHANGE_TABLE(

owner              => ‘SCOTT‘,

change_table_name  => ‘J$DEPT‘,

FORCE_FLAG         => ‘Y‘);

end;

/

删除创建CDC对象表的数据

SQL> delete from SNP_CDC_OBJECTS;

3 rows deleted.

SQL> commit;

Commit complete.

Operator创建订阅又出现错误

继续跟踪错误,后来测试发现订阅名称不能和变化集名称一致.

查了1天时间,耗时啊.

SQL> alter session set events ‘10046 trace name context forever, level 12‘;

Session altered.

SQL> oradebug setmypid

Statement processed.

SQL> BEGIN

2     DBMS_CDC_SUBSCRIBE.CREATE_SUBSCRIPTION(

3          change_set_name    => ‘CDC‘,

4          description        => ‘Common subscription to be used to manage journalized data‘,

subscription_name  => ‘CDC‘

);

5    6    7  END;

8  /

BEGIN

*

ERROR at line 1:

ORA-29532: Java call terminated by uncaught Java exception:

java.lang.StringIndexOutOfBoundsException: String index out of range: 4

ORA-06512: at "SYS.DBMS_CDC_SUBSCRIBE", line 12

ORA-06512: at line 2

SQL> oradebug tracefile_name

/u01/app/oracle/diag/rdbms/devdb/devdb/trace/devdb_ora_5895.trc

修改JKM:

把订阅名称多加个C.

再次启动日志,发现执行成功,数据源出现绿色图标.

查看 operator

1.jpg

3.jpg

2.jpg

4.jpg

5.jpg

6.jpg

7.jpg

13 operator_loggroup.jpg

14 restart.jpg

15 modify jkm.jpg

16jkm.jpg

17 opera.jpg

时间: 2024-11-07 00:07:11

CDC不同模式在ODI体现系列之二 异步模式的相关文章

Java设计模式菜鸟系列(十二)组合模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39828653 组合模式(Composite):组合模式有时又叫部分-整体模式,将对象组合成树形结构来表示"部分-整体"层次结构.组合模式在处理树形结构的问题时比较方便. 一.uml建模: 二.代码实现 /** * 示例:组合模式有时也称"整合-部分"模式 * * 组合模式在处理树形结构的问题时比较方便 * * 节点 */ class TreeNode { /

Spartan6系列之芯片配置模式详解

1.   配置概述 Spartan6系列FPGA通过把应用程序数据导入芯片内部存储器完成芯片的配置.Spart-6 FPGA可以自己从外部非易失性存储器导入编程数据,或者通过外界的微处理器.DSP等对其进行编程.对以上任何一种情况,都有串行配置和并行配置之分,串行配置可以减少芯片对引脚的要求,并行配置对8bit/16bit Flash或者微处理器来说更合适. 因为Xilinx的FPGA器件的配置数据存储在CMOS 配置锁存器内(CCL),因此Spartan6 FPGA器件上电后必须重新配置.Sp

MSDN搬运 之 [基于事件的异步模式]

基于事件的异步模式概述 那些同时执行多项任务.但仍能响应用户交互的应用程序通常需要实施一种使用多线程的设计方案.System.Threading 命名空间提供了创建高性能多线程应用程序所必需的所有工具,但要想有效地使用这些工具,需要有丰富的使用多线程软件工程的经验.对于相对简单的多线程应用程序,BackgroundWorker 组件提供了一个简单的解决方案.对于更复杂的异步应用程序,请考虑实现一个符合基于事件的异步模式的类. 基于事件的异步模式具有多线程应用程序的优点,同时隐匿了多线程设计中固有

CDC不同模式在ODI中体现系列之一 同步模式

CDC不同模式在ODI中体现系列之一 同步模式 Oracle Database Change Data Capture feature 变化数据捕获是一个通称,是用来描述捕捉增量变化应用到数据存储.随着数据量的不断增长和数据存储日益变化,数据捕获是数据仓库一个重要功能,特别是要求实时或近实时的数据仓库. 在Oracle数据库概念中,数据采集的变化数据库功能,能够在Oracle数据库上捕捉增量.传统上你会必须修改源代码的应用,以捕获增量变化. Oracle的变化数据捕获使增量变化捕获而不对源程序做

C#设计模式系列:简单工厂模式(Simple Factory)

1.简单工厂模式简介 1.1>.定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又称为静态工厂模式,Factory类为静态类或包含静态方法. 1.2>.使用频率  中 2.简单工厂模式结构 2.1>.结构图 2.2>.参与者 简单工厂模式参与者: ◊ Product:抽象产品类,将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中. ◊ ConcretePr

Android总结篇系列:Activity启动模式(lauchMode)

本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些理解,在此感谢原作者. 文章地址: http://blog.csdn.net/liuhe688/article/details/6754323 ------------------------------------------------------------------------------------------------- launchMode在多个Activit

设计模式总结篇系列:工厂方法模式(Factory Method)

工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建.一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建. 根据具体产生类对象的方法定义形式,又可以将其分为普通工厂方法模式.多个工厂方法模式和静态工厂方法模式. 一.普通工厂方法模式: 常见的经典写法如下(以发送邮件和短信为例): 1.定义邮件类和短信类具有的共同接口: 1 interface Sender{ 2 3 public void sender(); 4 5 } 2.定义邮件类和短信类: 1 cl

菜鸟学设计模式系列笔记之Prototype模式(原型模式)

菜鸟学设计模式系列笔记之Prototype模式: Intent: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Motivation:以一个已有的对象作为原型,通过它来创建新的对象. 在增加新的对象的时候,新对象的细节创建工作由自己来负责,从而使新对象的创建过程与框架隔离开来. 应用场景: (1)当一个系统应该独立于它的产品创建.构成和表示时 (2)当要实例化的类是在运行时刻指定时,例如动态加载 (3)为了避免创建一个产品类层次平行的工厂类层次时 (4)当一个类的实例只能有几个

CCNP实验九:OSPF 帧中继实验系列2:BMA模式

一,帧中继配置 r1(config)#inter lo 0 r1(config-if)#ip add 1.1.1.1 255.255.255.0 r1(config-if)#ip ospf network point-to-p r1(config-if)#inter s1/2 r1(config-if)#en frame-relay r1(config-if)#ip add 178.1.1.1 255.255.255.0 r1(config-if)#no frame-relay inverse-