OGG巨集與C語言中的巨集一樣,提供了函式封裝的功能,即可以將一些配置引數整理為一個巨集,然後在多個引數檔案中共用,針對環境複雜或多個複製點的情況尤其有用。下面我們將介紹如何建立一個巨集的庫,以及在OGG引數檔案中如何使用建立的這個巨集 library.
一個巨集函式庫是巨集的集合,巨集可以是一個庫檔案中包含多個巨集的定義,或多個庫檔案,包括不同的巨集定義。建議將庫檔案存放在OGG的dirmac目錄下,同時,庫檔案使用.mac為字尾。這樣可以在引用時方便的識別。
下面是一個巨集的示例,所有內容存放在一個庫檔案中:“$OGG_BASE/dirmac/macrolib.mac”.
MACRO #dbconnect
BEGIN
userid gguser, password AACAAAAAAAAAAAHAAIFBOIYAMCGIMARE, encryptkey default
END;
MACRO #bpsettings
BEGIN
STATOPTIONS RESETREPORTSTATS
-- Generate a report every day at 1 minute after midnight.
-- This report will contain the number of operations, by operation
-- type, performed on each table.
REPORT AT 00:01
REPORTROLLOVER AT 00:01
REPORTCOUNT EVERY 60 SECONDS, RATE
-- End of "best practices" section
END;
MACRO #funcsmap
PARAMS (#src_table, #target_table)
BEGIN
MAP #src_table, TARGET #target_table,
colmap (usedefaults,
orders_trans_ts = @GETENV ("GGHEADER", "COMMITTIMESTAMP"),
trans_rec_loc8tr = @STRCAT (@GETENV ("RECORD", "FILESEQNO"),
@GETENV ("RECORD", "FILERBA")),
extract_lag_ms = @TOKEN ("TKN-EXTLAG-MSEC"),
replicat_lag_ms = @GETENV ("LAG", "MSEC"),
src_db_name = @TOKEN ("TKN-SRC-DBNAME"),
src_db_version = @TOKEN ("TKN-SRC-DBVERSION"),
src_txn_csn = @TOKEN ("TKN-TXN-CSN")
);
END;
所有的巨集使用關鍵“Macro”關鍵字開始定義,後面是巨集的名稱,以“#name”定義,巨集的內容由“begin...end;”關鍵字包含,上面的三個巨集定義分別是#dbconnect, #bpsettings, 和#funcsmap。其中
#dbconnect巨集定義了一個DB連線的語句,使用預設的key進行密碼加密;
#bpsettings巨集定義了OGG中配置時的一些最佳建議,比如按天或按小時報告複製情況;
#funcsmap巨集定義了一個map對映,要注意的是它要求帶兩個引數來使用;
下面是該巨集在一個replicat端的使用:
nolist
include ./dirmac/macrolib.mac
list
replicat rfuncb
#dbconnect ()
#bpsettings ()
sourcedefs ./dirdef/mydefs.defs
discardfile ./dirrpt/rfuncb.dsc, purge
#funcsmap (amer.orders, euro.funcs_test)
當rfuncb投遞程式啟動時,include語句將載入庫檔案:./dirmac/macrolib.mac。引數nolist的意思是告訴投遞程式不要把後面的執行情況寫入到日誌檔案中,而list引數則是要求後續的執行語句都要寫日誌。
如果本引數檔案中沒有list語句,則整個投遞程式將不會有任何日誌輸出到檔案中。
當投遞程式讀取這個replicat引數檔案時,它會將引用的巨集替換為庫檔案中的語句定義,因此“#dbconnect ()”,“#bpsettings ()” 和 “#funcsmap (amer.orders, euro.funcs_test)”都會被替換為相應的語句。
一個巨集函式庫是巨集的集合,巨集可以是一個庫檔案中包含多個巨集的定義,或多個庫檔案,包括不同的巨集定義。建議將庫檔案存放在OGG的dirmac目錄下,同時,庫檔案使用.mac為字尾。這樣可以在引用時方便的識別。
下面是一個巨集的示例,所有內容存放在一個庫檔案中:“$OGG_BASE/dirmac/macrolib.mac”.
MACRO #dbconnect
BEGIN
userid gguser, password AACAAAAAAAAAAAHAAIFBOIYAMCGIMARE, encryptkey default
END;
MACRO #bpsettings
BEGIN
STATOPTIONS RESETREPORTSTATS
-- Generate a report every day at 1 minute after midnight.
-- This report will contain the number of operations, by operation
-- type, performed on each table.
REPORT AT 00:01
REPORTROLLOVER AT 00:01
REPORTCOUNT EVERY 60 SECONDS, RATE
-- End of "best practices" section
END;
MACRO #funcsmap
PARAMS (#src_table, #target_table)
BEGIN
MAP #src_table, TARGET #target_table,
colmap (usedefaults,
orders_trans_ts = @GETENV ("GGHEADER", "COMMITTIMESTAMP"),
trans_rec_loc8tr = @STRCAT (@GETENV ("RECORD", "FILESEQNO"),
@GETENV ("RECORD", "FILERBA")),
extract_lag_ms = @TOKEN ("TKN-EXTLAG-MSEC"),
replicat_lag_ms = @GETENV ("LAG", "MSEC"),
src_db_name = @TOKEN ("TKN-SRC-DBNAME"),
src_db_version = @TOKEN ("TKN-SRC-DBVERSION"),
src_txn_csn = @TOKEN ("TKN-TXN-CSN")
);
END;
所有的巨集使用關鍵“Macro”關鍵字開始定義,後面是巨集的名稱,以“#name”定義,巨集的內容由“begin...end;”關鍵字包含,上面的三個巨集定義分別是#dbconnect, #bpsettings, 和#funcsmap。其中
#dbconnect巨集定義了一個DB連線的語句,使用預設的key進行密碼加密;
#bpsettings巨集定義了OGG中配置時的一些最佳建議,比如按天或按小時報告複製情況;
#funcsmap巨集定義了一個map對映,要注意的是它要求帶兩個引數來使用;
下面是該巨集在一個replicat端的使用:
nolist
include ./dirmac/macrolib.mac
list
replicat rfuncb
#dbconnect ()
#bpsettings ()
sourcedefs ./dirdef/mydefs.defs
discardfile ./dirrpt/rfuncb.dsc, purge
#funcsmap (amer.orders, euro.funcs_test)
當rfuncb投遞程式啟動時,include語句將載入庫檔案:./dirmac/macrolib.mac。引數nolist的意思是告訴投遞程式不要把後面的執行情況寫入到日誌檔案中,而list引數則是要求後續的執行語句都要寫日誌。
如果本引數檔案中沒有list語句,則整個投遞程式將不會有任何日誌輸出到檔案中。
當投遞程式讀取這個replicat引數檔案時,它會將引用的巨集替換為庫檔案中的語句定義,因此“#dbconnect ()”,“#bpsettings ()” 和 “#funcsmap (amer.orders, euro.funcs_test)”都會被替換為相應的語句。
“#funcsmap”巨集使用了兩個引數,分別代表源表和目標表。PARAMS關鍵字是告訴使用人員,這個巨集需要有引數才能執行。針對引數的使用,有以下幾點注意事項:
- 引數名不區分大小寫;
- 引數名中不能使用引號;
- 引數在巨集定義中不是必須的;
- 一個巨集最多可以有99個引數,所有引數的長度不能超過9999位元組;
- 所有引數都必須在PARAMS語句中定義,當呼叫巨集時,所有引數都必須賦值。
小結
OGG巨集在靈活運用和配置OGG引數時是個不錯的技巧,特別是針對多個配置檔案和複雜環境時,可以在一個檔案中定義常用的一組操作,然後在所有環境中使用,降低運維的複雜性。