在使用DBUA将10.2.0.1升级到10.2.0.3的过程中,出现了ORA-04031: unable to allocate 4096 bytes of shared memory的错误。
查询了METALINK,发现DBUA对于自动内存管理使用不是很好。如果使用DBUA,那么最好在启动之前通过ALTER SYSTEM将内存管理设置为手工调整方式,并设置共享池足够的空间(200M)以上。这样使用DBUA进行数据库的升级就不会出现问题。
如果已经碰到了这个问题:DBUA升级一半时出错,且数据库没有备份。而且再次使用DBUA时,DBUA报错:
DBUA认为这是一个重新运行操作并且正在尝试连接到使用Oracle主目录E:oracle10.2的数据库。如果您认为这不是一个重新运行操作,请删除下面的文件并再次调用DBUA。
E:oracle10.2cfgtoollogsdbualogsWelcome_YTK.txt
根据上面的错误信息提示,在指定目录却找不到相关的文件。
Metalink上面对于这个问题专门的文章进行描述:Doc ID:Note:339887.1。
其中将这个问题分成了三种不同的情况,并针对这三种情况分别给了解决的方法。
根据上面提到的方法:尝试SHUTDOWN IMMEDIATE,然后STARTUP UPGRADE,并删除e:oracle10.2cfgtoollogsdbuaytk目录下所有的文件,但是错误依旧。
无论采用这篇文章中提到的哪个方法,都无法解决问题。
仔细查看了数据库HOME目录中所有和DBUA相关的文件,确认这个问题不是由于文件系统中的配置文件引起的。
那么怀疑的对象就要放到数据库中了。如果问题出在数据库,那么就有很多种方法来检测了,最简单的方法莫过于SQL_TRACE。
无法设置DBUA的会话打开SQL_TRACE,而且由于DBUA使用SYS连接数据库,登陆触发器的方式也对DBUA的会话无效。唯一的方法是在DBUA连接数据库之前在系统级设置ALTER SYSTEM SET SQL_TRACE = TRUE;
SQL> alter system set sql_trace = false;
系统已更改。
然后在DBUA启动并报错,检查后台所有生成的TRACE文件,发现错误出现在对DBA_REGISTRY视图的查询时:
PARSE ERROR #1:len=56 dep=0 uid=0 oct=3 lid=0 tim=3076422478 err=4063
select version from dba_registry where comp_id='CATPROC
关闭SQL_TRACE,在SQLPLUS中执行查询,发现DBA_REGISTRY视图出现错误:
SQL> alter system set sql_trace = false;
系统已更改。
SQL> select version from dba_registry where comp_id='CATPROC';
select version from dba_registry where comp_id='CATPROC'
*第1行出现错误:
ORA-04063: view "SYS.DBA_REGISTRY"有错误
SQL> desc sys.dba_registry
ERROR:
ORA-24372:无效的描述对象
看来造成DBUA错误的原因是由于刚才升级过程执行了一半,导致部分数据字典不完整或错误。
现在唯一的解决方法只有手工执行升级了:
SQL> startup upgrade
ORACLE例程已经启动。
Total System Global Area 524288000 bytes
Fixed Size 1291576 bytes
Variable Size 192940744 bytes
Database Buffers 322961408 bytes
Redo Buffers 7094272 bytes数据库装载完毕。数据库已经打开。SQL> SPO E:PATCH.LOG
SQL> @?RDBMSADMINCATUPGRD.SQL
SQL> SPO OFF
SQL> SHUTDOWN IMMEDIATE数据库已经关闭。已经卸载数据库。ORACLE例程已经关闭。SQL> STARTUP
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE例程已经启动。
Total System Global Area 524288000 bytes
Fixed Size 1291576 bytes
Variable Size 234883784 bytes
Database Buffers 281018368 bytes
Redo Buffers 7094272 bytes数据库装载完毕。数据库已经打开。SQL> @?RDBMSADMINUTLRP
SQL> DESC DBA_REGISTRY名称是否为空?类型----------------------------------------- -------- ----------------------------
COMP_ID NOT NULL VARCHAR2(30)
COMP_NAME VARCHAR2(255)
VERSION VARCHAR2(30)
STATUS VARCHAR2(22)
MODIFIED VARCHAR2(25)
NAMESPACE NOT NULL VARCHAR2(30)
CONTROL NOT NULL VARCHAR2(30)
SCHEMA NOT NULL VARCHAR2(30)
PROCEDURE VARCHAR2(61)
STARTUP VARCHAR2(8)
PARENT_ID VARCHAR2(30)
OTHER_SCHEMAS VARCHAR2(4000)
检查PATCH.LOG,为发现异常错误,最后的汇总信息如下:
Oracle Database 10.2 Upgrade Status Utility 10-24-2007 14:00:16
.
Component Status Version HH:MM:SS
Oracle Database Server VALID 10.2.0.3.0 00:13:06
JServer JAVA Virtual Machine VALID 10.2.0.3.0 00:02:33
Oracle XDK VALID 10.2.0.3.0 00:00:18
Oracle Database Java Packages VALID 10.2.0.3.0 00:00:36
Oracle Text VALID 10.2.0.3.0 00:00:27
Oracle XML Database VALID 10.2.0.3.0 00:01:21
Oracle Data Mining VALID 10.2.0.3.0 00:00:30
OLAP Analytic Workspace VALID 10.2.0.3.0 00:00:44
OLAP Catalog VALID 10.2.0.3.0 00:01:21
Oracle OLAP API VALID 10.2.0.3.0 00:00:49
Oracle interMedia VALID 10.2.0.3.0 00:05:04
Spatial VALID 10.2.0.3.0 00:01:23
Oracle Label Security VALID 10.2.0.3.0 00:00:14
Oracle Expression Filter VALID 10.2.0.3.0 00:00:14
Oracle Enterprise Manager VALID 10.2.0.3.0 00:03:17
Oracle Rule Manager VALID 10.2.0.3.0 00:00:20
.
Total Upgrade Time: 00:32:26
问题解决。看来新推出的功能、工具总是会伴随着很多bug的。