ITPub博客

首页 > Linux操作系统 > Linux操作系统 > dbms_stats.import_table_stats导入报错ORA-20000

dbms_stats.import_table_stats导入报错ORA-20000

原创 Linux操作系统 作者:myownstars 时间:2011-05-06 01:31:16 0 删除 编辑

将主库的统计信息通过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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: DRM
请登录后发表评论 登录
全部评论

注册时间:2010-03-18

  • 博文量
    375
  • 访问量
    3164661