快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

Oracle的CDC方案

请联系QQ:1793040 索取软件

Oracle的CDC方案

首先,需要创建一个发布者用户和一个订阅者用户,将源表的所有权限赋给发布者,然后,需要登录到发布者账号创建源表的变化集和变化表,将变化表的查询权限赋给订阅者,然后登录订阅者用户账号新建订阅视图等操作,通过扩展订阅视图来查询变化表的数据,最后通过ETL将变化数据同步到目标表中去。

登录到任何一个具有创建表权限的Oracle用户,这个方案示例中是Scott用户,scott用户是Oracle自带的 测试用户,如果之前没有登陆过,会被锁定,提示无法登录,则查看本节的注意事项,依据其过程操作,解锁账号后进行如下操作:

登录到scott用户:账号 scott 密码 tiger

1、在scott用户下面创建一个源表(注意,这里的表只能通过命令行来创建,不能通过navicat创建,否则就会出错。)执行:

create table test(id int,name varchar2(30),mark varchar2(50));

2、在scott用户下面创建一个目标表,是用来观察同步数据情况的,执行:

create table test_sub_data(id int,name varchar2(30),mark varchar2(50));

注意事项:scott用户是Oracle自带的测试用户,如果之前没有使用,会被锁定。如果锁定以后,有两种方法:

第一种:需要登录到具有sysdba权限的用户,执行:alter user scott IDENTIFIED by tiger account unlock;

第二种:打开本地的Oracle网页管理工具:https://localhost:1158/em,然后对用户进行解锁。

sqlplus执行 :conn sys/123456789Liu as sysdba

解释:我的账号是sys,所以执行这个命令 这里要根据 当前的数据库的sysdba账号来决定。因为后面要对数据库的各种参数设置,要启动log等操作需要sysdba账号的权限,所以,需要sysdba账号登录。

执行 :

show parameter compatible;

解释:compatible是编译版本的意思。这个参数在Oracle 9i的时候,可以将版本往低调,但是到10g之后,只能往高调整,不能往低调。

执行:

show parameter JAVA_POOL_SIZE;

解释:如果ORACLE中没有单独编写JAVA类和过程,就可以在初始参数中把java_pool_size设置为0,因为没有JAVA使用它。但是,最好还是设置一个值吧。

执行:

alter system set JAVA_POOL_SIZE=50000000 scope=BOTH;

解释:修改配置文件,有4种scope选项,scope就是范围。

scope=spfile 仅仅更改spfile里面的记载,不更改内存,也就是不立即生效,而是等

下次数据库启动生效。

有一些参数只允许用这种方法更改,scope=memory 仅仅更改内存,不改spfile。也就是下次

启动就失效了

scope=both 内存和spfile都更改,不指定scope参数,等同于scope=both。

执行:

show parameter JOB_QUEUE_PROCESSES;

解释:job_queue_processes的参数设置问题:

1.job_queue_processes取值范围为0到1000

2.当设定该值为0的时候则任意方式创建的job都不会运行。

3.当设定该值大于1时,且并行执行job时,至少一个为协调进程。其总数不会超出job_queue_processes的值。

执行:

show parameter PARALLEL_MAX_SERVERS;

解释:PARALLEL_MAX_SEVERS参数设置并行执行可用的最大进程数量,改参数的缺省值为:PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 5,值的范围0-32767

执行:

show parameter PROCESSES;

//alter system set PROCESSES=507 scope=SPFILE;

show parameter SESSIONS;

alter system set SESSIONS=250 scope=SPFILE;

解释:session是Oracle中的概念,process是操作系统中的概念

若不使用连接池,那新建一个连接,产生一个操作系统的process(进程),在oracle中体现为一个session,

若使用连接池,那可能N个连接只有一个进程,而oracle中体现为N个session

执行:

show parameter STREAMS_POOL_SIZE;

alter system set STREAMS_POOL_SIZE=71M scope=BOTH;

解释:当SGA_TARGET初始化参数设置为非零值时,Oracle的自动共享内存管理功能可管理Streams池的大小。如果STREAMS_POOL_SIZE初始化参数也设置为非零值,则自动共享内存管理将此值用作Streams池的最小值。

如果STREAMS_POOL_SIZE初始化参数设置为非零值,并且SGA_TARGET参数设置为0(零),则Streams池大小是STREAMS_POOL_SIZE参数指定的值(以字节为单位)。

如果初始化参数STREAMS_POOL_SIZE和SGA_TARGET初始化参数都设置为0(零),则默认情况下,数据库中第一次使用Streams会将等于共享池10%的内存量从缓冲区缓存传输到Streams池。

执行:

show parameter UNDO_RETENTION;

alter system set UNDO_RETENTION=3600 scope=BOTH;

解释:先用show parameter undo_retention显示回滚段的保留时间,显示的时间单位是”秒”。

oracle里对undo_retention默认时间是900秒。

如果要修改 undo_retention的默认时间,用下面一句话修改:

ALTER SYSTEM SET undo_retention=100 SCOPE=BOTH;

执行:

shutdown immediate;

解释:shutdown的几种方式,shutdown abort的一些弊端有哪些

1、shutdown normal

正常方式关闭数据库。

2、shutdown immediate

立即方式关闭数据库。

在SVRMGRL中执行shutdown immediate,数据库并不立即关闭,而是在Oracle执行某些清除工作后才关闭(终止会话、释放会话资源),

当使用shutdown不能关闭数据库时,shutdown immediate可以完成数据库关闭的操作。

3、shutdown abort

直接关闭数据库,正在访问数据库的会话会被突然终止,

如果数据库中有大量操作正在执行,这时执行shutdown abort后,重新启动数据库需要很长时间 shutdown abort 的时候,跟kill 进程是一样的效果

执行:

startup mount;

解释:

startup nomount选项:(读初始化参数文件,启动实例)

startup nomount选项启动实例,但不安装数据库。当数据库以这个模式启动时,参数文件被读取;后台进程和内存结构被启动;但它们不被附加或与数据库的磁盘结构进行通信。当实例处于这个状态时,数据库是不可使用的。通常启动到这里可以做create database , create or recreate control file 或者是mount standby database等动作,

修改parameter也是可以的。

startup mount 选项:(打开控制文件)

startup mount选项执行STARTUP NOMOUNT选项的所有工作,但另外附加数据库结构并与这些结构进行交互。这时Oracle从它用来查找和附加到主要数据库结构的控制文件中获得信息。当处于这个模式时,可以执行一些管理型任务,比如恢复。读取control file 通常启动到这里的目的有recover dtabase ; backup database ; rename db files ,change archivelog mode等

startup open 选项:(打开数据文件,日志文件)

如果STARTUP命令行上没有指定任何模式,STARTUP OPEN选项就是默认的启动模式。STARTUP OPEN选项执行STARTUP NOMOUNT和STARTUP MOUNT选项的所有步骤。这个选项把数据库变成对所有用户都时可用的。

open datafile ,online redo log

startup force选项:

如果在用正常方式启动数据库时遇到了困难,可以使用STARTUP FORCE选项。STARTUP FORCE选项首先异常关闭数据库,然后重新启动它。

STARTUP RESTRICT选项:

STARTUP RESTRICT选项启动数据库并把它置入OPEN模式,但只给拥有RESTRICTED SESSION权限的用户赋予访问权。

执行:

alter database archivelog;

解释:Oracle数据库可以运行在2种模式下:归档模式(archivelog)和非归档模式(noarchivelog)

归档模式可以提高Oracle数据库的可恢复性,生产数据库都应该运行在此模式下,归档模式应该和相应的备份策略相结合,只有归档模式没有相应的备份策略只会带来麻烦。

执行:

alter database open;

解释:

oracle数据库启动分三个步骤

nomount

mount

open

startup是数据库从开始阶段的启动,需要经过上述三个步骤

alter database open是数据库处于mount状态,从mount状态打开数据库的命令

1、Sqlplus下执行:

ALTER DATABASE FORCE LOGGING;

解释:

LOGGING:当创建一个数据库对象时将记录日志信息到联机重做日志文件。LOGGING实际上是对象的一个属性,用来表示在创建对象时是 否记录REDO日志,包括在做DML时是否记录REDO日志。一般表上不建议使用NOLOGGING,在创建索引或做大量数据导入时,可以使用 NOLOGGING 。

FORCE LOGGING:简言之,强制记录日志,即对数据库中的所有操作都产生日志信息,并将该信息写入到联机重做日志文件。 NOLOGGING:正好与LOGGING、FORCE LOGGING 相反,尽可能的记录最少日志信息到联机日志文件。 FORCE LOGGING可以在数据库级别、表空间级别进行设定、而LOGGING与NOLOGGING可以在数据对象级别设定。 在使用DATA GUARD 时,要求使用强制记录日志模式。注:FORCE LOGGING并不比一般的LOGGING记录的日志多,数据库在FORCE LOGGING 状态下,NOLOGGING选项将无效,因为NOLOGGING将破坏DATAGUARD的可恢复性.FORCE LOGGING强制数据库在任何状态下必须记录日志。

2、Sys用户下执行:

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

解释:

附加日志(supplementallog)可以指示数据库在日志中添加额外信息到日志流中,以支持基于日志的工具,如逻辑standby、streams、GoldenGate、LogMiner。可以在数据库和表上设置。

1.数据库级设置,分两类:

1.1最小附加日志(minimalsupplementallogging):

DATA选项启用最小附加日志。

启用最小日志可以确保LogMiner(或其他任何基于LogMiner的产品)可以支持行链接、簇表、索引组织表等。

语法如下:

alterdatabase{add|drop}supplementallogdata;

1.2标识键日志(identificationkeylogging):

DATA(all,primarykey,unique,foreignkey)columns选项启用最小日志及列数据日志。

在源库日志为变化来源同步其他数据库的情况下,比如逻辑备用数据库,受影响的数据行必须以列数据标识(而不是rowid),必须启用此种附加日志。

语法如下:

alterdatabase{add|drop}supplementallog{data(all,primarykey,unique,foreignkey)columns};

缺省情况下,Oracle不启用以上任何附加日志。当使用ALL,PRIMARY,UNIQUE或FOREIGN附加日志时最小补全日志默认开启(即检查结果为IMPLICIT)。在删除所有导致IMPLICIT最小化附加日志的附加日志后,最小化附加日志变为NO。

3、继续在Sys用户下面执行:

ALTER TABLE scott.test ADD SUPPLEMENTAL LOG GROUP log_group_prod (ID, NAME, MARK) ALWAYS;

解释:将这个表的操作添加日志组,这里的scott.test 表就是第一章中创建的源表。

1、数据库管理员sys下面:

执行:

CREATE TABLESPACE CDC_TBSP

datafile ‘C:\cdc\CDC_TBSP.dbf’ SIZE 50M

AUTOEXTEND OFF

BLOCKSIZE 8192

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K;

解释:创建一个表空间,这里的路径是自己创建的一个文件夹,但是表空间文件不需要创建。

2、执行:

CREATE USER cdc_pub

IDENTIFIED BY 1234

DEFAULT TABLESPACE cdc_tbsp

TEMPORARY TABLESPACE temp

QUOTA UNLIMITED ON cdc_tbsp;

GRANT CREATE SESSION TO cdc_pub;

GRANT CREATE TABLE TO cdc_pub;

GRANT CREATE TABLESPACE TO cdc_pub;

GRANT UNLIMITED TABLESPACE TO cdc_pub;

GRANT SELECT_CATALOG_ROLE TO cdc_pub;

GRANT EXECUTE_CATALOG_ROLE TO cdc_pub;

GRANT CREATE SEQUENCE TO cdc_pub;

GRANT DBA TO cdc_pub;

GRANT EXECUTE on DBMS_CDC_PUBLISH TO cdc_pub;

EXECUTE DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(GRANTEE=> ‘cdc_pub’);

解释:创建用户并为用户授权。

3、执行:

grant all on scott.test to cdc_pub;

解释:将这个源表的所有的权限授予 cdc_pub,这里的scott.test 表就是第一章中创建的源表。

sqlplus登录到刚刚创建的发布者账号里面:

1、初始化表,执行:

BEGIN

DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(TABLE_NAME=> ‘scott.test’);

END;

/

解释:这里的scott.test 表就是第一章中创建的源表。

2、创建变更集执行:

BEGIN

DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(

change_set_name=> ‘CDC_SCOTT_TEST’,

description=> ‘Change set for liuxu test CDC use product info’,

change_source_name=> ‘HOTLOG_SOURCE’,

stop_on_ddl=> ‘y’,

begin_date=> sysdate,

end_date=> sysdate+10000);

END;

/

解释:(1)同步方式时候,使用change_source_name参数必须使用默认的改变源, SYNC_SOURCE。因为这里是 异步方式 所以 使用 HOTLOG_SOURCE。

(2)这里end_date的10000是指天数的意思。

3、创建变更表:

执行:

BEGIN

DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(

owner=> ‘cdc_pub’,

change_table_name=> ‘cdc_test’,

change_set_name=> ‘CDC_SCOTT_TEST’,

source_schema=> ‘SCOTT’,

source_table=> ‘TEST’,

column_type_list=> ‘ID NUMBER(5), NAME VARCHAR2(30),MARK VARCHAR2(50)’,

capture_values=> ‘both’,

rs_id=> ‘y’,

row_id=> ‘Y’,

user_id => ‘n’,

timestamp=> ‘n’,

object_id=> ‘n’,

source_colmap=> ‘n’,

target_colmap=> ‘y’,

options_string=> ‘TABLESPACE CDC_TBSP’);

END;

/

解释:column_type_list必须和源表一致,如果和源表同名字段不同,会出错,如果有源表中不存在字段,会一直为空。

4、激活变更集:

执行:

BEGIN

DBMS_CDC_PUBLISH.ALTER_CHANGE_SET(

change_set_name=> ‘CDC_SCOTT_TEST’,

enable_capture=> ‘y’);

END;

/

1、在Sys账号下登录:

执行:

CREATE TABLESPACE cdc_sub_tbsp

datafile ‘C:\cdc\cdc_sub_tbsp.dbf’ SIZE 50M

AUTOEXTEND OFF

BLOCKSIZE 8192

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K;

解释:创建订阅者的表空间

2、执行:

CREATE USER cdc_sub1

IDENTIFIED BY 1234

DEFAULT TABLESPACE cdc_sub_tbsp;

GRANT connect, resource,dba TO cdc_sub1;

解释:创建一个订阅者并为订阅者授权

3、登录到发布者账号,将变更表的查询权限赋给订阅者:

执行:

grant select on cdc_test to cdc_sub1;

解释:cdc_test是创建的变更表,将创建的变更表的查看权限授权给订阅者用户

到此 订阅者用户 应该可以检测到表的变更了

4、在scott用户下面对表的数据进行增删改查,在源表中对数据进行更改:

insert into test values(1,’beijing’,’11’);

5、然后登录到订阅者账号

执行:

select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark

from cdc_pub.cdc_test t;

来查看操作情况

1、查找订阅者具有访问权限的源表。

sqlplus登录订阅者用户:

执行:

SELECT * FROM DBA_SOURCE_TABLES;

2、查看订阅者具有访问权限的变更集名称和列

sqlplus登录订阅者用户:

执行:

SELECT UNIQUE CHANGE_SET_NAME, COLUMN_NAME, PUB_ID

FROM DBA_PUBLISHED_COLUMNS

WHERE SOURCE_SCHEMA_NAME=’SCOTT’ AND SOURCE_TABLE_NAME=’TEST’

;

解释:这里的SOURCE_SCHEMA_NAME和SOURCE_TABLE_NAME由第一步得到的。

3、创建一个订阅集

登录到订阅者用户:

执行:

BEGIN

dbms_cdc_subscribe.create_subscription(

change_set_name=>’CDC_SCOTT_TEST’,

description=>’cdc scott table test de subscription Set create by liuxu.’,

subscription_name=>’CDC_SCOTT_SUB1′);

END;

/

4、创建一个订阅表 和源表中的 信息相关联

登录到订阅者用户:

执行:

BEGIN

dbms_cdc_subscribe.subscribe(

subscription_name=>’CDC_SCOTT_SUB1′,

source_schema=>’SCOTT’,

source_table=>’TEST’,

column_list=>’ID, NAME,MARK’,

subscriber_view=>’TEST_SUB_VIEW’);

END;

/

执行:

select * from tab;

解释:查看是否创建成功

5、激活订阅表

登录到订阅者用户:

执行:

BEGIN

dbms_cdc_subscribe.activate_subscription(

subscription_name=>’CDC_SCOTT_SUB1′);

END;

/

6、获取订阅扩展窗口

登录到订阅者用户:

执行:

BEGIN

dbms_cdc_subscribe.extend_window(

subscription_name=>’CDC_SCOTT_SUB1′);

END;

/

7、读取和 查询订阅试图中的内容

登录到订阅者用户:

执行:

select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark

from test_sub_view t;

8、对源表中的数据进行修改后读取订阅表内容

清空窗口:

执行:

BEGIN

DBMS_CDC_SUBSCRIBE.PURGE_WINDOW(

subscription_name=> ‘CDC_SCOTT_SUB1’);

END;

/

执行:

SELECT OPERATION$, ID, NAME, MARK FROM test_sub_view;

解释:这里的结果应该是 未选定行。

登录到scott用户,对源表进行操作:

执行:

insert into test values(2,’xian’,’22’);

重新获取变更数据:

登录到订阅者用户:

执行:

BEGIN

DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW(

subscription_name=> ‘CDC_SCOTT_SUB1’);

END;

/

SELECT OPERATION$, ID, NAME, MARK FROM test_sub_view;

解释:能够查看到结果

停止当前订阅者对源表数据的订阅,需要删除订阅表:

登录到订阅者账号执行:

BEGIN

DBMS_CDC_SUBSCRIBE.DROP_SUBSCRIPTION(

subscription_name=> ‘cdc_scott_sub1’);

END;

/

如果 要不想让数据发布,则需要登录 发布者的账号 然后 删除 变更表

在发布者用户下执行 激活变更集的操作,如果没有出错,会一切 正常,如果出错了,会报出变更集存在捕获 错误的异常。

在订阅者用户下执行扩展窗口操作,如果出现捕获变更集错误的异常的时候,说明存在错误。

如果在后续的过程中,修改了源表的字段名称信息,那么将会报错,会提示错误。这个时候,需要做如下操作:

1、登录到sys用户(即sysdba用户)下面执行:

select LOCAL_TRANSACTION_ID from DBA_APPLY_ERROR;

BEGIN

DBMS_APPLY_ADM.delete_error(local_transaction_id=>’3.2.3914′);

end;

/

解释:这里面的id的内容是第一步执行出来的结果。

2、删除变更集和变更表

登录到发布者用户下面执行:

BEGIN

DBMS_CDC_PUBLISH.DROP_CHANGE_TABLE(

owner=> ‘cdc_pub’,

change_table_name=> ‘cdc_test’,

force_flag=>’Y’);

End;

/

解释:删除变更表

执行:

BEGIN

DBMS_CDC_PUBLISH.DROP_CHANGE_SET(‘CDC_SCOTT_TEST’);

End;

/

解释:删除变更集

3、然后重新执行第四章中的创建变更集,创建变更表,激活变更集,和第五章中将变更表授权给订阅者的操作。

4、删除订阅:

登录到订阅者用户,执行:

BEGIN

dbms_cdc_subscribe.drop_subscription(

subscription_name=>’CDC_SCOTT_SUB1′);

END;

/

解释:删除订阅

5、然后重新执行第六章中的创建订阅集,创建订阅表和激活订阅集的操作。

新建一个转换如下:

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1793040