安装测试数据库记录(4)

起因:监听程序无法识别服务名

       由于Oracle网络通讯采用的是C/S模式,也就是说,客户端的请求要被监听,才能为服务器端所知,影子进程才会产生,通道才能建立起来。无法识别服务名,说明TNS翻译过来的service_name,有可能并没有在listener那里注册。问题也随之而来。因为9i及以上版本是支持动态注册的,如果没有静态配置listener.ora,也并不会对识别服务名造成影响。除非是参数文件中对于instence_name,db_name,domain的配置存在问题。

       先检查一下参数文件中是否有service_nameinstance_name,如果定义了,那么会使用service_name/instance_name来连接,这取决于TNS中是以serivce_name来连接还是以sid来请求连接。如果没有,db_namedb_domain会组合成service_name进行注册。经过检查,没有发现init.ora文件(有一个同名的,但是是基于7版本及以下的一个管理工具目录下的,并非当前配置),根据参数文件检索规则,首先检查的是ORACLE_SID,在该目录下,以spfile.oraspfile.orainit.ora的顺序寻找。通过查找发现了spfile.ora,补充一点,这个init.ora里面只是做了个指向spfile.ora,并没有其它内容。按道理spfile是没有办法直接编辑的,而且由于根本连不上数据库,也就不能用命令查看参数,直接用notepad打开后,发现里面记录的db_namedb_domain都非常正常,也就是说,动态注册理论上没有问题才对。

动态注册是在数据库连接时由PMON向监听器注册的,虽然在数据库运行期间,PMON会自动、定期向监听进程注册、更新信息(1 min),或由DBA alter system register,但在数据库未启动时,这个注册的时间就不得而知了。

为了把数据库启动,很不情愿地配了下listener.ora,连接成功,但是问题随之而来,在另一个窗口执行lsnrctl stat命令时,hang住了。网络上一种意见是queuesize的设置太小了,这个参数决定了监听器的队列长度,缺省是5,配置在listener.ora中。由于我没有配置,这个参数应当也是5。这个等待似乎没有尽头,我尝试shutdown immediate,也进入等待,看来应该用abort,关闭服务后重启,再进行连接似乎没有再出现大问题(TNS-12518: 监听程序无法分发客户机连接,这个是因为服务没启动,网络上另一种观点认为内存不足也会导致这种问题

摘录:

这个错误在oracle 9.2Oracle 10.2.X数据库的windows平台很常见,

原因:服务器可用的内存枯竭。

通常的解决办法如下:

1enable 4GB开关,在C:\根目录下的boot.ini文件中增加/PAE参数,如下:

multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server" /PAE

注意:只支持Windows 2000高级服务器版,数据中心版和windows 2003企业版,数据中心版;如果没有4GB这个大的物理内存也不行。

2、在初始化文件中,加入参数:

USE_INDIRECT_DATA_BUFFERS=TRUE

同时,数据库告诉缓存必须使用DB_BLOCK_BUFFERSdb_block_size 调整;

3、减小总的SGA的大小;

4、用orastack更改Oracle.exeTNSLSNR.exe的栈大小,如500K

5、更改服务器从专用模式到共享模式。

总的来说,如果有比较大的内存会好办一些,如果内存较小,就只能减小SGA了,用orastack.exe更改栈大小效果不明显。

还有ORA-24324: 未初始化服务句柄ORA-01041: 内部错误, hostdef 扩展名不存在,属于操作系统: window xp sp2数据库版本:oracle 10.2.0.1特有的BUG,据说打补丁能好,一般情况下就直接重启SQL*PLUS)。

NOMOUNT是没有问题的,接下来的问题是无法MOUNT,提示无法 startup已在运行的数据库,这个startup命令是不能用了的,逐状态启用应该是alter database,但是当时我直接startup也是没有成功,这就有问题了。抛出的错误比较严重,ORA-00704,翻译成中文就是引导程序失败,在alert_test日志中记录的还有ORA-39700,必须用UPGRADE选项打开数据库。UPGRADEMIGRATE都是升级命令(9I),这里温习一下Oracle版本规则名:比如10.2.0.1.010代表主版本号,2代表数据库维护号,0代表应用服务器号,1代表特定组件号(或称为补丁号),最后一个0代表操作系统平台。我的数据库是在安装时创建的一个数据库,在完成安装后,又进行了一次升级,这次升级导致了数据库引导程序出现错误,无法OPEN。数据库OPEN之前,由于Oracle无法得到数据,这里就存在一个读取数据文件到内存的问题。Oracle首先在内存中创建bootstrap$,然后从数据文件file1 block 377读取数据到内存中,完成第一次初始化。这个读取在9i10g中有所不同,9i有个1.417cache对象,这个对象在system表空间的数据块417上,通过它找到了block377也就是bootstrap$Oracle读取其内容,在内存中创建这个对象,接下来执行递归查询,由bootstrap$中提出所有创建语句,进而创建对象。当1.479前的所有对象都被读取后,Oracle才能正常打开数据库。因为数据库在创建后,进行过一次升级,所以,无法创建对象,引导程序失效,必须重新升级数据库。一般来说,见到bootstrap错误都是很严重的故障,bootstrap过程失败数据库肯定就无法打开。很多时候bootstrap$表损坏也会导致bootstrap失败。

以上一系列错误说明在升级的过程中出现问题,升级是不完全的,从而导致数据库无法bootstrap。因为我们只安装了软件升级包,而没有升级数据字典。

可以尝试从备份中恢复数据库,再次进行升级。

SQL>startup upgrade

SQL>@?/rdbms/admin/catupgrd.sql

SQL>@?/rdbms/admin/catalog.sql //创建数据字典视图

SQL>@?/rdbms/admin/catproc.sql//内置的packages

SQL>@?/rdbms/admin/utlrp.sql //编译失效对象

SQL>shutdown immediate

SQL>startup

Oracle 10g支持四种方法用以升级数据库:DBUAManual upgrade using SQL scripts and utilitiesExport and Import utilitiesCREATE TABLE AS SQL statement。只看前两种。

Database Upgrade Assistant

Manual Upgrade

1.     Back Up the Database                  备份数据库

关闭数据库后(包括所有服务),进行一次全备份

Sign on to RMAN:

rman "target / nocatalog"

Issue the following RMAN commands:

RUN

{

    ALLOCATE CHANNEL chan_name TYPE DISK;

    BACKUP DATABASE FORMAT 'some_backup_directory%U' TAG before_upgrade;

    BACKUP CURRENT CONTROLFILE TO 'save_controlfile_location';

}

2.     Prepare the New Oracle Home             准备一个新的Oracle Home

a.     将旧的配置文件拷贝到新的Oracle home目录下,参数文件可以放到任何地方,虽然默认于Oracle_home/dbsUNIX)下,或Oracle_home(WINDOWS)下,唯一不允许放在原oracle_home下。

SPFILE中创建一个PFILE用于编辑初始化参数?

口令文件直接拷过去,WINDOWS下密码文件名称为database下的pwdsid.oraUNIX下密码文件名称为dbs下的orapwsid

b.     按下列步骤判断你的参数文件在新版Oracle Database 10g release

l   清除过时的初始化参数。过时的参数可能导致新Oracle数据库10g错误。同样,改变参数语法在新的Oracle数据库10g

Pre-Upgrade信息工具显示任何废弃的参数和过时的参数。不论你选择DBUA或是手动升级,都需要运行Pre-Upgrade Information工具进行升级前的检查,以确保系统和数据库符合升级条件。Pre-Upgrade Information Tool是一个sql脚本(utlu102i.sql),存放在10R2版本的$ORACLE_HOME/rdbms/admin目录下,执行步骤如下:

1> sqlplus “/as sysdba” 
    2> SQL>spool upgrade_check.log //
主要是看看输出,没什么深意
    3> SQL>@
/rdbms/admin/utlu102i.sql 
    4> SQL>spool off

                              在输出中会有warning,这些参数都是要调整的。

l   参数中不要存在相对路径

3.     Upgrade the Database                 升级数据库

l   Shut down the instance:

SQL> SHUTDOWN IMMEDIATE

针对WINDOWS操作系统,执行完上面语句后关闭OracleServiceSID服务:

C:\> NET STOP OracleServiceORCL

接下来删除服务

C:\> ORADIM -DELETE -SID ORCL

再重新创建服务

C:\> ORADIM -NEW -SID SID -INTPWD PASSWORD -MAXUSERS USERS

     -STARTMODE AUTO -PFILE ORACLE_HOME\DATABASE\INITSID.ORA

l   SQL> STARTUP UPGRADE

由于我是从10.110.4升级,所以可以直接执行

SQL> SPOOL upgrade.log

SQL> @catupgrd.sql

 //它能检测出哪些是必须执行的脚本,从它的自描述中我们得知,升级被分割成5个阶段,其中包括调用utlip.sql使PL/SQL对象失效,创建和改变数据字典

SQL> @utlu102s.sql

//显示升级结果

SQL> SPOOL OFF

//去看一下upgrade.log上记录的错误,确认哪些包和过程被成功编译了

SQL> SHUTDOWN IMMEDIATE

SQL> STARTUP

SQL> @olstrig.sql

//Oracle Label Security is in your database才执行

SQL> @utlrp.sql

//重新编译失效过程

SQL>SELECT count(*) FROM dba_objects WHERE status='INVALID';

SQL>SELECT distinct object_name FROM dba_objects WHERE status='INVALID';

//查看失效对象

4.     Troubleshoot the Upgrade            检测升级

l   SYSTEM and SYSAUX Tablespace遇如下错误,通常是表空间不足,设置SYSTEMSYSAUX表空间为AUTO EXTEND ON MAXSIZE UNLIMITED

                   ORA-01650 ORA-01651 ORA-01652 ORA-01653 ORA-01654 ORA-01655
Shared MemoryORA-04031错误,SGA可能小了。

l   Public Rollback Segment

If you are using rollback segments, then you need to have a single large (100 MB) PUBLIC rollback segment online while the upgrade scripts are being run. Smaller public rollback segments should be taken offline during the upgrade. Typically you will get the following error if your rollback segment size is insufficient: ORA-01562。回滚段太小了。

5.     Abandon the Upgrade                  放弃升级

If you completed the steps in "Back Up the Database" to back up your database, then the easiest way to abandon the upgrade is to restore that backup. Complete the following steps:

Log in to the system as the owner of the Oracle home directory of the previous release.

Sign on to RMAN:

rman "target / nocatalog"

Issue the following RMAN commands:

STARTUP NOMOUNT

RUN

{

         REPLICATE CONTROLFILE FROM 'save_controlfile_location';

  ALTER DATABASE MOUNT;

        RESTORE DATABASE FROM TAG before_upgrade

       ALTER DATABASE OPEN RESETLOGS;

}

在解决了升级数据库所带来的问题后,再来说说监听器的状态,一般动态注册的监听在数据库open前都是blocked,代表备用/不接受连接。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24355950/viewspace-677815/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24355950/viewspace-677815/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值