ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle启动过程详解

oracle启动过程详解

原创 Linux操作系统 作者:yuanyongbin 时间:2011-12-06 22:05:40 0 删除 编辑

又打开eygle的书来看,发现比1年前看收获更多,也清晰很多了,从今天开始记下每个温习的知识点,自己学习的过程也与大家分享一下。
通常所说的Oracle Server主要由instance和database组成,instance指内存和一系列后台进程,database指具体的数据文件。数据库的启动跟这个两个重要组成部分有直接的关系,下面简单的介绍下:
数据库启动主要分3状态:
1,nomount状态
2,mount状态
3,open状态
下面主要介绍下这3个状态分别做了什么:
一、nomount状态
nomount的过程其实就是启动instance的过程,内存分配和后台进程的启动都是在nomount状态做的,如下:
SQL> startup nomount
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              83887696 bytes
Database Buffers          197132288 bytes
Redo Buffers                2973696 bytes


这时候可以查看内存设置
SQL> show parameter sga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 272M
sga_target                           big integer 272M

看下数据库后台进程是否已经启动
SQL> !ps -ef|grep oracle
root     10063 10025  0 Dec06 pts/0    00:00:00 su - oracle
oracle   10064 10063  0 Dec06 pts/0    00:00:00 -bash
oracle   11376 10064  0 02:32 pts/0    00:00:00 sqlplus   as sysdba
oracle   11380     1  0 02:32 ?        00:00:00 ora_pmon_orcl
oracle   11382     1  0 02:32 ?        00:00:00 ora_psp0_orcl
oracle   11384     1  0 02:32 ?        00:00:00 ora_mman_orcl
oracle   11387     1  0 02:32 ?        00:00:00 ora_dbw0_orcl
oracle   11389     1  0 02:32 ?        00:00:00 ora_lgwr_orcl
oracle   11391     1  0 02:32 ?        00:00:00 ora_ckpt_orcl
oracle   11393     1  0 02:32 ?        00:00:00 ora_smon_orcl
oracle   11395     1  0 02:32 ?        00:00:00 ora_reco_orcl
oracle   11397     1  0 02:32 ?        00:00:00 ora_cjq0_orcl
oracle   11399     1  0 02:32 ?        00:00:00 ora_mmon_orcl
oracle   11401     1  0 02:32 ?        00:00:00 ora_mmnl_orcl
oracle   11403     1  0 02:32 ?        00:00:00 ora_d000_orcl
oracle   11405     1  0 02:32 ?        00:00:00 ora_s000_orcl
可以看到,数据库启动到nomount状态后,内存已经分配了,后台进程也已经启动了。

这个状态的启动是应用参数文件,数据库在参数文件方面出的错也很多。
简单的说下参数文件,数据库启动过程中会去选择对应的参数文件读取配置初始化数据库相关参数,参数文件的选择也是有顺序的,顺序是:
1,spfile.ora
2,spfile.ora
3,init.ora
当找不到这3个文件中的任何一个的时候,会报找不到参数文件的错,如下:
现将两个参数文件移走
[oracle@LOCALHOST dbs]$ ls
hc_orcl.dat  initdw.ora  init.ora  lkORCL  orapworcl  spfileorcl.ora
[oracle@LOCALHOST dbs]$
[oracle@LOCALHOST dbs]$ mv spfileorcl.ora spfileorcl.ora_bak
[oracle@LOCALHOST dbs]$ mv init.ora init.ora_bak
[oracle@LOCALHOST dbs]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Dec 7 02:43:54 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup nomount
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/oracle/ora10/product/dbs/initorcl.ora'
这里报的错就是上面第3点说的参数文件,最后一个文件找不到,就不能启动数据库!

二、mount状态
数据库启动到mount状态的过程,是从参数文件中找到对应的控制文件的位置,读取控制文件中的数据库文件的位置,判断数据文件的存在性
<1> 控制文件
下面是从参数文件中找到的控制文件的位置信息:
*.control_files='/oracle/ora10/oradata/orcl/control01.ctl','/oracle/ora10/oradata/orcl/control02.ctl','/oracle/ora10/oradata/orcl/control03.ctl'
启动到mount的过程,就是通过这个找到对应的控制文件的,当然启动到nomount状态后在数据库也是能查询到控制文件的具体位置的:
SQL> show parameter control

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
control_file_record_keep_time        integer                           7
control_files                        string                            /oracle/ora10/oradata/orcl/con
                                                                                    trol01.ctl, /oracle/ora10/orad
                                                                                    ata/orcl/control02.ctl, /oracl
                                                                                    e/ora10/oradata/orcl/control03
                                                                                   .ctl
与参数文件中的信息是一致的。控制文件一定要保存好,最好是存放在不同是磁盘,这样某个控制文件坏了,还可以直接拷贝复用。
<2> 数据文件的存在性判断
通过控制文件,可以得到数据库所有相关的数据文件
看下控制文件中怎么记录数据文件的,在mount状态下backup控制文件,可以得到建控制文件的语句:
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/oracle/ora10/oradata/orcl/redo01.log'  SIZE 50M,
  GROUP 2 '/oracle/ora10/oradata/orcl/redo02.log'  SIZE 50M,
  GROUP 3 '/oracle/ora10/oradata/orcl/redo03.log'  SIZE 50M
-- STANDBY LOGFILE
DATAFILE
  '/oracle/ora10/oradata/orcl/system01.dbf',
  '/oracle/ora10/oradata/orcl/undotbs01.dbf',
  '/oracle/ora10/oradata/orcl/sysaux01.dbf',
  '/oracle/ora10/oradata/orcl/users01.dbf'
这里有4个数据文件,只有这4个文件都存在,数据库才能启动到mount状态,否则会报数据文件不存在。

三、open状态
数据库在open阶段,会根据控制文件中记录的数据文件位置找到数据文件,对这些文件进行一致性检查,如果没有问题则open数据库,如果有问题则需要进行恢复操作,有些恢复数据库直接通过日志就能完成恢复,有些大问题数据库自己恢复不了,就需要人工参与诊断了,比如很多600错误。
一致性校验主要包括两个部分:
1,检查数据文件头中的Checkpoint CNT和控制文件中的Checkpoint CNT是否一致,如果相等,则进行第2步检查
2,检查数据文件头中的开始SCN和控制文件中的结束SCN是否一致
如果上面两步检查都没问题,则open数据库,下面简单的转储下文件说明下:
转储控制文件:
SQL> alter session set events 'immediate trace name CONTROLF level 8';

Session altered.
选取datafile 1来看下:
DATA FILE #1:
  (name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
 tablespace 0, index=1 krfil=1 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:42 scn: 0x0000.0006d6f4 12/07/2011 02:32:09
 Stop scn: 0x0000.0006d6f4 12/07/2011 02:32:09
 Creation Checkpointed at scn:  0x0000.00000005 04/11/2011 21:45:10
 thread:1 rba:(0x1.3.10)
这里有Checkpoint cnt(42)和scn(0x0000.0006d6f4)

---------------------------------------------************************************************-------------------------------------------------
转储数据文件头:
SQL> alter session set events 'immediate trace name file_hdrs level 10';

Session altered.
同样选取datafile 1来看下:
DATA FILE #1:
  (name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
 tablespace 0, index=1 krfil=1 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:42 scn: 0x0000.0006d6f4 12/07/2011 02:32:09
 Stop scn: 0x0000.0006d6f4 12/07/2011 02:32:09
 Creation Checkpointed at scn:  0x0000.00000005 04/11/2011 21:45:10
 thread:1 rba:(0x1.3.10)
这里有Checkpoint cnt(42)和scn(0x0000.0006d6f4)
---------------------------------------------************************************************-------------------------------------------------
上面虚线内的这部分信息,我之前的理解有错,用这个信息与控制文件中的数据文件信息进行比较是没有意义的,因为这部分信息是来自于控制文件,怎么比都是一样的!!!

不通过转储的方法,可以这么获取数据文件的信息
SQL> select name,CHECKPOINT_CHANGE#,CHECKPOINT_COUNT from v$datafile_hearder where FILE#=1;

NAME                                                                                   CHECKPOINT_CHANGE#,                      CHECKPOINT_COUNT
---------------------------------------------------------------          ---------------------------------------------           ------------------------------------
/oracle/ora10/oradata/orcl/system01.dbf                      448244                                                         42

看上面的数据比较,Checkpoint cnt和scn都是相同的,一致性检查通过,数据库能顺利open。
这里stop scn和scn一样,等数据库open后,stop scn会被置为无穷大,这点比较好理解。
SQL> alter database open;

Database altered.
SQL> alter session set events 'immediate trace name file_hdrs level 10';

Session altered.
看下这时转储出来的数据文件头:
DATA FILE #1:
  (name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
 tablespace 0, index=1 krfil=1 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:43 scn: 0x0000.0006d6f5 12/07/2011 03:27:33
 Stop scn: 0xffff.ffffffff 12/07/2011 02:32:09
 Creation Checkpointed at scn:  0x0000.00000005 04/11/2011 21:45:10
 thread:1 rba:(0x1.3.10)
可以看到stop scn被置为无穷大了

 

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

请登录后发表评论 登录
全部评论

注册时间:2011-11-21

  • 博文量
    15
  • 访问量
    26655