表的重新再同步(無需生産端時間視窗)
如果是某些表由于各種原因造成兩邊資料不一緻,需要重新進行同步,但實際業務始終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
------------------------
10144674732950
以下以獲得的scn号為10144674732950為例
4) 在源端使用exp導出所需重新初始化的表或者幾張表資料,并且指定到剛才記下的scn号。
exp導出
确認在源端
确認ORACLE_SID正确
需要sysem使用者,可以不用grant execute flashback to user,system密碼******
exp system/****** tables=SCOTT.T9 file=/home/oracle/scott_t9_1.dmp grants=n statistics=none triggers=n compress=n FLASHBACK_SCN=10144674732950 log=/home/oracle/scott_t9_1.log;
5) 通過sftp傳輸到目标端;
6) 在目标端,使用imp導入資料;
确認在目标端
用system使用者,
truncate table scott.t9 删除記錄
[oracle@localhost ~]$ imp system/oracle file=/home/oracle/scott_t9_1.dmp fromuser=scott touser=scott ignore=y log=/home/oracle/scott_t9_imp_1.log ;
特别注意:上面imp語句中沒有使用commit=y的參數,如果對大表進行imp操作應該使用commit=y參數(資料分批量送出),原因:如果導入執行很長時間,imp操作被中斷(好在是容災端導入,不會有對業務系統産生很大壓力),這個中斷将導緻這個大事物的復原;復原會占用更多時間(影響啟動複制程序的時間);或者直接采用資料泵的方式導出導入(資料泵預設不需要commit參數);
7) 如果這些表有外鍵,在目标端檢查這些外鍵并禁止它們(記得維護dirsql下的禁止和啟用外鍵的腳本SQL);
确認有無外鍵,執行腳本禁用外鍵
8) 編輯目标端對應的rep參數檔案,在其map裡面加入一個過濾條件,隻對這些重新初始化的表應用指定scn号之後的記錄(一定要注意不要修改本次初始化之外的其它表,會造成資料丢失!):
map source.mytab, target target.mytab, filter ( @GETENV ("TRANSACTION", "CSN") > 10144674732950 ) ;
9) 确認參數無誤後,啟動目标端的rep程序;
10) 使用info repxx或者lag repxx直到該程序追上,停止該程序去掉filter即可進入正常複制。(去掉filter時間待定,因SCN一直增大,不受影響)
本文轉自 liu99fifa 51CTO部落格,原文連結:http://blog.51cto.com/andrewliu/668289,如需轉載請自行聯系原作者