資料泵匯入分割槽表統計資訊報錯(七)
今天在進行資料泵匯入操作時,發現一個bug。
繼續分析另一個錯誤資訊。
資料泵匯入分割槽表統計資訊報錯(一):http://yangtingkun.itpub.net/post/468/456176
資料泵匯入分割槽表統計資訊報錯(二):http://yangtingkun.itpub.net/post/468/456378
資料泵匯入分割槽表統計資訊報錯(三):http://yangtingkun.itpub.net/post/468/489067
資料泵匯入分割槽表統計資訊報錯(四):http://yangtingkun.itpub.net/post/468/489253
資料泵匯入分割槽表統計資訊報錯(五):http://yangtingkun.itpub.net/post/468/489433
資料泵匯入分割槽表統計資訊報錯(六):http://yangtingkun.itpub.net/post/468/492401
其實問題的引出是由於出現第一篇文章中描述的問題,不過隨著問題的深入研究,挖掘出了一些隱藏的很深的問題,不過問題的研究也慢慢脫離了原本的問題。
在解決了表統計資訊鎖定的問題後,在回過頭看看導致第一篇文章中錯誤的具體原因。
bash-2.03$ impdp test/test directory=d_test dumpfile=zhejiang_order.dp logfile=zhejiang_order.log remap_schema=zhejiang:test include=table/statistics
Import: Release 10.2.0.3.0 - 64bit Production on 星期二, 20 4月, 2010 18:42:01
Copyright (c) 2003, 2005, Oracle. All rights reserved.
連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
已成功載入/解除安裝了主表 "TEST"."SYS_IMPORT_FULL_01"
啟動 "TEST"."SYS_IMPORT_FULL_01": test/******** directory=d_test dumpfile=zhejiang_order.dp logfile=zhejiang_order.log remap_schema=zhejiang:test include=table/statistics
處理物件型別 TABLE_EXPORT/TABLE/TABLE_DATA
處理物件型別 TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
ORA-39083: 物件型別 TABLE_STATISTICS 建立失敗, 出現錯誤:
ORA-06550: 第 12 行, 第 17 列:
PL/SQL: ORA-00917: 缺失逗號
ORA-06550: 第 4 行, 第 115 列:
PL/SQL: SQL Statement ignored
ORA-06550: 第 20 行, 第 17 列:
PL/SQL: ORA-00917: 缺失逗號
ORA-06550: 第 12 行, 第 161 列:
PL/SQL: SQL Statement ignored
ORA-06550: 第 28 行, 第 17 列:
PL/SQL: ORA-00917: 缺失逗號
ORA-06550: 第 20 行, 第 161 列:
PL/SQL: SQL Statement ignored
ORA-06550: 第 36 行, 第 17 列:
PL/SQL: ORA-00917: 缺失逗號
ORA-06550: 第 28 行, 第 1
作業 "TEST"."SYS_IMPORT_FULL_01" 已經完成, 但是有 1 個錯誤 (於 18:42:13 完成)
顯然第一篇文章出現的錯誤和上面幾篇文章描述的錯誤還是有差距的,懷疑導致問題的原因出在DMP檔案上。
下面透過TRACE的方式,檢查導致問題產生的具體原因。
設定TRACE的方式有很多種,但是對於這種執行很快就結束的錯誤,最好的辦法是透過登陸觸發器。不過使用登陸觸發器仍然有點複雜,其實瞭解IMPDP工作特性後,可以方便的利用DBMS_MONITOR包來設定TRACE。
在剛才執行匯入的時候,在另外的會話檢查資料泵後臺程式對應的MODULE和SERVICE_NAME資訊:
SQL> SELECT SID, MODULE, ACTION, SERVICE_NAME
2 FROM V$SESSION
3 WHERE USERNAME = 'TEST';
SID MODULE ACTION SERVICE_NAME
---------- ------------------------------ ------------------------------ --------------------
300 udi@racnode1 (TNS V1-V3) SYS$USERS
SQL> SELECT SID, MODULE, ACTION, SERVICE_NAME
2 FROM V$SESSION
3 WHERE USERNAME = 'TEST';
SID MODULE ACTION SERVICE_NAME
---------- ------------------------------ ------------------------------ --------------------
292 Data Pump Master SYS_IMPORT_FULL_01 SYS$USERS
300 udi@racnode1 (TNS V1-V3) SYS$USERS
SQL> SELECT SID, MODULE, ACTION, SERVICE_NAME
2 FROM V$SESSION
3 WHERE USERNAME = 'TEST';
SID MODULE ACTION SERVICE_NAME
---------- ------------------------------ ------------------------------ --------------------
283 udi@racnode1 (TNS V1-V3) SYS$USERS
292 Data Pump Master SYS_IMPORT_FULL_01 SYS$USERS
300 udi@racnode1 (TNS V1-V3) SYS$USERS
下面開啟MODULE為Data Pump Master,且SERVICE為SYS$USERS的會話的TRACE:
SQL> BEGIN
2 DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(
3 'SYS$USERS',
4 'Data Pump Worker',
5 'SYS_IMPORT_FULL_01',
6 TRUE,
7 TRUE);
8 END;
9 /
PL/SQL 過程已成功完成。
再次執行匯入,TRACE對應的資訊很簡單:
bash-2.03$ more testrac1_ora_841.trc
/data/oracle/admin/testrac/udump/testrac1_ora_841.trc
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
ORACLE_HOME = /data/oracle/product/10.2/database
System name: SunOS
Node name: racnode1
Release: 5.8
Version: Generic_117350-46
Machine: sun4u
Instance name: testrac1
Redo thread mounted by this instance: 1
Oracle process number: 33
Unix process pid: 841, image: oracle@racnode1 (TNS V1-V3)
*** SERVICE NAME:(SYS$USERS) 2010-04-20 19:05:34.808
*** SESSION ID:(288.16791) 2010-04-20 19:05:34.808
kswscrs: deleted entry : svcid = 13, count=13
kswscrs: deleted entry : svcid = 14, count=14
這顯然不是我們要尋找的出錯的匯入會話,開啟MODULE為udi@racnode1 (TNS V1-V3)的會話對應的TRACE:
SQL> BEGIN
2 DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(
3 'SYS$USERS',
4 'udi@racnode1 (TNS V1-V3)',
5 DBMS_MONITOR.ALL_ACTIONS,
6 TRUE,
7 TRUE);
8 END;
9 /
PL/SQL 過程已成功完成。
執行匯入,得到了TRACE資訊:
kswscrs: deleted entry : svcid = 13, count=13
kswscrs: deleted entry : svcid = 14, count=14
SKGXPSEGRCV: MESSAGE TRUNCATED user data 48 bytes payload 2024 bytes
SKGXPSEGRCV: trucated message buffer data skgxpmsg meta. data header 0xffffffff7fff4108 len 48 bytes
SKGXPLOSTACK: message truncation expected
SKGXPLOSTACK: data sent to port with no buffers queued from
SKGXPGPID ffffffff7fff4028 Internet address 10.0.0.3 UDP port number 56083
SKGXPLOSTACK: sent seq 32763 expecting 32764
SKGXPLOSTACK: lost ack detected retransmit ack
顯然資訊仍然不夠,於是直接開啟所有SERVICE為SYS$USERS的會話的TRACE:
SQL> BEGIN
2 DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE(
3 'SYS$USERS',
4 'Data Pump Worker',
5 'SYS_IMPORT_FULL_01');
6 END;
7 /
PL/SQL 過程已成功完成。
SQL> BEGIN
2 DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE(
3 'SYS$USERS',
4 'udi@racnode1 (TNS V1-V3)',
5 DBMS_MONITOR.ALL_ACTIONS);
6 END;
7 /
PL/SQL 過程已成功完成。
SQL> BEGIN
2 DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(
3 'SYS$USERS',
4 DBMS_MONITOR.ALL_MODULES,
5 DBMS_MONITOR.ALL_ACTIONS,
6 TRUE,
7 TRUE);
8 END;
9 /
PL/SQL 過程已成功完成。
檢查生成的TRACE檔案:
BINDS #39:
kkscoacd
Bind#0
acdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00
acflg=13 fl2=206001 frm=00 csi=00 siz=24 ff=0
kxsbbbfp=ffffffff7b337e78 bln=22 avl=02 flg=09
value=45
EXEC #39:c=0,e=450,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=4903541916613
ERROR #39:err=39096 tim=502122692
WAIT #9: nam='SQL*Net message to client' ela= 3 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=4903541917005
EXEC #9:c=0,e=2679,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=4903541917063
WAIT #9: nam='SQL*Net message from client' ela= 694 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=4903541917910
XCTEND rlbk=0, rd_only=1
在檔案的最後部分,可以看到,Oracle執行CURSOR #39是出現了錯誤。這個錯誤資訊是ORA-39096:
ORA-39096: invalid input value string for parameter string
Cause: A NULL or invalid value was supplied for the parameter.
Action: Correct the input value and try the call again.
配合這個錯誤資訊和IMPDP輸出引數,懷疑是Oracle在執行PL/SQL程式碼的時候,由於輸入引數的錯誤,導致了問題的產生。
下面看看CURSOR #39對應的SQL:
PARSING IN CURSOR #39 len=46 dep=1 uid=0 ct=47 lid=0 tim=4903540014137 hv=2056630971 ad='ed715768'
BEGIN sys.kupc$que_int.detach_queues(:1); END;
END OF STMT
PARSE #39:c=0,e=135,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=4903540014127
BINDS #39:
kkscoacd
Bind#0
acdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00
acflg=13 fl2=206001 frm=00 csi=00 siz=24 ff=0
kxsbbbfp=ffffffff7b338128 bln=22 avl=02 flg=09
value=45
這個錯誤發生在detach_queue的過程中,這個步驟應該是impdp結束工作後進行的收尾工作,基本上可以確認impdp的錯誤不會引起什麼嚴重的問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-660383/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料泵匯入分割槽表統計資訊報錯(二)
- 資料泵匯入分割槽表統計資訊報錯(四)
- 資料泵匯入分割槽表統計資訊報錯(三)
- 資料泵匯入分割槽表統計資訊報錯(六)
- 資料泵匯入分割槽表統計資訊報錯(五)
- 資料泵匯入分割槽表長時間HANG住
- 使用PARTITION_OPTIONS引數控制資料泵分割槽表匯入
- 分割槽表匯入資料庫資料庫
- 匯入匯出 Oracle 分割槽表資料Oracle
- 資料泵匯出匯入表
- 大資料量分割槽表統計資訊的管理大資料
- 分割槽表入無分割槽的資料庫資料庫
- Oracle使用資料泵匯出匯入表Oracle
- 對比資料泵與原始匯入匯出工具(七)
- 使用expdp匯出分割槽表中的部分分割槽資料
- 資料泵匯出匯入
- 資料泵匯出索引資料和統計資訊嗎索引
- 【實驗】【PARTITION】exp匯出分割槽表資料
- Impdp資料泵匯入
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- 資料泵的匯入匯出
- 表統計資訊匯出匯入指令碼指令碼
- Oracle資料泵-schema匯入匯出Oracle
- 使用資料泵impdp匯入資料
- 資料泵匯出匯入資料標準文件
- Oracle使用資料泵在異機之間匯出匯入表Oracle
- Oracle資料泵的匯入和匯出Oracle
- Oracle資料泵匯出匯入(expdp/impdp)Oracle
- 資料泵取匯出和匯入(一)
- 資料庫系統設計:分割槽資料庫
- 11g解決imp匯入資料時報錯:插入資料找不到相應分割槽
- 資料泵無法匯入JOB
- 資料泵匯出資料包錯處理
- 轉oracle資料泵匯出時報錯Oracle
- 自動備份、截斷分割槽表分割槽資料
- 資料庫泵(expdp/impdp)匯入匯出流程資料庫
- 11g後設資料匯入19c分割槽表建立不成功
- 海量資料遷移之使用分割槽並行切分匯入並行