1. 确定问题
在开发或者维护Oracle数据库时,有时候会遇到启动不了的情况,这种情况十分烦人,需要我们去找出原因并且修复它才能使数据库正常运行。出现这种情况一般会给我们反馈一些错误信息,但是这些错误信息可能很难理解并且指引我们找到问题的根源所在。
所以在解决这种问题前,需要做以下几步:
确定问题
找到错误信息
识别数据库启动的过程
了解日志
2. 找到错误信息
确定问题后,我们需要找到错误信息,以此来定位问题。其实,Oracle的错误信息就是它的日志信息,它会记录在ORACLE_HOME目录下的log目录里面。它的日志分为两类,一类是alert日志,这个日志里面记录了数据库中的一些重要事件,比如说数据库启动和关闭事件、数据库备份恢复等事件;另外一个就是trace文件,它是为了排错而产生的日志文件。
如果你的Oracle数据库无法正常启动,那么在$ORACLE_HOME/diag/rdbms/
2.1 alert日志
在查看alert日志时,需要找到日志里面的错误信息。在日志里面查找的方法,一般是:首先找到改变的时间点,然后从这个时间点开始往前找报错信息。通过这种方法,就可以很快地找到报错信息了。
以下是一段alert日志中的错误信息:
Errors in file /u01/app/oracle/diag/rdbms/testdb/testdb/trace/testdb_lgwr_9381.trc:
ORA-00439: feature not enabled: Real Application Clusters
...
Process Startup failure, error stack:
ORA-00704: bootstrap process failure
ORA-39700: database must be opened with UPGRADE option
Process startup failed.
...
...
以上的日志中第四行是一个最重要的信息。它告诉我们ORA-00704: bootstrap process failure,这个表示Oracle的启动过程中出现了错误。我们可以在ORA-00704之前找到直接的原因。
2.2 trace文件
当你在alert日志中定位问题时,可能会发现alert日志中的错误信息无法详细说明问题,这时候你需要查看trace文件。trace文件是包含了更为详细的日志信息的文件,可以帮助我们更加深入地了解问题。它的位置在$ORACLE_HOME/diag/rdbms/
以下是一段trace文件的报错信息:
ORA-00448: normal completion of background process
ORA-00600: internal error code, arguments: [00000000000AEB00], [1], [0], [0], [1], [], [], [], [], [], [], []
LGWR (ospid: 2323): terminating the instance due to error 474
以上的trace文件报错信息告诉我们出现了ORA-00600的内部错误。对于这种类型的问题,需要查阅Oracle提供的文档。
3. 识别数据库启动的过程
当你查看上面的日志或者错误信息后,你可能会发现一系列的日志信息。这些信息可以描述Oracle的启动过程。下面,我将会介绍Oracle的启动过程:
3.1 Oracle的启动过程
在Oracle的启动过程中,需要依次执行以下的步骤:
执行SPOOL $ORACLE_HOME/startup.log以记录日志信息
判断数据库是否已经在运行了,如果已经在运行,那么就跳过以下所有步骤
启动ASM实例(如果是RAC的话)
初始化SMON
初始化DBWn等后台进程
初始化LGWR进程
初始化CKPT进程,并且检查redo日志的完整性
检查控制文件的完整性,并且清除数据库的SCN号
可以通过阅读日志了解数据库启动的过程
3.2 了解日志
我们在了解启动过程后,需要阅读日志信息。通过这个过程,可以了解数据库启动的状态。以下的是一份日志信息示例:
DATABASE MOUNTED
Completed: ALTER DATABASE OPEN
Sat Jan 24 05:01:15 2015
alter database enable block change tracking using file '/u01/app/oracle/oradata/db/block_change_tracking.dbf'
Completed: alter database enable block change tracking using file '/u01/app/oracle/oradata/db/block_change_tracking.dbf'
Sat Jan 24 05:02:05 2015
alter system enable restricted session
Completed: alter system enable restricted session
Sat Jan 24 05:02:05 2015
alter system set _system_trig_enabled=FALSE scope=both;
Completed: alter system set _system_trig_enabled=FALSE scope=both;
Sat Jan 24 05:04:21 2015
ALTER SYSTEM SET db_recovery_file_dest_size=1073741824 SCOPE=SPFILE;
Completed: ALTER SYSTEM SET db_recovery_file_dest_size=1073741824 SCOPE=SPFILE;
...
以上的日志可以看出,数据库已经处于打开状态。在这个过程中确保重要的信息已经全部完成了,包括了控制文件和数据文件的完整性检查等。在日志中查找跟数据库有关的错误信息。任何一个错误都会中断启动过程,使得数据库无法正确启动。
4. 解决问题
了解错误信息和启动过程之后,现在您就可以处理问题了。
4.1 先把所有的Oracle进程都关闭掉
在处理问题之前,您需要把所有的Oracle进程都关闭掉。
pgrep ora | xargs kill -9
4.2 重命名或删除控制文件,然后重启Oracle
有时候,我们可以重命名或者删除控制文件。在Oracle启动的时候,系统会从控制文件中读取数据库的配置信息,如果控制文件被占据或者破坏了,那么就会影响整个数据库的启动。重启Oracle的命令如下:
sqlplus "/ as sysdba"
SQL> STARTUP
4.3 通过修改pfile或spfile的方式解决
修改启动文件有时可以解决问题。Oracle启动时有两种配置文件,一种是pfile,一种是spfile。pfile是一个文本文件,主要用于人工编辑修改;而spfile是一个二进制文件,主要用于由Oracle自动生成,其优势在于可实现不停机修改数据库参数。
下面是通过修改pfile的方式解决Oracle启动的教程:
打开pfile文件。pfile文件默认存放在$ORACLE_HOME/dbs目录下面。
检查参数的值是否正确。如果修改了配置文件,请记得保存。
打开sqlplus,输入以下的命令:SQL> STARTUP PFILE=$ORACLE_HOME/dbs/init.ora
等待数据库起来并且检查控制文件是否已经恢复。
5. 总结
在使用Oracle的过程中,遇到无法启动的问题是非常常见的。一旦出现了这种情况,我们需要快速定位和解决问题,以便系统能够尽快恢复正常运行。为此,在解决问题之前,我们需要了解错误信息、掌握Oracle启动的过程、查看日志等方面的知识。