您的位置:首页 > 数据库 > Oracle

在Oracle建立CDC

2015-08-18 15:44 507 查看
主要流程参见:

/article/1330376.html

由于本人对Oracle陌生的紧,所以犯了很多错误,感谢朋友们的大力支持。

记下碰到的错误和解决方法:

1. 数据库必须是在archivelog模式,否则后面激活变更集会报错。

将数据库从NoArchiveLog转成ArchiveLog过程参见 http://blog.csdn.net/fengyifei11228/article/details/6049357
需要通过CRT远程连接到服务器,服务器上连实例命令为:sqlplus sys / as sysdba
若本机,命令为:sqlplus sys/mima@pacs as sysdba
通过Oracle命令新建文件夹命令为:host md abc就是在当前路径新建个abc文件夹。
2.ALTER TABLE scott.t1 ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
//要加columns

3.GRANT
EXECUTE on DBMS_CDC_PUBLISH TO cdcpub; //需要sys权限

4.EXECUTE
DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(GRANTEE => 'cdcpub'); //需要在Oracle的命令窗口中运行

5.将放在Job里10秒一次。

create or replace procedure test_jobproce   as
BEGIN
DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW(
subscription_name => 't1_sub');
END test_jobproce;

declare  test_job_really number;
begin
dbms_job.submit(test_job_really,'test_jobproce;',sysdate,'sysdate+1/8640');
commit;
end;

select * from dba_jobs;


问题在于这样创建CDC实在太复杂,SQLServer的变更表都是自动创建的,而Oracle都要手工去建。

接下来测试一下其他字符集,或者多表CDC的情况。

最后附上所有代码:
create user cdcpub identified by cdcpub;

create user subscriber1 identified by subscriber1

ALTER DATABASE FORCE LOGGING;

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

ALTER TABLE eapp.userinfo ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

ALTER USER cdcpub QUOTA UNLIMITED ON SYSTEM

QUOTA UNLIMITED ON SYSAUX;

GRANT CREATE SESSION TO cdcpub;

GRANT CREATE TABLE TO cdcpub;

GRANT CREATE TABLESPACE TO cdcpub;

GRANT UNLIMITED TABLESPACE TO cdcpub;

GRANT SELECT_CATALOG_ROLE TO cdcpub;

GRANT EXECUTE_CATALOG_ROLE TO cdcpub;

GRANT CREATE SEQUENCE TO cdcpub;

GRANT DBA TO cdcpub;

GRANT EXECUTE ON DBMS_CDC_PUBLISH TO cdcpub;

--EXECUTE DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(GRANTEE => 'cdcpub');

BEGIN

DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(TABLE_NAME => 'eapp.userinfo');

END;

BEGIN

DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(

change_set_name => 'cdc_test_cs',

description => 'Change set for eapp.userinfo',

change_source_name => 'HOTLOG_SOURCE',

stop_on_ddl => 'y'

);

END;

BEGIN

DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(

owner => 'cdcpub',

change_table_name => 't1_ct',

change_set_name => 'cdc_test_cs',

source_schema => 'eapp',

source_table => 'userinfo',

column_type_list =>'PATIENT_ID number,INP_NO number,NAME varchar2(150),NAME_PHONETIC varchar2(2000),SEX varchar2(20),DATA_OF_BIRTH number,BIRTHDATE DATE',

capture_values => 'both',

rs_id => 'y',

row_id => 'n',

user_id => 'n',

timestamp => 'n',

object_id => 'n',

source_colmap => 'n',

target_colmap => 'y',

options_string => '');

END;

BEGIN

DBMS_CDC_PUBLISH.ALTER_CHANGE_SET(

change_set_name => 'cdc_test_cs',

enable_capture => 'y');

END;

GRANT SELECT ON cdcpub.t1_ct TO subscriber1;

GRANT CREATE TABLE TO subscriber1;

GRANT CREATE SESSION TO subscriber1;

GRANT CREATE VIEW TO subscriber1;

GRANT UNLIMITED TABLESPACE TO subscriber1;

BEGIN

DBMS_CDC_SUBSCRIBE.CREATE_SUBSCRIPTION(

change_set_name => 'cdc_test_cs',

description => 'Change data for t1',

subscription_name => 't1_sub');

END;

BEGIN

DBMS_CDC_SUBSCRIBE.SUBSCRIBE(

subscription_name => 't1_sub',

source_schema => 'eapp',

source_table => 'userinfo',

column_list => 'PATIENT_ID number,INP_NO number,NAME varchar2(150),NAME_PHONETIC varchar2(2000),SEX varchar2(20),DATA_OF_BIRTH number,BIRTHDATE DATE',

subscriber_view => 't1_view');

END;

BEGIN

DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION(

subscription_name => 't1_sub');

END;

BEGIN

DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW(

subscription_name => 't1_sub');

END;

select * from t1_view;

create or replace procedure test_jobproce as BEGIN DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW( subscription_name => 't1_sub'); END test_jobproce; declare test_job_really number; begin dbms_job.submit(test_job_really,'test_jobproce;',sysdate,'sysdate+1/8640'); commit; end; select * from dba_jobs;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: