OGG Extract 可分為兩種功能,一種為 Capture ,負責抽取 Source 端的交易數據並產生出 Trail File 來存放這些交易數據;另一種為 Pump ,負責將 Trail File 傳送到 Target 端,所以我們在 Source 設定 OGG 時,一般都會設定兩個 Extract 為一組,一個做為 Capture 另一個作為 Pump 。
在 Source 設定 Extract 之前,資料庫必須先啟用 Supplemental Log 與 Force Logging :
在資料庫層級啟用 Supplemental Log 之後,接下來要為所要同步的 Table 添加 Supplemental Log ,例如我們要同步 HR 這個使用者底下所有的 Table ,那麼就需要將 HR 底下所有的 Table 都添加 Supplemental Log ,透過 GGSCI 執行 add trandata 來添加 :
add trandata 會於資料庫幫每個 Table 建立 Supplemental Log Group ,由 dba_log_groups 可以查詢,其中 log_group_name 為 GGS 開頭的就是 add trandata 所建立的 :
add trandata 是為 Table 添加 Supplemental Log ,為 Table Level ,另一種方式是使用 add schematrandata ,從 Schema Level 直接為整個 Schema 添加 Supplemental Log :
add schematrandata 為 Schema Level ,此時並不會於 dba_log_groups 建立 log group ,必須透過下列指令查詢某個 Table 是否有 Supplemental Log ,例如查詢 REGIONS 這個 Table 是否有 Supplemental Log :
透過 GGSCI 也可以使用 info 指令來確認是否有 Supplemental Log :
add trandata 主要的目的在於能夠讓交易日誌 (Redo / Archive Log) 紀錄 Table 異動前後的數值,如果缺乏這項數據,那麼在將來開啟同步之後就很有可能會遇到 ORA-04031 no data found 的錯誤導致 Table 無法同步。
在做好前置準備作業之後,接下來就可以幫 Source 資料庫設定 Capture 。作為 Capture 的 Extract 有兩種模式可以使用,一種為 Classic Extract ,另一種則為 Integrated Extract 。
Classic Extract 是 OGG 這項產品原生的模式, Extract 為一個外掛的 Process ,由 OGG 軟體本身使用 API 去解析 Redo / Archive Log 來抽取交易資料,建立 Extract 前首先需要編輯參數如下,例如建立名稱為 EXT1 的 Extract :
參數說明如下:
TRANLOGOPTIONS DBLOGREADER : 如果資料庫使用的是 ASM ,那麼就需要透過 OGG 所提供的 DBLOGREADER 這個 API 去讀取 ASM 的資料,如果不是使用 ASM ,那麼這個參數可以不用設定。 DBLOGREADER 為 OGG 11g 之後所提供的 API ,早期要抓取放置在 ASM 的 Archive Log 必須使用 Tnsnames (sys@ASM) ,有了這個 API 之後就方便多了。
GETUPDATEBEFORES : Extract 抓取 update 語法的 Before Image。
NOCOMPRESSDELETES / NOCOMPRESSUPDATES : 設定 Extract 抓取 delete 與 update 語法時要寫入多少資訊進入 Trail , COMPRESSDELETES / COMPRESSUPDATES 表示只寫入 PK 與異動欄位的資訊進入 Trail ,而 NOCOMPRESSDELETES / NOCOMPRESSUPDATES 表示將所有欄位的資訊都寫入 Trail 。
CACHEMGR : 設定這個 Extract Process 會用到作業系統多少記憶體,如果不設定的話,那麼 Extract 會盡可能地使用可用的記憶體,這樣會有將系統記憶體吃光的風險,建議 Extract 都必須限制這個數值。
DYNAMICRESOLUTION : 解析 schema.* 的物件時,只有在第一次啟動的時候去 Data Dictionary 解析 schema.* 底下有哪些 Table ,不用每次都去 Data Dictionary 解析。
DDL INCLUDE MAPPED : 同步 DDL , INCLUDE MAPPED 表示只有需要同步 Table 的 DDL 才需要抓取。
DDLOPTIONS ADDTRANDATA : 在有設定 DDL 的情況之下,如果有 Create 新的 Table 的時候,自動將這個 Table 執行 add trandata 的動作,避免新 Table 缺乏 Supplemental Log 。
TABLE : 設定要同步的 Table , HR.* 表示要抓取 HR 底下所有 Table 的交易資訊。
在編輯完參數之後,如果要同步 DDL , Classic Extract 必須再做額外的設定才能夠同步 DDL , DDL 的抓取是透過 Trigger 來達成,於 OGG Home 目錄底下執行下列腳本來建立 DDL 所用的 Trigger :
執行完畢後便會建立名為 GGS_DDL_TRIGGER_BEFORE 的 Trigger 。
參數編輯完成後,就可以添加 Extract Group :
Integrated Extract 為 Oracle 改進之後的 Extract 模式,不同於 Classic Extract 的外掛模式, Integrated 使用的是 Oracle 資料庫內部的機制,於 Oracle 資料庫中啟動一個 Process ,透過 Logminer 來解析 Redo / Archive Log 。 Integrated Extract 的參數與 Classic Extract 大同小異,差別在於多了 INTEGRATEDPARAMS 這個參數 :
INTEGRATEDPARAMS 所設定的 MAX_SGA_SIZE 對應到資料庫指的是 Stream Pool Size ,並非是 SGA Size ,單位為 MB。
LOGALLSUPCOLS : 紀錄 delete / update 異動的所有欄位的資訊以及 Before Image ,相當於 (GETUPDATEBEFORES + NOCOMPRESSDELETES + NOCOMPRESSUPDATES) 。
UPDATERECORDFORMAT FULL : 抓取 update 的異動時,同時記錄 Before 以及 After Image 。
編輯完參數之後,同樣的添加 Integrated Extract ,由於 Integrated Extract 使用的是 Oracle 資料庫的 Process ,因此必須先於資料庫中執行 Register 的動作,這個動作的目的是於資料庫添加此 Extract 的起始 SCN :
然後再使用 Integrated 選項來建立 Integrated Extract :
比起 Classic Extract , Integrated Extract 的優點在於,使用的是 Oracle 資料庫的 Process ,可以設定多個 Threads 來加快 Capture 的速度 (由 INTEGRATEDPARAMS 的 PARALLELISM 設定) ,而 Classic Extract 外掛只能是單線程抽取,除此之外, Integrated Extract 不需要做額外的設定便可以抽取存放在 ASM 的 Redo / Archive Log ,以及 DDL 的抓取也無須透過 Trigger 來達成。
設定完 Capture Extract 之後, Pump 就相對的單純, Pump 只是把 Trail File 送到 Target 端而已,所以在參數檔裡面需要設定 Target 端的 IP 、 Port 以及 Target 端的 Trail File 名稱 :
RMTHOST : 設定 Target 端的 IP 與 MGR PORT 。
RMTTRAIL : 設定 Target 端的 Trail 名稱,以 R1 開頭。
PASSTHRU : 功能與 DYNAMICRESOLUTION 相同, 不去 Data Dictionary 解析 HR.* 有哪些物件,直接使用 Trail File 中所記錄的物件名稱。
參數設定完之後,建立 Pump Group :
最後開啟 Extract 與 Pump ,便完成了 Source 端的 Extract 設定。
沒有留言:
張貼留言