将主库的统计信息通过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博客 ” ,链接:https://blog.itpub.net/15480802/viewspace-694582/ ,如需转载,请注明出处,否则将追究法律责任。