Impdp ORA-39083、ORA-01403報錯問題分析解決

realkid4發表於2015-08-28

 

資料泵(Data Pump)是從10g開始推出的新一代資料邏輯備份還原工具。從產品線角度看,Data Pump是用於替換Exp/Imp傳統工具的。經過若干版本的演進,Data Pump的相容性和優秀特性已經逐步被接受。但是,在一些特殊的應用場景下,還是有Bug或者故障的存在。

本篇主要介紹筆者在工作中遇到的一個Impdp過程中出現ORA-39083ORA-01403聯合錯誤故障,並且透過MOS官方找到解決方案的過程。

 

1、問題說明

 

筆者進行一個資料庫的匯出匯入操作,在impdp操作的時候發現了錯誤提示資訊。

 

 

ORA-39083: Object type INDEX_STATISTICS failed to create with error:

ORA-01403: no data found

ORA-01403: no data found

Failing sql is:

DECLARE I_N VARCHAR2(60);   I_O VARCHAR2(60);   NV VARCHAR2(1);   c DBMS_METADATA.T_VAR_COLL;   df varchar2(21) := 'YYYY-MM-DD:HH24:MI:SS';  stmt varchar2(300) := ' INSERT INTO "SYS"."IMPDP_STATS" (type,version,flags,c1,c2,c3,c5,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,d1,cl1) VALUES (''I'',6,:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,NULL,:14,:15,NULL,:16,:17)';BEGIN  DELETE

(重複若干次,篇幅原因,有所省略……

 

Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/FUNCTIONAL_INDEX/INDEX_STATISTICS

Processing object type SCHEMA_EXPORT/VIEW/VIEW

Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT

Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

Job "SYS"."SYS_IMPORT_FULL_01" completed with 153 error(s) at Thu Aug 27 10:20:39 2015 elapsed 0 00:04:05

 

 

從內容結構看,是在統計量匯入的時候發生的錯誤資訊。插入之前資料表和索引建立過程已經結束了。而且,運算元據表SQL語句涉及資料表是impdp_stats,是一個Oracle內部資料表。

經過檢查,資料表起碼都在,也沒有發現明顯的錯誤內容。在MOS上面,發現該問題還是有比較大的問題缺陷的。

 

2、問題分析

 

MOS ID 755253.1 DataPump Import (IMPDP) Failed With Errors ORA-39083 ORA-1403 On INDEX_STATISTICS中,對這個問題有比較詳細的敘述。

Impdp程式在操作上,是遵循型別原則進行匯入,也就是相同型別物件一次性處理。在下面的例項中,我們可以看到Impdp的操作過程。

 

 

Import: Release 11.2.0.4.0 - Production on Thu Aug 27 11:38: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

Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded

Starting "SYS"."SYS_IMPORT_FULL_01":  "/******** AS SYSDBA" dumpfile=test.dmp remap_schema=scott:sys

Processing object type TABLE_EXPORT/TABLE/TABLE 資料表後設資料

Processing object type TABLE_EXPORT/TABLE/TABLE_DATA插入資料

. . imported "SYS"."DEPT"                                5.960 KB       5 rows

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 資料表統計量

Job "SYS"."SYS_IMPORT_FULL_01" successfully completed at Thu Aug 27 11:38:32 2015 elapsed 0 00:00:01

 

 

在上面的過程中,我們可以看到Oracle Impdp匯入過程步驟順序:

 

ü  資料表後設資料,依次執行資料表建立DDL

ü  資料表資料,直接寫入資料表中。由於沒有約束和索引,所以這個過程資料插入是很快的;

ü  索引物件,建立索引物件;

ü  約束物件,包括主外來鍵等約束;

ü  索引統計量;

ü  資料表統計量;

 

通常情況下,這個過程是沒有過多問題的。但是由於主鍵約束的特性,能夠引起一些問題。

主鍵Primary Key是我們經常使用的一種約束,但是這種約束也存在一些副效應,就是連帶索引建立。

 

 

SQL> create table t as select * from user_objects;

Table created

 

SQL> alter table t add constraint pk_t primary key(object_id) ;

Table altered

 

SQL> select segment_name, segment_type from user_segments;

 

SEGMENT_NA SEGMENT_TYPE

---------- ---------------

T          TABLE

PK_T       INDEX

 

 

如果我們建立一個命名的主鍵約束,系統後連帶的建立一個同名的索引物件。如果我們在建立約束的時候沒有命名,系統會自動的建立一個命名物件。

 

 

SQL> create table t_r as select * from user_objects;

Table created

 

SQL> alter table t_r add (primary key (object_id));

Table altered

 

SQL> col segment_name for a20;

SQL> select segment_name, segment_type from user_segments;

 

SEGMENT_NAME         SEGMENT_TYPE

-------------------- ---------------

T                    TABLE

T_R                  TABLE

PK_T                 INDEX

SYS_C00131925        INDEX

 

 

注意:這個名稱是系統自動生成的。在匯出之後,系統匯入的時候,對這些缺失名稱的索引會採用在目標庫中的新名字。而且,這些系統名稱索引會在正式給定名稱索引之後才能建立(作為約束生成的副效應)。

在匯入的時候,根據impdp的工作順序,Oracle會先建立顯示命名的索引,之後才會建立約束,這時候才會建立連帶的建立索引。對命名主鍵索引而言,當約束生成的時候,Oracle發現已經有了命名索引,就不會再去建立系統索引了。後續,系統在進行索引統計量匯入的時候,自然也就報錯找不到資料了。

 

這個錯誤在Oracle被認為是一個BugBug編號是8615836ORA-1403 OCCURS DURING IMPORTING TABLE_STATISTICS IN IMPDP, closed as not feasible to fix

 

那麼,這種錯誤會有什麼長期影響呢?就是索引丟失,筆者發現,這種錯誤下是會出現源資料庫匯入之後,一些索引丟失的現象。

解決方案,Oracle提供了幾種:

 

ü  修改建立主鍵約束的方法,不要使用系統自動生成的主鍵名稱,而是進行全部命名;

ü  將索引匯入動作import indexes分拆出操作步驟,也就是先進行資料表、約束匯入,之後手工進行索引匯入。這樣就讓主鍵約束先建立命名索引或者系統自動名稱索引;

ü  最後,就是使用exp/imp傳統工具;

 

筆者認為:第二種方法是對通常DBA最好的策略。如果是開發階段,主鍵約束顯示命名應當作為一條開發規範在系統中落實。一般DBA遇到的情況下,往往是沒有精力進行快速的處理。

下面,筆者透過實驗去演示問題發生、索引缺失現象和第二種處理方法。

 

3、演示實驗

 

筆者透過兩個實驗資料表,來演示問題現象。實驗環境為11gR2,具體版本為11.2.0.4

 

 

SQL> select * from v$version;

 

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE     11.2.0.4.0     Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

 

 

建立專門使用者schema進行實驗。

 

 

SQL> create user test identified by test;

User created

 

SQL> grant connect, resource to test;

Grant succeeded

 

SQL> create table t_bk as select * from dba_objects;

Table created

 

SQL> alter table t_bk add (primary key (object_id, object_name)); --無顯示命名主鍵約束

Table altered

 

SQL> create index idx_t_bk on t_bk(object_name, object_id);

Index created

 

SQL> select segment_name, segment_type from user_segments;

 

SEGMENT_NAME    SEGMENT_TYPE

--------------- --------------------

T_BK            TABLE

SYS_C00124870   INDEX

IDX_T_BK        INDEX –其他索引

 

 

如果我們建立命名主鍵約束,如下:

 

 

SQL> create table t_ori as select * from t_bk;

Table created

 

SQL> alter table t_ori add constraint pk_t_ori primary key (object_id, object_name);

Table altered

 

SQL> create index idx_t_ori_com on t_ori(object_name,object_id);

Index created

 

SQL> select segment_name, segment_type from user_segments;

SEGMENT_NAME    SEGMENT_TYPE

--------------- ------------------------------------------------------------------------

T_ORI           TABLE

T_BK            TABLE

SYS_C00124870   INDEX

IDX_T_BK        INDEX

PK_T_ORI        INDEX

IDX_T_ORI_COM   INDEX

 

6 rows selected

 

 

下面,進行匯出和預設方式匯入操作。

 

 

SQL> show user;

User is "SYS"

 

[oracle@localhost ~]$ expdp \"/ as sysdba\" dumpfile=test.dmp schemas=test

 

Export: Release 11.2.0.4.0 - Production on Thu Aug 27 15:10:23 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 "SYS"."SYS_EXPORT_SCHEMA_01":  "/******** AS SYSDBA" dumpfile=test.dmp schemas=test

Estimate in progress using BLOCKS method...

Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA

Total estimation using BLOCKS method: 28 MB

Processing object type SCHEMA_EXPORT/USER

Processing object type SCHEMA_EXPORT/SYSTEM_GRANT

Processing object type SCHEMA_EXPORT/ROLE_GRANT

Processing object type SCHEMA_EXPORT/DEFAULT_ROLE

Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA

Processing object type SCHEMA_EXPORT/TABLE/TABLE

Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX

Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT

Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS

. . exported "TEST"."T_BK"                   11.81 MB  123146 rows

. . exported "TEST"."T_ORI"                  11.81 MB  123146 rows

Master table "SYS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded

***************************************

Dump file set for SYS.SYS_EXPORT_SCHEMA_01 is:

  /u01/app/admin/sicsdb/dpdump/test.dmp

Job "SYS"."SYS_EXPORT_SCHEMA_01" successfully completed at Thu Aug 27 15:10:36 2015 elapsed 0 00:00:13

 

 

嘗試預設匯入操作:

 

 

[oracle@localhost ~]$ impdp \"/ as sysdba\" dumpfile=test.dmp remap_schema=test:mt

 

Import: Release 11.2.0.4.0 - Production on Thu Aug 27 15:13: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

Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded

Starting "SYS"."SYS_IMPORT_FULL_01":  "/******** AS SYSDBA" dumpfile=test.dmp remap_schema=test:mt

Processing object type SCHEMA_EXPORT/USER

Processing object type SCHEMA_EXPORT/SYSTEM_GRANT

Processing object type SCHEMA_EXPORT/ROLE_GRANT

Processing object type SCHEMA_EXPORT/DEFAULT_ROLE

Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA

Processing object type SCHEMA_EXPORT/TABLE/TABLE

Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA

. . imported "MT"."T_BK"                                 11.81 MB  123146 rows

. . imported "MT"."T_ORI"                                11.81 MB  123146 rows

Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX

Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT

Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS

ORA-39083: Object type INDEX_STATISTICS failed to create with error:

ORA-01403: no data found

ORA-01403: no data found

Failing sql is:

DECLARE I_N VARCHAR2(60);   I_O VARCHAR2(60);   NV VARCHAR2(1);   c DBMS_METADATA.T_VAR_COLL;   df varchar2(21) := 'YYYY-MM-DD:HH24:MI:SS';  stmt varchar2(300) := ' INSERT INTO "SYS"."IMPDP_STATS" (type,version,flags,c1,c2,c3,c5,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,d1,cl1) VALUES (''I'',6,:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,NULL,:14,:15,NULL,:16,:17)';BEGIN  DELETE

Job "SYS"."SYS_IMPORT_FULL_01" completed with 1 error(s) at Thu Aug 27 15:13:35 2015 elapsed 0 00:00:04

 

 

注意:報錯發生,而且報一個錯誤資訊!這個很重要,說明在匯入index統計量的時候一個索引發生問題。

檢查結果:系統自命名索引缺失。

 

 

SQL> select segment_name, segment_type from dba_segments where owner='MT';

 

SEGMENT_NAME    SEGMENT_TYPE

--------------- ------------------------------------------------------------------------

IDX_T_ORI_COM   INDEX  <--T_ORI

PK_T_ORI        INDEX  <--T_ORI

IDX_T_BK        INDEX  <--T_BK

T_ORI           TABLE

T_BK            TABLE

 

 

處理方法,拆分為兩步匯入過程:

 

 

[oracle@localhost ~]$ impdp \"/ as sysdba\" dumpfile=test.dmp remap_schema=test:mt exclude=index

 

Import: Release 11.2.0.4.0 - Production on Thu Aug 27 15:21:22 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

Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded

Starting "SYS"."SYS_IMPORT_FULL_01":  "/******** AS SYSDBA" dumpfile=test.dmp remap_schema=test:mt exclude=index

Processing object type SCHEMA_EXPORT/USER

ORA-31684: Object type USER:"MT" already exists

Processing object type SCHEMA_EXPORT/SYSTEM_GRANT

Processing object type SCHEMA_EXPORT/ROLE_GRANT

Processing object type SCHEMA_EXPORT/DEFAULT_ROLE

Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA

Processing object type SCHEMA_EXPORT/TABLE/TABLE

Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA

. . imported "MT"."T_BK"                                 11.81 MB  123146 rows

. . imported "MT"."T_ORI"                                11.81 MB  123146 rows

Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT

Job "SYS"."SYS_IMPORT_FULL_01" completed with 1 error(s) at Thu Aug 27 15:21:25 2015 elapsed 0 00:00:02

 

 

[oracle@localhost ~]$ impdp \"/ as sysdba\" dumpfile=test.dmp remap_schema=test:mt include=index

 

Import: Release 11.2.0.4.0 - Production on Thu Aug 27 15:21:49 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

Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded

Starting "SYS"."SYS_IMPORT_FULL_01":  "/******** AS SYSDBA" dumpfile=test.dmp remap_schema=test:mt include=index

Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX

ORA-31684: Object type INDEX:"MT"."PK_T_ORI" already exists

Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS

ORA-39111: Dependent object type INDEX_STATISTICS skipped, base object type INDEX:"MT"."PK_T_ORI" already exists

Job "SYS"."SYS_IMPORT_FULL_01" completed with 2 error(s) at Thu Aug 27 15:21:52 2015 elapsed 0 00:00:02

 

 

檢視索引建立:

 

 

SQL> select segment_name, segment_type from dba_segments where owner='MT';

 

SEGMENT_NAME    SEGMENT_TYPE

--------------- ------------------------------------------------------------------------

PK_T_ORI        INDEX

SYS_C00124889   INDEX

IDX_T_ORI_COM   INDEX

IDX_T_BK        INDEX

T_ORI           TABLE

T_BK            TABLE

 

6 rows selected

 

 

沒有出現錯誤提示資訊。

 

4、結論

 

資料備份、還原是我們經常使用的情況,其實也是使用者最常使用的功能。針對各種問題錯誤,我們首先原則是資料完整性,資料丟失、物件丟失都是需要重視的問題方面。


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

相關文章