异步AutoLog CDC 配置


CDC有同步模式和异步模式
1. CDC同步模式:
通过trigger来实现。

2. CDC异步模式:
2.1 异步HotLog模式
2.2 异步分布式HotLog模式
2.3 异步AutoLog模式。
2.3.1 异步Autolog模式-online redo log
2.3.2 异步Autolog模式-archive log

异步Autolog模式(Asynchronous AutoLog Mode)则是先将日志文件从source database传递到staging database,然后在staging database执行日志分析。这样可以将对source database的压力减到最小。日志的传递通过Redo transport services服务来实现,是不是对这个服务名很熟悉?在Data Guard中也是通过该服务将主库的日志传递到备库的,实际上该模式对于日志的处理和Data Guard中基本上是同样的机制。所以这里也需要在source database中设置相应的LOG_ARCHIVE_DEST_n参数来实现日志的传递。

异步AutoLog模式既可以使用联机日志,也可以使用归档日志来获得增量数据信息。

AUTOLOG CDC 使用 Oracle Streams downstream capture 实施异步autolog发布,异步Autolog online redo log 使用Streams real-time downstream capture,异步Autolog archive log 使用 Streams archived-log downstreams capture。

实施异步Autolog archive log 模式

  1. --1.设置source端初始化参数   
  2. [oracle@source ~]$ slqlplus / as sysdba  
  3. SQL> show parameter undo_retention;  
  4.   
  5. NAME     TYPE VALUE  
  6. ------------------------------------ ----------- ------------------------------   
  7. undo_retention     integer 900  
  8. SQL> alter system set undo_retention=3600 scope=BOTH;  
  9.   
  10. System altered.  
  11.   
  12. SQL>  alter system set log_archive_dest_1 ="location=/home/oracle/archive  mandatory reopen=2";  scope=both;  
  13.   
  14. System altered.  
  15.   
  16. SQL> alter system set log_archive_dest_2 = "service=targdb arch optional noregister reopen=2 template=/home/oracle/archive2/arch_%s_%t_%r.arc" scope=both;  
  17.   
  18. System altered.  
  19.   
  20. SQL> alter system set log_archive_dest_state_1=enable scope=both;  
  21.   
  22. System altered.  
  23.   
  24. SQL> alter system set log_archive_dest_state_2=enable scope=both;  
  25.   
  26. System altered.  
  27.   
  28. SQL> alter system set log_archive_format='arch_%s_%t_%r.arc' scope=spfile;  
  29.   
  30. System altered.  
  31.   
  32. SQL> show parameter global_names  
  33.   
  34. NAME     TYPE VALUE  
  35. ------------------------------------ ----------- ------------------------------   
  36. global_names     boolean FALSE  
  37.   
  38. SQL> alter system set global_names=TRUE scope=BOTH;  
  39.   
  40. System altered.  
  41.   
  42. SQL> alter system set remote_login_passwordfile=shared  
  43.   2  scope  =spfile;  
  44.   
  45. System altered.  
  46.   
  47. SQL> shutdown immediate  
  48. Database closed.  
  49. Database dismounted.  
  50. ORACLE instance shut down.  
  51. SQL> startup mount;  
  52. ORACLE instance started.  
  53.   
  54. Total System Global Area  276824064 bytes  
  55. Fixed Size    2020160 bytes  
  56. Variable Size   92277952 bytes  
  57. Database Buffers  180355072 bytes  
  58. Redo Buffers    2170880 bytes  
  59. Database mounted.  
  60. SQL> archive log list  
  61. Database log mode       Archive Mode  
  62. Automatic archival       Enabled  
  63. Archive destination       /home/oracle/archive  
  64. Oldest online log sequence     1  
  65. Next log sequence to archive   2  
  66. Current log sequence       2  
  67.   
  68.   
  69. --2.设置target端初始化参数   
  70. [oracle@target ~]$ sqlplus / as sysdba  
  71. SQL> alter system set global_names=TRUE scope=BOTH;  
  72.   
  73. System altered.  
  74.   
  75. SQL> alter system set undo_retention=3600 scope=BOTH;  
  76.   
  77. System altered.  
  78.   
  79. SQL> show parameter remote_archive_enable  
  80.   
  81. NAME     TYPE VALUE  
  82. ------------------------------------ ----------- ------------------------------   
  83. remote_archive_enable     string true  
  84. SQL> alter system set log_archive_dest_1="location=/home/oracle/archive" scope=both;  
  85.   
  86. System altered.  
  87.   
  88. SQL> alter system set remote_login_passwordfile=shared scope  =spfile;  
  89.   
  90. System altered.  
  91.   
  92. SQL> shutdown immediate;  
  93. Database closed.  
  94. Database dismounted.  
  95. ORACLE instance shut down.  
  96. SQL> startup mount;  
  97. ORACLE instance started.  
  98.   
  99. Total System Global Area  276824064 bytes  
  100. Fixed Size    2020160 bytes  
  101. Variable Size   92277952 bytes  
  102. Database Buffers  180355072 bytes  
  103. Redo Buffers    2170880 bytes  
  104. Database mounted.  
  105. SQL> archive log list;  
  106. Database log mode       Archive Mode  
  107. Automatic archival       Enabled  
  108. Archive destination       /home/oracle/archive  
  109. Oldest online log sequence     1  
  110. Next log sequence to archive   2  
  111. Current log sequence       2  
  112. SQL> alter database open;  
  113.   
  114. Database altered.  
  115.   
  116. SQL> archive log list  
  117. Database log mode       Archive Mode  
  118. Automatic archival       Enabled  
  119. Archive destination       /home/oracle/archive  
  120. Oldest online log sequence     1  
  121. Next log sequence to archive   2  
  122. Current log sequence       2  
  123. SQL> alter system switch logfile;  
  124.   
  125. System altered.  
  126.   
  127. SQL>  archive log list  
  128. Database log mode       Archive Mode  
  129. Automatic archival       Enabled  
  130. Archive destination       /home/oracle/archive  
  131. Oldest online log sequence     1  
  132. Next log sequence to archive   2  
  133. Current log sequence       3  
  134.   
  135. --3.source端设置FORCE LOGGING日志模式 与 最小的数据库级SUPPLEMENTAL LOG   
  136. SQL> alter database force logging;  
  137.   
  138. Database altered.  
  139.   
  140. SQL> alter database add supplemental log data;  
  141.   
  142. Database altered.  
  143.   
  144. SQL> alter database open;  
  145.   
  146. Database altered.  
  147.   
  148. SQL> alter system switch logfile;  
  149.   
  150. System altered.  
  151.   
  152. SQL> archive log list;  
  153. Database log mode       Archive Mode  
  154. Automatic archival       Enabled  
  155. Archive destination       /home/oracle/archive  
  156. Oldest online log sequence     1  
  157. Next log sequence to archive   2  
  158. Current log sequence       3  
  159. SQL> col log_min format a7  
  160. SQL> col log_pk format a6  
  161. SQL> col log_pk format a6  
  162. SQL> col log_ui format a6  
  163. SQL> col log_fk format a6  
  164. SQL> col log_all format a7  
  165. SQL> col force_log format a9  
  166. SQL> SELECT supplemental_log_data_min LOG_MIN, supplemental_log_data_pk LOG_PK, supplemental_log_data_ui LOG_UI, supplemental_log_data_fk LOG_FK,   
  167. supplemental_log_data_all LOG_ALL, force_logging FORCE_LOG  
  168. FROM v$database;     
  169.   
  170. LOG_MIN LOG_PK LOG_UI LOG_FK LOG_ALL FORCE_LOG  
  171. ------- ------ ------ ------ ------- ---------   
  172. YESNO     NO     NO     NO      YES  
  173.   
  174.   
  175. --4.target端,创建发布者并授权   
  176. QL> create tablespace ts_cdcpub  
  177.   2  datafile '/home/oracle/oradata/targ/ts_cdcpub01.dbf' size 100M;  
  178.   
  179. Tablespace created.  
  180.   
  181. SQL> CREATE USER cdcpub IDENTIFIED BY cdcpub DEFAULT TABLESPACE ts_cdcpub  
  182.    QUOTA UNLIMITED ON SYSTEM  
  183.    QUOTA UNLIMITED ON SYSAUX;  2    3    
  184.   
  185. User created.  
  186.   
  187. SQL> GRANT CREATE SESSION TO cdcpub;  
  188.   
  189. Grant succeeded.  
  190.   
  191. SQL> GRANT CREATE TABLE TO cdcpub;  
  192.   
  193. Grant succeeded.  
  194.   
  195. SQL> GRANT CREATE TABLESPACE TO cdcpub;  
  196.   
  197. Grant succeeded.  
  198.   
  199. SQL> GRANT UNLIMITED TABLESPACE TO cdcpub;  
  200.   
  201. Grant succeeded.  
  202.   
  203. SQL> GRANT SELECT_CATALOG_ROLE TO cdcpub;  
  204.   
  205. Grant succeeded.  
  206.   
  207. SQL> GRANT EXECUTE_CATALOG_ROLE TO cdcpub;  
  208.   
  209. Grant succeeded.  
  210.   
  211. SQL> GRANT DBA TO cdcpub;  
  212.   
  213. Grant succeeded.  
  214.   
  215. SQL> GRANT CREATE SEQUENCE TO cdcpub;  
  216.   
  217. Grant succeeded.  
  218.   
  219. SQL> GRANT EXECUTE on DBMS_CDC_PUBLISH TO cdcpub;  
  220.   
  221. Grant succeeded.  
  222.   
  223. SQL> EXECUTE DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(grantee => 'cdcpub');  
  224.   
  225. PL/SQL procedure successfully completed.  
  226.   
  227.   
  228. --5.source端生成LogMiner数据字典,之后才能执行第6步   
  229. SQL> SET SERVEROUTPUT ON  
  230. VARIABLE f_scn NUMBER;  
  231. BEGIN  
  232.     :f_scn := 0;  
  233.     DBMS_CAPTURE_ADM.BUILD(:f_scn);  
  234.     DBMS_OUTPUT.PUT_LINE('The first_scn value is ' || :f_scn);  
  235. END;  
  236. /SQL> SQL>   2    3    4    5    6    
  237.   
  238. The first_scn value is 544891  
  239.   
  240. PL/SQL procedure successfully completed.  
  241.   
  242.   
  243. --6.source端准备源表   
  244. SQL> SQL> desc scott.e dept  
  245.  Name   Null?    Type  
  246.  ----------------------------------------- -------- ----------------------------   
  247.  DEPTNO    NOT NULL NUMBER(2)  
  248.  DNAME    VARCHAR2(14)  
  249.  LOC    VARCHAR2(13)  
  250.   
  251. SQL> BEGIN  
  252.    DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(  
  253.        TABLE_NAME => 'scott.dept');  
  254. END;  
  255. /  2    3    4    5    
  256.   
  257. PL/SQL procedure successfully completed.  
  258.   
  259.   
  260. --7.source端,获取source端的global_name,用于在target端创建AutoLog改变源。   
  261. SQL> SELECT GLOBAL_NAME FROM GLOBAL_NAME;  
  262.   
  263. GLOBAL_NAME  
  264. --------------------------------------------------------------------------------   
  265. SOUR.REGRESS.RDBMS.DEV.US.ORACLE.COM  
  266.   
  267.   
  268. --8.target端,识别改变源数据库并创建改变源   
  269. SQL> BEGIN  
  270.    DBMS_CDC_PUBLISH.CREATE_AUTOLOG_CHANGE_SOURCE(  
  271.        change_source_name   => 'CHICAGO',  
  272.        description          => 'test source',  
  273.        source_database      => 'SOUR.REGRESS.RDBMS.DEV.US.ORACLE.COM',  
  274.        first_scn            => 544891);  
  275. END;  
  276. /  2    3    4    5    6    7    8    
  277.   
  278. PL/SQL procedure successfully completed.  
  279.   
  280.   
  281. --9.target端,创建改变集   
  282. SQL> BEGIN  
  283.    DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(  
  284.        change_set_name    => 'CHICAGO_DAILY',  
  285.        description        => 'change set for dept info',  
  286.        change_source_name => 'CHICAGO',  
  287.        stop_on_ddl        => 'y');  
  288. END;  
  289. /  2    3    4    5    6    7    8    
  290.   
  291. PL/SQL procedure successfully completed.  
  292.   
  293.   
  294. --10.target端,创建改变表   
  295. SQL> BEGIN  
  296.   2     DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(  
  297.        owner             => 'cdcpub',  
  298.        change_table_name => 'dept_ct',  
  299.   3         change_set_name   => 'CHICAGO_DAILY',  
  300.        source_schema     => 'SCOTT',  
  301.   4         source_table      => 'DEPT',  
  302.        column_type_list  => 'DEPTNO NUMBER(2), DNAME VARCHAR2(14), LOC VARCHAR2(13)',  
  303.        capture_values    => 'both',  
  304.        rs_id             => 'y',  
  305.        row_id            => 'n',  
  306.   5         user_id           => 'n',  
  307.   6         timestamp         => 'n',  
  308.        object_id         => 'n',  
  309.   7         source_colmap     => 'n',  
  310.        target_colmap     => 'y',  
  311.        options_string    => 'TABLESPACE ts_cdcpub');  
  312.   8  END;  
  313. /  
  314.   9   10   11   12   13   14   15   16   17   18   19    
  315.   
  316. PL/SQL procedure successfully completed.  
  317.   
  318.   
  319. --11.target端,开启改变集,这时oracle的流捕获和应用进程启动   
  320. SQL> SQL> BEGIN  
  321.    DBMS_CDC_PUBLISH.ALTER_CHANGE_SET(  
  322.        change_set_name => 'CHICAGO_DAILY',  
  323.        enable_capture  => 'y');  
  324. END;  
  325. /  2    3    4    5    6    
  326.   
  327. PL/SQL procedure successfully completed.  
  328.   
  329.   
  330. --12.source端,切换重做日志,oracle开始捕获数据。   
  331. SQL> alter system switch logfile;  
  332.   
  333. System altered.  
  334.   
  335.   
  336. --13.target端,创建订阅者并赋权   
  337. SQL> create user subs identified by subs default tablespace users;  
  338.   
  339. User created.  
  340.   
  341. SQL> grant connect,resource to subs;  
  342.   
  343. Grant succeeded.  
  344.   
  345. SQL> grant select on cdcpub.dept_ct to subs;  
  346.   
  347. Grant succeeded.  
  348.   
  349.   
  350. ------------------------------------------------------------------------------------------------------------------------   
  351. 如何订阅改变数据(target端)  
  352.   
  353. --1.查找订阅者能够访问的源表   
  354. SQL> SELECT * FROM ALL_SOURCE_TABLES;  
  355.   
  356. SOURCE_SCHEMA_NAME       SOURCE_TABLE_NAME  
  357. ------------------------------ ------------------------------   
  358. SCOTT       DEPT  
  359.   
  360.   
  361. --2.查找订阅者能够访问改变集名称与列信息   
  362. SQL> SELECT UNIQUE CHANGE_SET_NAME, COLUMN_NAME, PUB_ID   
  363. FROM ALL_PUBLISHED_COLUMNS   
  364. WHERE SOURCE_SCHEMA_NAME ='SCOTT' AND SOURCE_TABLE_NAME = 'DEPT';  
  365.   2    3    
  366. CHANGE_SET_NAME        COLUMN_NAME  PUB_ID  
  367. ------------------------------ ------------------------------ ----------   
  368. CHICAGO_DAILY       DEPTNO   51401  
  369. CHICAGO_DAILY       DNAME   51401  
  370. CHICAGO_DAILY       LOC   51401  
  371.   
  372.   
  373. --3.创建订阅   
  374. SQL> BEGIN  
  375.        DBMS_CDC_SUBSCRIBE.CREATE_SUBSCRIPTION(  
  376.        change_set_name   => 'CHICAGO_DAILY',  
  377.        description       => 'Change data for DEPT',  
  378.        subscription_name => 'DEPT_SUB');  
  379. END;  
  380. /  
  381.   2    3    4    5    6    7    
  382. PL/SQL procedure successfully completed.  
  383.   
  384.   
  385. --4.订阅表   
  386. SQL> BEGIN  
  387.        DBMS_CDC_SUBSCRIBE.SUBSCRIBE(  
  388.        subscription_name => 'DEPT_SUB',  
  389.        source_schema     => 'SCOTT',  
  390.        source_table      => 'DEPT',  
  391.        column_list       => 'DEPTNO , DNAME, LOC',  
  392.        subscriber_view   => 'DEPT_VIEW');  
  393. END;  
  394. /  2    3    4    5    6    7    8    9    
  395.   
  396. PL/SQL procedure successfully completed.  
  397.   
  398.   
  399. --5.激活订阅   
  400. SQL> BEGIN  
  401.    DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION(  
  402.        subscription_name => 'DEPT_SUB');  
  403. END;  
  404. /  2    3    4    5    
  405.   
  406. PL/SQL procedure successfully completed.  
  407.   
  408.   
  409. ------------------------------------------------------------------------------------------------------------------------   
  410. 验证  
  411. --source端   
  412. SQL> insert into scott.dept values(51,'hello',wo  'world');  
  413.   
  414. 1 row created.  
  415.   
  416. SQL> commit;  
  417.   
  418. Commit complete.  
  419.   
  420. SQL> alter system switch logfile;  
  421.   
  422. System altered.  
  423.   
  424.   
  425. --target端,获取改变数据   
  426. SQL> BEGIN  
  427.    DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW(  
  428.        subscription_name => 'DEPT_SUB');  
  429. END;  
  430. /  2    3    4    5    
  431.   
  432. PL/SQL procedure successfully completed.  
  433.   
  434. SQL>  SELECT DEPTNO,DNAME,LOC FROM DEPT_VIEW;  
  435.   
  436.     DEPTNO DNAME  LOC  
  437. ---------- -------------- -------------   
  438. 51 hello  world  

此外,订阅者可以使用DBMS_CDC_SUBSCRIBE.PURGE_WINDOW过程purge不需要的数据,订阅者可以使用DBMS_CDC_SUBSCRIBE.DROP_SUBSCRIPTION procedure停止订阅。

source端与target端的初始化参数的具体配置可以参考oracle官方文档,target端要注意配置java_pool_size与streams_pool_size。

更多Oracle相关信息见Oracle 专题页面 http://www.bkjia.com/topicnews.aspx?tid=12

相关内容