Oracle

使用帶有 flashback_time=systimestamp 的 expdp 時出錯

  • September 12, 2019

Windows 2012 標準版上的 Oracle 11.2.0.1.0:

expdp '/ as sysdba' full=y directory=exp dumpfile=... logfile=... flashback_time=systimestamp

失敗:

ORA-39001: invalid argument value
ORA-39150: bad flashback time
ORA-01841: (full) year must be between -4713 and +9999, and not be 0 
ORA-01877: string is too long for internal buffer

替換AFAIK 是一種向後兼容的方式來表示相同的確切內容也會失敗並出現相同的錯誤flashback_time=systimestampconsistent=y完全刪除這些選項,無需其他更改,使其工作。

不過,除了 RMAN 之外,我還想進行一致的備份,是的,我確實已經配置並工作了*。*網上有各種建議的解決方法。例如使用to_timestamp但它們似乎都沒有工作。

我的問題是:

  1. 這是一個已知的錯誤?
  2. 是否有任何設置可能導致這種行為,如係統語言環境?
  3. 我正在使用這個腳本的一個稍微修改過的版本,我發誓就在昨天它工作得很好。我不記得改變任何東西,今天它不起作用。有任何想法嗎?
  4. 有可靠的解決方法嗎?我正在考慮使用flashback_scn,但這需要事先單獨查詢。

編輯:

加倍強調這裡的怪異之處。每天:

  • 00:00-11:59 - 錯誤如上
  • 12:00-23:59 - 一切正常

我昨天晚上反復執行腳本flashback_time=systimestamp- 沒有錯誤。今天早上 7:45 再次從同一個腳本中得到錯誤,沒有修改。

謎團已揭開。我有機會詢問了一位為我們做一些諮詢工作的 Oracle DBA。事實證明,這很可能是 Oracle 如何處理本地化時間戳中的空格的錯誤。一個簡單的解決方法是set NLS_LANG=american_america.ee8iso8859p2在執行expdp.

剛剛看了一下文件

它說:

您可以指定 DBMS_FLASHBACK.ENABLE_AT_TIME 過程接受的任何格式的時間

所以 SYSTIMESTAMP 應該實際工作……雖然文件建議您需要將參數括在引號中。嘗試:

FLASHBACK_TIME="SYSTIMESTAMP"

引用自:https://dba.stackexchange.com/questions/247029