ORACLE主要由两部分组成:Instance和Database。Instance是指一组后台进程/线程和一块共享内存区域,而Database是指存储在磁盘上的一组物理文件。
ORACLE数据库的启动主要分3个步骤:
1、启动到nomount状态;
2、启动到mount状态;
3、启动到open状态。
下面分析一下启动的各个步骤:
一、启动到nomount状态
在启动的第一步,ORACLE会寻找到参数文件(pfile/spfile),根据参数设置,创建实例,分配内存,启动后台进程。在这一步,只需要一个参 数文件(不需要控制文件和数据文件)就可以启动实例(Instance)。(启动到nomount的命令:SQL>startup nomout)此时,查看alert_<SID>.log可以看到这一阶段的启动过程。
在ORACLE9I中,首选spile<SID>.ora,如果没有则选择spile.ora,如果没有则选择init<SID>.ora,如果没有则启动失败。
可以在SQL*PLUS中通过show parameter spfile命令来检查数据库是否使用了spfile文件,如果value不为NULL,则数据库使用了spfile文件。
在参数文件中,通常需要最少的参数是db_name,设置了这个参数以后,数据库实例就可以启动了。
可以使用下面命令来查看一些缺省路径:
show parameter background_dump(警报日志文件alert_<SID>.log的存放地点)
show parameter dump_dest
show parameter control_files
show parameter db_name
特例:在使用RMAN(Recovery Manager)时存在更为特殊的情况,Oracle允许在不存在参数文件的情况下启动一个实例,数据库的db_name会被缺省的命名为DUMMY。(在LINUX下,用$rman target / 来进入RMAN)
二、启动到mount状态
启动到nomount状态以后,Oracle就可以从参数文件中获取控制文件的位置信息。一般会有3个完全相同的控制文件,放在不同的物理硬盘上,避免因为介质故障而同时损坏3个控制文件。
在nomount状态下,可以用v$parameter视图获取控制文件信息,前面已经讲过。在数据库mount以后,可以查询v$controlfile视图获得关于控制文件的信息。(select * from v$controlfile)
在 mount过程中,会锁定控制文件,如果找不到控制文件,则会报错,此时可以查看警报日志。因为Oracle的3个控制文件完全相同,如果损失了1,2 个,可以复制完好的控制文件,更改为相应的名称,就可以启动数据库了,如果全部丢失了,那就只有恢复或者重建控制文件来打开数据库了。
启动 到mount状态,数据库必须具备的另一个重要文件是口令文件,该文件位于$ORACLE_HOME/dbs目录下,缺省的名字为 orapw<sid>。如果丢失了口令文件,在mount阶段就会出现错误。对于口令文件,Oracle缺省查找 orapw<sid>文件,如果该文件不存在,则继续查找orapw文件,如果两者都不存在,则数据库将会出现错误。如果口令文件丢失,通过 orapw工具可以重建,所以在通常的备份策略中可以不包含口令文件。
通常在Linux/UNIX平台下,在$ORACLE_HOME/dbs目录下,还会存在另外一个文件,该文件命名规则为lk<sid>,lk指lock,该文件在数据库启动时创建,用于操作系统对数据库的锁定。当数据库启动时获得锁定,数据库关闭时释放。
三、启动到open状态
由于控制文件中记录了数据库中数据文件,日志文件的位置信息、检查点信息等重要信息,所以在数据库的open阶段,Oracle可以根据控制文件中记录的这些信息找到这些文件,然后进行检查点及完整性检查。
在数据库open的过程中,Oracle进行的检查中包括以下两项:
第一次检查数据文件头中的检查点计数(Checkpoint cnt)是否和控制文件中的检查点计数(Checkpoint cnt)一致。以确定数据文件是来自同一版本,而不是从备份中恢复而来(因为Checkpoint cnt不会被冻结,会一直被修改)。
第二次检查数据文件头的开始SCN和控制文件中记录的该文件的结束SCN是否一致,如果控制文件中记录的结束SCN等于数据文件头的开始SCN,则不需要对那个文件进行恢复。
仅在open阶段,Oracle才尝试打开并锁定数据文件,如果丢失或出现问题,则会给出错误提示。这时就需要DBA的介入进行处理,根据不同情况进行相应的恢复。
!!!在数据库出现问题时,首先查看alert_<sid>.log!!!
在完成数据库验证以后,数据库处于一致的状态,还需要进行一系列的处理过程:将UNDO段在线等操作,然后数据库可以提供访问,同时SMON可以开始进行事务回滚等。
在每次数据库的启动过程中,Oracle都需要判断控制文件中记录的字符集和数据库中的字符集是否相符,如果相符,则记录一条日志,如果不相符合,则以数据库中的字符集为准更新控制文件中的字符集记录。