一. 概述
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.*”