dbms_stats.import_table_stats匯入報錯ORA-20000

myownstars發表於2011-05-06

將主庫的統計資訊透過expdp/impdp傳輸到測試庫,然後呼叫dbms_stats.import_table_stats匯入,卻遭遇以下錯誤

SQL> exec dbms_stats.import_table_stats(ownname => user,tabname => 'a',stattab => 'a_stat');
 
begin dbms_stats.import_table_stats(ownname => user,tabname => 'a',stattab => 'a_stat'); end;
 
ORA-20000: TABLE "SYS"."a_stat" does not exist or insufficient privileges
ORA-06512: at "SYS.DBMS_STATS", line 7115
ORA-06512: at "SYS.DBMS_STATS", line 8016
ORA-06512: at line 2
表明明屬於justin使用者,錯誤資訊卻顯示該API去查詢sys使用者
呼叫10046,發現錯誤出現在哪裡了,這是語句終止前最後一條
select obj#,type#,ctime,mtime,stime,status,dataobj#,flags,oid$, spare1, spare2 from obj$ where owner#=:1 and name=:2 and namespace=:3 and remoteowner is null and linkname is null and subname is null
END OF STMT
PARSE #12:c=1000,e=707,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=1273851541041681
BINDS #12:
kkscoacd
 Bind#0
  acdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
  acflg=08 fl2=0001 frm=00 csi=00 siz=24 ff=0
  kxsbbbfp=2a97487930  bln=22  avl=01  flg=05
  value=0
 Bind#1
  acdty=01 mxl=32(19) mxlc=00 mal=00 scl=00 pre=00
  acflg=18 fl2=0001 frm=01 csi=871 siz=32 ff=0
  kxsbbbfp=2a974878f8  bln=32  avl=19  flg=05
  value="a"
 Bind#2
  acdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
  acflg=08 fl2=0001 frm=00 csi=00 siz=24 ff=0
  kxsbbbfp=2a974878c8  bln=24  avl=02  flg=05
  value=1
user#=0對應的是sys使用者,
SQL> select name,user# from USER$ where user# =0;
 
NAME                                USER#
------------------------------ ----------
SYS                                     0
以sys使用者登入
SQL> create table a_stat as select * from justin.a_stat;

Table created.

SQL> show user;
USER is "SYS"
然後繼續

SQL> exec dbms_stats.import_table_stats(ownname => 'justin',tabname => 'a',stattab => 'a_stat');
 
PL/SQL procedure successfully completed
現在則成功,可為什麼為import_table_stats會到sys裡面去查詢表哪?
把表drop purge掉,重新測試,剛才的現象重現,換了一個表進行同樣的測試卻能成功,可見並不是bug導致,接下來使用ctas建立新表,沒有問題

SQL> create table a_middle as select * from a where 1=0;
 
Table created

SQL> exec dbms_stats.import_table_stats(ownname => 'justin',tabname => 'a_middle',stattab => 'a_stat');
 
PL/SQL procedure successfully completed
a_middle比起a缺失的是其上的索引
初步懷疑是表a上的索引導致的
SQL> select owner,index_name from dba_indexes where table_name ='a';
 
OWNER                          INDEX_NAME
------------------------------ ------------------------------
justin                         justin_id
SYS                            justin_time

果然,第三個索引的owner居然是sys,新增引數statown
SQL> exec dbms_stats.import_table_stats(ownname => 'justin',tabname => 'a',stattab => 'a_stat',statown => 'justin');
 
PL/SQL procedure successfully completed

最後解決方案,把索引justin_time刪掉然後在justin使用者下重建,錯誤消失。

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

相關文章