12c 資料泵一致性匯出

snowdba發表於2015-02-26
在OGG同步的專案中,總會遇到默寫表同步失敗需要重新表級初始化。這時候採用資料泵來匯入匯出就需要考慮資料一致性問題,確保我們匯出的資料是基於某個scn或者某個時間戳,這樣做才能讓已經停止的複製程式(replicat)知道從哪裡開始追加資料庫變化。

12c中資料泵為我們提供了兩種一致性匯出的引數,一個是基於scn的FLASHBACK_SCN,另一個是基於時間戳的FLASHBACK_TIME

1, 取得當前的scn
這裡可以採用兩種方法,一種是透過函式取得的,能精確到當前的scn。另一種是向前滾動加1的scn。通常生產環境的資料庫都在不停的產生資料變化,scn也隨之飛快的變化,選擇那種獲取scn的方式都可以,能想起哪個就用哪個吧。

方法一, 獲取當前的scn
SYS@ora12c >select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
2096931

方法二, 生成當前的scn,該生成動作會促使scn+1
SYS@ora12c >select current_scn from v$database;

CURRENT_SCN
-----------
2096937

2,使用FLASHBACK_SCN引數一致性匯出資料
由於語句比較長,在employees 後面採用了換行符號\,注意employee與\之間有空格。下一行的>是回車後自動生成的,表示後面的內容和前面的是一行的。
[oracle@snow ~]$ expdp dp/dp directory=dp_dir dumpfile=20150226.dmp tables=hr.employees \
> flashback_scn=2096937

3,使用FLASHBACK_TIME引數一致性匯出資料
在這裡建議使用引數檔案的方式,這樣會省去很多轉移符
[oracle@snow ~]$ date
Mon Feb 9 16:08:01 EST 2015
[oracle@snow ~]$ vi flashback.par
userid=dp/dp
directory=dp_dir
dumpfile=20150226_1.dmp
logfile=20150226_1.log
flashback_time="to_timestamp('2015-02-09 16:00:00','yyyy-mm-dd hh24:mi:ss')"

[oracle@snow ~]$ expdp parfile=flashback.par


這裡有個小插曲,如果是在虛擬機器上做這個實驗,並且經常掛起虛擬機器(暫停)導致時鐘和宿主機時鐘不一致,通常是比宿主機慢,會報錯。
簡單的說就是虛擬機器時間慢,為其設定了一個將來的時間匯出而報錯。使用date看看虛擬機器的時間,自然就明白了。
ORA-39001: invalid argument value
ORA-39150: bad flashback time
ORA-08186: invalid timestamp specified

全文完

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

相關文章