GoldenGate表的重新再同步(無需生產端時間視窗)

OGG-01161發表於2013-05-15

表的重新再同步(無需生產端時間視窗)
如果是某些表由於各種原因造成兩邊資料不一致,需要重新進行同步,但實際業務始終24小時可用,不能提供時間視窗,則可以參照以下步驟。(因較為複雜,使用需謹慎!)
列出需要重新初始化的表和當時exclude的原因(檢查下面兩個地方):
生產端抽取程式exclude表                 
容災端複製程式中exclude表
1) 確認ext/dpe/rep程式均無較大延遲,否則等待追平再執行操作;
2) 停止目標端的rep程式;(如時間要求嚴格,可放到後面)
注意:步驟3-6為將源端資料透過exp/imp匯入到目標端,客戶也可以選擇其它初始化方式,比如expdp/impdp。
3) 在源端獲得當前的scn號。例如:
export ORACLE_SID=***(無單機多例項的無需做)
select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
         xxxxxxxxxx
以下以獲得的scn號為xxxxxxxxxx為例
4) 在源端使用exp匯出所需重新初始化的表或者幾張表資料,並且指定到剛才記下的scn號。        
exp匯出
確認在源端
確認ORACLE_SID正確
需要sysem使用者,可以不用grant execute flashback to user,system密碼******
export ORACLE_SID=***(無單機多例項的無需做)
exp system/****** tables=SCOTT.TEST file=/home/oracle/TEST.dmp grants=n statistics=none triggers=n compress=n FLASHBACK_SCN=xxxxxxxxxxxxxxxx log=/home/oracle/TEST.log;
5) 透過sftp傳輸到目標端;
6) 在目標端,使用imp匯入資料;
確認在目標端
確認ORACLE_SID正確
用system使用者,
export ORACLE_SID=***(無單機多例項的無需做)
truncate table scott.TEST    刪除記錄
[oracle@localhost ~]$ imp system/oracle file=/home/oracle/TEST.dmp fromuser=scott touser=scott ignore=y log=/home/oracle/test1.log ;
特別注意:上面imp語句中沒有使用commit=y的引數,如果對大表進行imp操作應該使用commit=y引數(資料分批次提交),原因:如果匯入執行很長時間,imp操作被中斷(好在是容災端匯入,不會有對業務系統產生很大壓力),這個中斷將導致這個大事物的回滾;回滾會佔用更多時間(影響啟動複製程式的時間);或者直接採用資料泵的方式匯出匯入(資料泵預設不需要commit引數);
7) 如果這些表有外來鍵,在目標端檢查這些外來鍵並禁止它們(記得維護dirsql下的禁止和啟用外來鍵的指令碼SQL);
確認有無外來鍵,執行指令碼禁用外來鍵
確認在目標端
確認ORACLE_SID正確

8) 編輯目標端對應的rep引數檔案,在其map裡面加入一個過濾條件,只對這些重新初始化的表應用指定scn號之後的記錄(一定要注意不要修改本次初始化之外的其它表,會造成資料丟失!):
map source.test, target target.test, filter ( @GETENV ("TRANSACTION", "CSN") >     xxxxxxxxxxxxx ) ;
9) 確認引數無誤後,啟動目標端的rep程式;
10) 使用info repxx或者lag repxx直到該程式追上,停止該程式去掉filter即可進入正常複製。(去掉filter時間待定,因SCN一直增大,不受影響)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27571661/viewspace-761128/,如需轉載,請註明出處,否則將追究法律責任。

相關文章