oracle 10g数据库下的 XDB组件的重新安装

emmmm,这是一个不做死就不会死的过程!!!

今天在导出数据库时,遇到了报错信息,其实开发说这个报错没关系了,但作死如楼主,一定要把这个错给解决了,然后就有了下面的作死过程。

错误关键字是:package body"XDB.DBMS_XDBZ0" has error 。如下截图:

经历过一番百度后,查到了下面的sql语句,查询XDB组件的是否可用,即状态是 valid 还是invalid,sql和查询截图如下:

select owner, object_name, object_type, status
from dba_objects
where status = 'INVALID' and object_name = 'DBMS_XDBZ0';

网上百度了很多资料,操作如下:

执行了 @$ORACLE_HOME/rdbms/admin/utlrp.sql ,没有任何用,不过我查询数据库里的 invalid 状态的数据变少了很多,但是报错的这个组件没有变化!

alter package XDB.DBMS_XDBZ0  COMPILE BODY; 执行了这个,也没有用。

最后最后,询问了实施,给楼主提供了一种解决办法的思路,给了我一个链接: 

 http://blog.sina.com.cn/s/blog_aa84cfe40101l4ye.html
 
然后楼主按照这个思路开始百度XDB组件的重新安装,综合参考了很多文章,主要是下面三篇:

http://blog.csdn.net/whb234174124/article/details/52980275

http://blog.csdn.net/sszxhzd/article/details/78626715

http://blog.csdn.net/fidelhl/article/details/2753384

其中一篇是英文,我找的谷歌翻译,其他两篇讲的都不够详细。

我安装了2次,第一次安装的时候没先创建XDB用户和表空间,安装的日志有报错,所以楼主又给卸载了,卸载的时候没先重启数据库,卸载了很久都没成功,(讲真到这里我真不想再搞了,这时候虽然这个组件不可用,但是数据库还是正常的)反正就是坑。

下面我来梳理下我重新安装XDB组件的全部过程:

创建XDB组件首先要先卸载XDB组件(没有的就不用了)

卸载XDB组件:

1.第一次卸载时没重启数据库,但也卸载成功了,没安装成功后再次卸载,但是没重启,卸载了n久,最后重启数据库后才卸载成功。

所以卸载时无论怎么样还是先重启下数据库吧

shutdown immediate

sqlplus / as sysdba  

startup

2.运行脚本(脚本都是数据库自带的):

@$ORACLE_HOME/rdbms/admin/catnoqm.sql

drop trigger sys.xdb_installation_trigger;
drop trigger sys.dropped_xdb_instll_trigger;
drop table dropped_xdb_instll_tab;

至此就卸载成功了!

安装XDB组件:

1.首先创建 XDB 表空间 和XDB 用户名,并赋予权限

创建表空间 XDB

CREATE TABLESPACE XDB DATAFILE
'/data/app/oracle/oradata/hundsun/XDB.dbf' SIZE 200M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO;

ps :/data/app/oracle/oradata/hundsun/ 这段路径可以使用这段sql查询:select name from v$datafile;

创建 XDB 用户

create user XDB identified by XDB default tablespace XDB;

给XDB用户赋权限

GRANT SELECT ANY TABLE TO XDB;

2.执行XDB创建的脚本

@$ORACLE_HOME/rdbms/admin/catqm.sql XDB XDB XDB

ps:后面 三个XDB 分别指 XDB用户密码,XDB默认表空间,XDB临时表空间,一定一定要在执行脚本时就带上,我第一次就没填入,回车后让输入一些不知道怎么填入的值。

在这里执行脚本的时候可以查看执行的日志,顺序如下:

set echo on

spool  /home/oracle/xdb.log

@$ORACLE_HOME/rdbms/admin/catqm.sql XDB XDB XDB

spool off;

alter system set dispatchers="(PROTOCOL=TCP)(SERVICE=hund【填入数据库的SID】)";

最后就是检测是否安装成功,以及XDB下面的组件状态是否变为可用了,用下面几个sql:

select count(*) from dba_objects
where owner='XDB' and status='INVALID';

select owner, object_name, object_type, status
from dba_objects
where status = 'INVALID'
and owner in ('sys' ,'XDB');

select comp_name, status, version
from DBA_REGISTRY
where comp_name= 'Oracle XML Database';

ps:这段可以查看XDB组件有没有安装成功,安装成功的状态应该是valid,我第一次安装后查看的时候这个状态是 loading,

卸载的时候 状态是removing。

最后如果你查看这个组件下的package 还有一些状态是invalid,那就再执行一下下面这个脚本:

@$ORACLE_HOME/rdbms/admin/utlrp.sql

不过我执行了之后数据库还有一个PACKAGE BODY 是invalid的。

再尝试导出的时候已经不报原来的错了。剩下的这个invalid 我已经不打算再继续深究了,毕竟公司的测试库,搞砸了我可能就要滚蛋了。

原文地址:https://www.cnblogs.com/huangaojiao/p/8612038.html