2009年1月31日星期六

oracle数据库的启动

oracle数据库的启动主要包含3个步骤:
1、启动数据库到nomount状态
2、启动数据库到mount状态
3、启动数据库到open状态
一、启动数据库到nomount状态
在启动的第一步骤,oracle首先寻找参数文件(pfile或spfile),然后根据参数文件中的设置,创建实例,分配内存,启动后台进程。只要有了一个参数文件,就可以根据这个参数文件启动实例。在这一步骤中,不需要任何控制文件或数据文件的参与。
在创建数据库时,如果在这一步骤出现了问题,通常可能是系统配置(内核参数等)存在问题,我们需要检查是否分配了足够的系统资源等。
注:oracle选择参数文件的顺序:1、spfile$oracle_sid.ora;2、spfile.ora;3、init$oracle_sid.ora;(以10g为例,具体版本可能不同)
在启动过程中,参数文件的位置是不能改变的。但是在UNIX或LINUX系统中,我们可以使用符号链接来进行重定位。
在参数文件中,至少需要确定db_name这个参数。设置了这个参数后,数据库实例就可以启动。
注:在使用RMAN(Recovery Manager)时,存在特殊的情况:oracle允许在不存在参数文件的情况下启动一个实例,此时数据库的db_name会被缺省命名为DUMMY。
在实例创建以后,oracle就可以逐步导航,完成数据库的加载、打开等工作。
二、启动数据库到mount状态
启动到nomount状态以后,oracle就可以从参数文件中获得控制文件的位置信息。oracle缺省会创建3个控制文件,这3个控制文件的内容完全一致,是oracle为了安全而采用的镜像手段。通常我们应该将3个控制文件放到不同的物理磁盘上,避免因为介质故障而同时损坏3个控制文件。我们可以在参数文件中修改控制文件的存储路径。
在mount数据库的过程中,oracle需要找到控制文件并锁定控制文件,如果控制文件丢失,会报错。
因为oracle的3个(缺省的)控制文件内容完全相同,如果只丢失了其中1~2个,可以复制完好的控制文件,更改为相应的名称,就可以启动数据库;如果丢失了所有的控制文件,那么就需要恢复或重建控制文件来打开数据库。
启动到mount状态,数据库还必须具有的另一个重要的文件:口令文件。这个文件位于$oracle_home/dbs目录下,缺省的名称为orapw$sid。
口令文件中存放sysdba/sysoper用户的用户名及口令。
在数据库没有启动前,数据库内建用户是无法通过数据库本身来验证身份的(必须启动了数据库以后才可以验证数据库内建用户)。通过口令文件,oracle可以实现对用户的身份认证,在数据库未启动之前登录,进而启动数据库。
oracle缺省查找orapw$sid文件,如果该文件不存在,则继续查找orapw文件,如果两者均不存在,则数据库将会出现错误。
如果口令文件丢失,通过orapwd工具即可重建,所以在通常的备份策略中可以不必包含口令文件。
通常在UNIX/linux平台下,$oracle_home/dbs目录下,还会存在另一个文件,该文件的命名规则为lk$sid,lk指的是lock,该文件在数据库启动时创建,用于操作系统对数据库的锁定。当数据库启动时获得锁定,数据库关闭时释放。
有时候在系统异常时,可能数据库已经关闭,但是锁定并未释放,或者因为后台进程未正常停止等原因,会导致下次数据库无法启动。
三、启动数据库到open阶段
由于控制文件中记录了数据库中的数据文件、日志文件的位置信息、检查点信息等重要的信息,所以在数据库的open阶段,oracle可以根据控制文件中记录的这些信息找到这些文件,然后进行检查点及完整性检查。
如果不存在问题,就可以启动数据库,如果存在不一致或文件丢失则需要进行恢复。实际上在数据库open的过程中,oracle进行的检查中包括以下两项:
1、第一次检查数据文件头中的检查点计数(checkpoint cnt)是否和控制文件中的检查点计数(checkpoint cnt)一致。此步骤检查用以确认数据文件是来自同一版本,而不是从备份中恢复而来(因为checkpoint不会被冻结,会一直被修改。)
2、如果检查点计数检查通过,则数据库进行第二次检查。第二次检查数据文件头的开始SCN和控制文件中记录的该文件的结束SCN是否一致。如果控制文件中记录的结束SCN等于数据文件头的开始SCN,则不需要对那个文件进行恢复。
对每个数据文件都完成检查后,打开数据库,锁定数据文件,同时将每个数据文件的结束SCN设置为无穷大。
注:仅在open阶段,oracle才会尝试打开并锁定数据文件,如果丢失或出现问题,则会给出错误提示。
在数据库出现问题的时候,提示中给出的可能是不完整信息,二警报日志中则记录了完整的错误过程和错误号。所以当数据库出现故障时,应该优先检查alert_sid.log,从中发现关于故障的详细信息。
注:在启动日志中,可能会有这样一行:
database characterset is ZHS16GBK
在每次数据库的启动过程中,oarcle都需要判断控制文件中记录的字符集和数据库中的字符集是否相符。如果相符,则记录如上一行日志;如果不相符,则以数据库中的字符集为准更新控制文件中的字符集记录。