ORACLE expdp備份與ORA-31693、ORA-02354、ORA-02149

清風艾艾發表於2015-11-02
    平臺環境是:solaris作業系統
    資料庫是:oracle 10.2.0.4
    故障現象:2015年10月份以來,一綜合網管資料庫頻頻報出ORA-31693、ORA-02354、ORA-02149錯誤,具體報錯資訊如下所示:
. . 匯出了 "SSMS"."CHECKWHITELIST"                     5.882 KB       1 行
ORA-31693: 表資料物件 "SSMS"."RES_SSMSKEYWCONF":"P_20121207000000" 無法載入/解除安裝並且被跳過, 錯誤如下:
ORA-02354: 匯出/匯入資料時出錯
ORA-02149: 指定的分割槽不存在
. . 匯出了 "SSMS"."RES_SSMSKEYWCONF":"P_20121208000000"  1.481 MB   17506 行
    起初處理,用如下sql語句從資料庫查詢 "SSMS"."RES_SSMSKEYWCONF":"P_20121207000000"分割槽,沒有查詢到,可能相關的分割槽表的分割槽已經不存在了。於是,建議業務方手工執行分割槽表分割槽清理命令,更新資料庫字典資訊。
select table_owner,table_name,partition_name from DBA_TAB_PARTITIONS where table_name='RES_SSMSHOLDCONF' and partition_name='P_20121207000000';
處理完後,第二天相關這個分割槽表的expdp備份的報錯果然沒有了,但是又出現新的分割槽表分割槽備份報錯,報錯資訊跟上述症狀一致:
. . 匯出了 "SSMS"."BLACK_WHITE_LOG":"P_20151014000000"  3.270 MB   36055 行
ORA-31693: 表資料物件 "SSMS"."RES_SSMSHOLDCONF":"P_20121207000000" 無法載入/解除安裝並且被跳過, 錯誤如下:
ORA-02354: 匯出/匯入資料時出錯
ORA-02149: 指定的分割槽不存在
. . 匯出了 "SSMS"."RES_SSMSHOLDCONF":"P_20121208000000"  3.178 MB   29845 行
. . 匯出了 "SSMS"."RES_DIM_PROVINCE_DBLINK"            5.835 KB      16 行
ORA-31693: 表資料物件 "SSMS"."RES_SSMSWHITELIST":"P_20121207000000" 無法載入/解除安裝並且被跳過, 錯誤如下:
ORA-02354: 匯出/匯入資料時出錯
ORA-02149: 指定的分割槽不存在
. . 匯出了 "SSMS"."RES_SSMSWHITELIST":"P_20121208000000"  129.2 KB    1380 行
    看來,這種expdp報錯不是簡單的資料庫字典問題。我懷疑是資料庫的expdp備份開始後到結束前,有人或者自動作業清理分割槽表分割槽,這樣才能每天都報備份分割槽不存在,而且每天報的分割槽表分割槽不同;透過與業務、開發方溝通得知,他們確實有分割槽表分割槽清理job且開始時間是每天零點,另經檢視資料庫expdp備份計劃也是每天零點開始,這符合自己的猜測。於是我按照自己的猜測思路進行了模擬實驗,具體的步奏如下:
    1、將上述報錯涉及的一張分割槽表匯出,觀察備份過程,備份成功沒有報錯或異常,然後匯入到實驗環境
    2、在實驗環境進行備份
[oracle@orcl11204 ~]$ date
Fri Oct 30 17:46:52 CST 2015
[oracle@orcl11204 ~]$ expdp system/redhat5 tables=RES_SSMSWHITELIST SCHEMAS=ssms directory=TEXPDP dumpfile=exp_20`date +%y
y%m%d`1.dmp filesize=3000000000 logfile=exp_20`date +%y%m%d`.logdirectory=TEXPDP dumpfile=exp_20`date +%y%m%d`full=y directory=TEXPDP dumpfile=exp_20`date +%y%m%d`1.dmp filesize=cd
expdp system/redhat5 tables=ssms.RES_SSMSWHITELIST directory=TEXPDP dumpfile=exp_20`date +%y%m%d`1. 
dmp filesize=3000000000 logfile=exp_20`date +%y%m%d`.log
Export: Release 11.2.0.4.0 - Production on Fri Oct 30 17:46:30 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYSTEM"."SYS_EXPORT_TABLE_01":  system/******** tables=ssms.RES_SSMSWHITELIST directory=TEXPDP dumpfile=exp_201510301.dmp filesize=3000000000 logfile=exp_20151030.log 
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 2.021 GB
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
. . exported "SSMS"."RES_SSMSWHITELIST":"P_20131001000000"  37.50 MB  357138 rows
. . exported "SSMS"."RES_SSMSWHITELIST":"P_20130901000000"  36.52 MB  347839 rows
. . exported "SSMS"."RES_SSMSWHITELIST":"P_20150401000000"  33.56 MB  297716 rows
. . exported "SSMS"."RES_SSMSWHITELIST":"P_20150801000000"  33.30 MB  295103 rows
. . exported "SSMS"."RES_SSMSWHITELIST":"P_20150901000000"  33.48 MB  296620 rows
.
.
.
    3、另開視窗,進行分割槽表刪除操作
[oracle@orcl11204 ~]$ date
Fri Oct 30 17:49:47 CST 2015
.
.
.
SQL> show user
USER is "SSMS"
SQL> alter table RES_SSMSWHITELIST drop partition P_20130826000000;
Table altered.
SQL> alter table RES_SSMSWHITELIST drop partition P_20150425000000;
Table altered.
SQL> alter table RES_SSMSWHITELIST drop partition P_20150116000000;
Table altered.
    4、觀察備份過程,果然出現了生產環境中的報錯
. . exported "SSMS"."RES_SSMSWHITELIST":"P_20130824000000"  14.24 KB      60 rows
ORA-31693: Table data object "SSMS"."RES_SSMSWHITELIST":"P_20130826000000" failed to load/unload and is being skipped due to error:
ORA-02354: error in exporting/importing data
ORA-02149: Specified partition does not exist
. . exported "SSMS"."RES_SSMSWHITELIST":"P_20130827000000"  8.835 KB       9 rows

. . exported "SSMS"."RES_SSMSWHITELIST":"P_20150115000000"  21.14 KB     120 rows
ORA-31693: Table data object "SSMS"."RES_SSMSWHITELIST":"P_20150116000000" failed to load/unload and is being skipped due to error:
ORA-02354: error in exporting/importing data
ORA-02149: Specified partition does not exist
. . exported "SSMS"."RES_SSMSWHITELIST":"P_20150117000000"  11.27 KB      30 rows

. . exported "SSMS"."RES_SSMSWHITELIST":"P_20150423000000"  9.281 KB      12 rows
ORA-31693: Table data object "SSMS"."RES_SSMSWHITELIST":"P_20150425000000" failed to load/unload and is being skipped due to error:
ORA-02354: error in exporting/importing data
ORA-02149: Specified partition does not exist
. . exported "SSMS"."RES_SSMSWHITELIST":"P_20150426000000"  9.765 KB      17 rows
    總結以上實驗:oracle資料庫expdp備份開始到結束期間,人為的或自動作業刪除分割槽表分割槽,會導致分割槽表分割槽備份不到而報錯,這不是資料庫字典問題,也不是oracle自身的bug,是業務的分割槽表分割槽清理Job任務與資料庫expdp備份作業之間的邏輯問題。
    需要作出的調整是(二者選一)
    1、在備份開始前進行分割槽表清理並清理結束
    2、在備份結束後進行分割槽表清理

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

相關文章