Impdp ORA-39083、ORA-01403報錯問題分析解決
資料泵(Data Pump)是從10g開始推出的新一代資料邏輯備份還原工具。從產品線角度看,Data Pump是用於替換Exp/Imp傳統工具的。經過若干版本的演進,Data Pump的相容性和優秀特性已經逐步被接受。但是,在一些特殊的應用場景下,還是有Bug或者故障的存在。
本篇主要介紹筆者在工作中遇到的一個Impdp過程中出現ORA-39083和ORA-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被認為是一個Bug,Bug編號是8615836:ORA-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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORA-39083 ORA-23421 問題分析與解決
- 解決 Inkscape 報錯 Duplicate 問題
- 資料遷移出現ORA-39083, ORA-01403,ORA-01403
- 解決eslint空格報錯等問題EsLint
- 設定autotrace的報錯問題解決
- 解決cookies儲存中文報錯問題Cookie
- 安裝vue/cli報錯問題解決Vue
- impdp 10g/11g問題解決
- 使用API28報錯問題及解決API
- jquery-weui微信支付報錯問題解決jQueryUI
- matplotlib中文報錯問題及解決方案
- mac 下PyCharm執行報錯問題解決MacPyCharm
- 解決MMM啟動監控報錯的問題
- 解決vue使用Sass時候的報錯問題Vue
- vm安裝ubuntu後,update報錯問題解決Ubuntu
- 解決mysql_query()報錯的相關問題MySql
- impdp匯入包含xmltype型別欄位空表報錯問題XML型別
- Uncaught Error: Bootstrap‘s JavaScript requires jQuery報錯問題解決ErrorbootJavaScriptUIjQuery
- 解決element---el-dialog--關閉報錯問題
- Delta Magisk root後解決adb的報錯問題
- impdp 遇到 ORA-07445 錯誤。重新EXPDP,IMPDP解決了。
- 解決Vagrant報錯Warning: Authentication failure. Retrying問題AI
- PHP報錯getimagesize(): SSL operation failed with code 1問題解決方案PHPAI
- 使用npm i報錯node-sass失敗問題解決NPM
- 記錄解決HttpServletResponse在引數報錯的問題HTTPServlet
- 若依框架匯入阿里OSS報錯問題解決方案框架阿里
- Oracle imp/impdp報ORA-04031:streams pool,..fixed allocation callback解決/分析Oracle
- 關於Unsupported major.minor version 52.0報錯問題解決方案
- win7_iis報500.19和500.21錯誤問題解決Win7
- Doris建立表報錯Failed to find enough host with storage medium問題解決AI
- MongoDB報錯"not authorized on root to execute command"問題解決一例MongoDBZed
- 10G RAC DBCA報錯 ORA-27504問題的解決
- LightDB Canopy 常見報錯問題分析(一)
- 解決 ngrok 的 Domain 錯誤問題AI
- 解決「問題」,不要解決問題
- 在impdp匯入報編譯錯誤ORA-39082的解決辦法編譯
- Laravel 安裝 voyager 出現的資料庫報錯問題解決Laravel資料庫
- 關於Xcode10中libstdc報錯問題的解決XCode