1. 程式人生 > >Oracle GoldenGate DDL 詳細說明 使用手冊(較早資料)

Oracle GoldenGate DDL 詳細說明 使用手冊(較早資料)

 

一. 概述
DDL 相關的引數包括:DDL、DDLERROR、DDLOPTIONS、DDLSUBST、DDLTABLE、GGSCHEMA、
PURGEDDLHISTORY、PURGEMARKERHISTORY。
在 extract 裡,預設是不支援 DDL 的抽取的,需要通過配置 DDL 引數來開啟;
在 replicat 裡,預設是支援 DDL 的抽取,並且會處理 trail 裡存在的全部 DDL 操作,需要
使用 DDL 引數來忽略或者過濾掉某些 DDL 操作
二. 基本概念
先介紹幾個非常重要的概念,然後針對每一個 DDL 引數作詳細說明
1. DDL scopes
DDL 操作的資料庫物件被分成類別,叫做 scopes,一共三類 MAPPED 、UNMAPPED、
OTHER.
MAPPED scope:
在 TABLE 和 MAP 語句中明確宣告的物件,屬於 MAPPED scope.
比如:
    Extract (source) Replicat (target)
TABLE fin.expen; MAP fin.expen, TARGET fin2.expen2;
TABLE hr.tab*; MAP hr.tab*, TARGET hrBackup.bak_*;
源端發出一個ddl語句如下
ALTER TABLE fin.expen ADD notes varchar2(100);
那麼,由於此類物件屬於MAPPED scope,所以按照map的規則,在目標端將轉化為
如下語句:
ALTER TABLE fin2.expen2 ADD notes varchar2(100);
源端如下語句     CREATE TABLE hr.tabPayables;
按照上面的map規則,目標端將轉化為    CREATE TABLE hrBackup.bak_tabPayables;
如果某一個物件 在TABLE語句裡,但是不在MAP語句裡,那麼這個物件的DDL語句
在源端屬於MAPPED scope,在目標端屬於UNMAPPED scope,分開按照各自的規則
處理
UNMAPPED scope:
DDL 是 OGG 支援的,但是 DDL 所操作的基礎表沒有在 TABLE 和 MAP 語句中明確聲
明的物件,屬於 UNMAPPED scope
屬於 UNMAPPED scope 的 DDL 語句,在 Replicat 程序中,按照如下規則處理:
1. alter session set current_schema=源DDL物件的schema
2. 使用那個使用者執行 DDL.
3. 重新返回複製使用者
   
OTHER scope:
沒有辦法 map 的 DDL 操作,屬於 OTHER scope。
典型的幾類:
CREATE USER joe IDENTIFIED by joe;
CREATE ROLE ggs_gguser_role IDENTIFIED GLOBALLY;
ALTER TABLESPACE gg_user TABLESPACE GROUP gg_grp_user;
2. 過濾DDL複製(filter)
我們不想複製全部 ddl 語句,我們想選擇其中某些種類的 DDL 進行復制,這個時候
我們就要過濾 DDL 操作,使得只有部分我們需要的 DDL 語句複製到目標端。
注意:DDL filter 不適用於 data‐pump extract
有兩種方法,
1. 使用源端資料庫的 DDL 觸發器來過濾 DDL
實現方法:
在 OGG 安裝目錄裡有一個檔案 ddl_filter.sql,開啟編輯這個檔案,找到一個函
數叫做 filterDDL,按照自己的需求修改,然後在 sqlplus 裡執行 @ddl_filter
2. 在 extract 和 replicat 引數檔案裡使用 DDL 引數(大多數環境足夠用了)
通過 DDL 引數實現 DDL filter,主要基於以下幾方面:
● scope
● operation type
● object name
● strings in the DDL command syntax or comments, or both
    DDL引數詳細說明請參考下一章節<DDL引數說明>
3. derived object
以下面的建立 index 為例
CREATE INDEX hr.indexPayrollDate ON TABLE hr.tabPayroll (payDate);
其中 tabPayroll 是基礎 object,而 indexPayrollDate 就是 derived object。
在進行 DDL 複製的時候,我們需要在 replicat 端配置 MAP 對映:
有幾種情況:
第一:為基礎物件指定 MAPPING 規則,derived 物件不指定 MAPPING
OGG 預設將 derived 的屬主設定為與基礎表一致,以上面的為例,如果我們指
定 MAP hr.tab*, TARGET hrBackup.*;
那麼上述語句在目標端轉為為
CREATE INDEX hrBackup.indexPayrollDate ON TABLE hrBackup.tabPayroll
(payDate);
第二:為基礎表和 derived 物件同時指定 MAPPING
按照各自的 MAP 規則進行對映
    第三:為 derived 物件指定了 MAP,對基礎物件沒有指定 MAP
    OGG 不作任何轉換,直接將源端的語句在目標端執行。
    RENAME 和 ALTER RENAME 語句涉及到的 derived 物件,MAP 中一律指定新表名
   
三. DDL處理流程
1. Extract 對DDL語句的處理流程:
1. Extract 抓取一個 DDL 操作
2. Extract 將 DDL 語句中的 comments 進行分離
3. Extract 查詢 prm 引數檔案中的 DDL 引數配置
4. Extract 查詢 IGNOREREPLICATES 引數.如果引數存在,而且這個 DDL 是由 Replicat 程序產生
的,那麼就忽略掉這個 DDL,繼續查詢新的 DDL
5. Extract 判斷是否是一個 renmae 操作,如果是做標記,將語句轉化為 ALTER TABLE RENAME
6. Extract 獲取基礎物件和 derived 物件資訊
8. Extract 查詢 DDLOPTIONS REMOVECOMMENTS BEFORE 引數設定了這個引數,那麼 extract
將刪除 comments,但是還是要首先判斷 DDL INCLUDE 中的選項 INSTR,如果符合 INSTR 選
項,那麼將保留 comments
9. Extract 判斷 DDL 屬於哪種型別的 scope: MAPPED, UNMAPPED or OTHER.   
10. Extract 根據詳細的 DDL INCLUDE 和 DDL EXCLUDE 來決定 DDL 的去留
11. Extract 根據引數 DDLSUBST 引數對 DDL 語句進行處理,DDLSUBST 可以有多個,按照 prm
檔案中的順序,挨個處理
12. DDLSUBT處理後,extrac查詢REMOVECOMMENTS AFTER引數,如果存在,將刪除comments
13. Extract 查詢 DDLOPTIONS ADDTRANDATA ,如果操作是一個 CREATE TABLE, 那麼 Extract
會執行 ALTER TABLE <name> ADD SUPPLEMENTAL LOG GROUP 命令.
14. 最後一步,Extract 將 DDL 語句寫入 trail 檔案
2. Replicat對DDL語句的處理流程
1. Replicat 從 trail 檔案裡讀取到 DDL 語句
2. Replicat 分離 comments
3. Replicat 查詢 DDLOPTIONS REMOVECOMMENTS BEFORE 如果存在,先刪除 comments
4. Replicat 判斷 DDL 屬於哪種型別的 scope: MAPPED, UNMAPPED or OTHER
6. Replicat 根據 MAP 對映,替換表名等等.
7. 如果發現存在 derived 物件, Replicat 查詢 DDLOPTIONS MAPDERIVED.如果存在,按照規則
替換
8. Replicat 根據詳細的 DDL INCLUDE 和 DDL EXCLUDE 來決定 DDL 的去留.
9. Replicat 根據引數 DDLSUBST 引數對 DDL 語句進行處理,DDLSUBST 可以有多個,按照 prm
檔案中的順序,挨個處理.
10. DDLSUBT處理後,extrac查詢REMOVECOMMENTS AFTER引數,如果存在,將刪除comments
11. Replicat 在目標資料庫上執行 DDL.
12. 沒有錯誤,就繼續下一個 DDL 的執行,如果有錯誤,要判斷 DDLERROR 引數的設定
   
四. 支援DDL配置
配置 DDL 環境,需要在資料庫裡建立如下一系列的表:
GRANT EXECUTE ON utl_file TO oggadm;
ggsci
EDIT PARAMS ./GLOBALS
GGSCHEMA oggadm
Sqlplus “/as sysdba”
@marker_setup.sql 必須到這個指令碼所在目錄進入 sqlplus
@ddl_setup.sql
@role_setup.sql
Grant GGS_GGSUSER_ROLE to oggadm;
@ddl_enable.sql
@?\rdbms\admin\dbmspool.sql
@ddl_pin oggadm;
   
五. DDL引數說明
1. DDL
語法結構:
DDL [
{INCLUDE | EXCLUDE}
[, MAPPED | UNMAPPED | OTHER | ALL]
[, OPTYPE <type>]
[, OBJTYPE ‘<type>’]
[, OBJNAME “<name>“]
[, INSTR ‘<string>’]
[, INSTRCOMMENTS ‘<comment_string>’
]
不使用任何選項,在引數檔案裡只宣告 DDL,那麼 extract 將抽取全部 DDL 寫入 trail,replicat
將讀取全部 DDL 並應用複製(在 replicat 裡,這個動作和預設不寫 DDL 語句一樣)
引數說明:
INCLUDE | EXCLUDE
Include 包含準備實施 DDL 操作的資料庫物件的過濾規則;
Exclude 排除針對某些物件的 DDL 操作。
使用 exclude 子句,必須使用一個相應的 include 子句,比如單獨指定下面的語句
DDL EXCLUDE OBJNAME “hr.*”
是不合法的,我們必須配合如下方法使用 include;
DDL INCLUDE ALL, EXCLUDE OBJNAME “hr.*”
DDL INCLUDE OBJNAME “fin.*” EXCLUDE “fin.ss”
Exclude優先權高於include,
但是有一個方式可以不必指定include來配合,那就是DDL EXCLUDE ALL
MAPPED | UNMAPPED | OTHER | ALL
指定MAPPED ,表示只處理屬於MAPPED scope型別的物件對應的DDL語句,MAPPED
型別的優先順序高於其他級別;
指定 UNMAPPED ,表示只處理屬於 UNMAPPED scope 型別的物件對應的 DDL 語句
指定 OTHER,表示只處理屬於 OTHER scope 型別的物件對應的 DDL 語句
指定 ALL ,表示處理所有的 DDL 語句
OPTYPE <type>
指定執行某些型別的 DDL 語句,比如
DDL INCLUDE OPTYPE ALTER 
將處理那些 alter 語句
OBJTYPE ‘<type>’
指定執行某些物件的 DDL 語句,比如
DDL INCLUDE OBJTYPE ‘INDEX’
DDL INCLUDE OBJTYPE ‘SNAPSHOT’
DDL INCLUDE OBJTYPE ‘SNAPSHOT LOG’
將處理與index ,snapshot 和snapshot log有關的DDL語句
OBJNAME “<name>“
    根據物件名進行處理,比如
DDL INCLUDE OBJNAME “accounts.*”
注意 1 : OBJNAME 後面的值,對應的應該是 replicat 程序引數檔案中的 MAP 語
句中的 target 子句的值,而不是源端的值。
比如:MAP fin.exp_*, TARGET fin2.*;
那麼我們要宣告 DDL INCLUDE OBJNAME “fin2.*”,這樣的話,就可以處理下面的語句了
CREATE TABLE fin.exp_phone;(源端的語句)
CREATE TABLE fin2.exp_phone;(轉化到目標端的語句)
注意 2: 建立觸發器,索引,同義詞等等語句,我們要指定的 OBJNAME 是基表
的名字,而不是觸發器或者索引的名字,比如要想處理源端的語句 CREATE TRIGGER
hr.insert_trig ON hr.accounts;
我們需要如下指定:DDL INCLUDE OBJNAME “hr.accounts” , 而不應該指定為
hr.insert_trig
INSTR ‘<string>’
    指定如何處理 DDL 語句中包含特定字元的 DDL 語句,與下面的選項
INSTRCOMMENTS 對應,也即是說,instr 選擇的是 DDL 語句本身包含指定的字元,而
INSTRCOMMENTS 指定是 DDL 語句中的註釋中包含的字元
 DDL INCLUDE ALL EXCLUDE INSTR ‘CREATE INDEX’
INSTRCOMMENTS ‘<comment_string>’
    解釋請參考 INSTR 選項
DDL INCLUDE ALL EXCLUDE INSTRCOMMENTS ‘SOURCE ONLY’
它複製的是如下源端語句
CREATE USER john IDENTIFIED BY john /*source only*/;

INSTRWORDS ‘<word list>’
 ALTER TABLE INCLUDE INSTRWORDS ‘ALTER CONSTRAINT “ xyz” ’
 處理語句中包含 alter 或者 constraint 或者 _xyz 的 DDL 語句
INSTRCOMMENTSWORDS ‘<word list>’
 處理語句註釋中包含 alter 或者 constraint 或者 _xyz 的 DDL 語句
多個選項混合配製,可以配置非常複雜的規則,比如:
DDL &
INCLUDE UNMAPPED &
OPTYPE alter &
OBJTYPE ‘table’ &
OBJNAME “users.tab*” &
INCLUDE MAPPED OBJNAME “*” &
EXCLUDE MAPPED OBJNAME "temporary.tab*"
2. DDLERROR
適用於 Extract and Replicat,用來捕獲複製過程中遇到 DDL 錯誤時進行的處理
Extract 程序中 DDLERROR 的選項
預設值: Abend
語法結構: DDLERROR [RESTARTSKIP <num skips>] [SKIPTRIGGERERROR <num errors>]
引數說明:
RESTARTSKIP    在 EXTRACT 啟動時,允許出現 n 次的錯誤,n 的取值範圍:1—100000,
超過 n 次錯誤,程序 abend,錯誤資訊輸入到 report file 中。
SKIPTRIGGERERROR    在 EXTRACT 啟動時,允許出現 n 次的 DDL trigger 的錯誤,n 的取值
範圍:1—100000,這個值不計算在 RESTARTSKIP 內,互相獨立。
Replicat 程序中 DDLERROR 的選項
預設值: Abend
語法結構: DDLERROR
{<error> | DEFAULT} {<response>}
{INCLUDE <inclusion clause> | EXCLUDE <exclusion clause>}
[IGNOREMISSINGOBJECTS | ABENDONMISSINGOBJECTS]
引數說明:
IGNOREMISSINGOBJECTS/ ABENDONMISSINGOBJECTS ,控制當DML的物件在目標端不存在時進
程是否abend,IGNOREMISSINGOBJECTS可以跳過在missing table上的DML操作。
 
3. DDLOPTIONS
適用於 Extract and Replicat,用來捕獲複製過程中遇到 DDL 錯誤時進行的處理
語法結構:
DDLOPTIONS
[, ADDTRANDATA [ABEND | RETRYOP <RETRYDELAY <seconds> MAXRETRIES <retries>]
[, DEFAULTUSERPASSWORD <password>
[ENCRYPTKEY DEFAULT | ENCRYPTKEY <keyname>]]
[, GETAPPLOPS | IGNOREAPPLOPS]
[, GETREPLICATES | IGNOREREPLICATES]
[, IGNOREMAPPING]
[, MAPDERIVED | NOMAPDERIVED]
[, MAPSCHEMAS]
[, MAPSESSIONSCHEMA] <source_schema> TARGET <target_schema>
[, NOCROSSRENAME]
[, PASSWORD ENCRYPTKEY [DEFAULT | ENCRYPTKEY <keyname>]
[, REMOVECOMMENTS {BEFORE | AFTER}]
[, REPLICATEPASSWORD | NOREPLICATEPASSWORD]
[, REPORT | NOREPORT]
[, UPDATEMETADATA]
[, USEOWNERFORSESSION]
引數說明:
ADDTRANDATA
對新建的表自動新增 supplemental logging,而不需要在建立表之後,手工執行 ADD
TRANDATA 命令,如果表有鎖,可能導致自動新增 supplemental logging 失敗,這個
引數有幾個值,對失敗後進行處理。
ABEND 失敗後使得extract程序abend
RETRYOP <RETRYDELAY <seconds> MAXRETRIES <retries>] 失敗後根據重試時間
和重試次數兩個選項的值,進行重新執行add trandata動作
IGNOREMAPPING
如果我們可以保證源端和目標端完全一致,不需要進行 DDL 表名或者使用者名稱進行
轉換的話,可以設定這個引數,可以加快 replicat 程序的速度,也就是說 replicat 不需
要去解析任何 MAPPING 引數,直接進行 DDL 的執行,所以速度會很快
4. DDLSUBST
可以處理一些與資料結構無關的字元轉換,比如轉換一個表空間的名字,轉換一些
comment 中的文字等等。
注意:
1. 不要使用 ddlsubst 來修改列名或者列的資料型別,也不要修改表名和表的屬主,這
些操作一定要使用 MAP 語句來實現
2. ddlsubst 總是在 ddl 語句之後執行,也就是說,先要 ddl include 的物件才可以進行
處理
3. 可以使用多個 ddlsubst 引數,按照順序執行
4. ddloptions 引數裡有一個選項叫做,REMOVECOMMENTS ,有兩個值,一個 before,一
個是 after,具體參考 ddloptions 小節,如果我們想使用 ddlsubst 處理 comment,必須使用
REMOVECOMMENTS AFTER,表示當被 ddlsubst 處理過之後的 DDL 語句再刪除 comments
語法結構:
DDLSUBST ‘<search_string>’ WITH ‘<replace_string>’
[INCLUDE <inclusion clause> | EXCLUDE <exclusion clause>]
引數說明:望文生義,不多解釋
示例:
DDLSUBST ‘cust’ WITH ‘customers’ INCLUDE OBJNAME “sales.*”