Oracle Lab – 数据库启动的3个阶段
1. 实验说明
Oracle数据库启动是分为三个不同的阶段的,分别为nomount、mount和open。在不同的阶段,Oracle进行不同的行为,执行不同的操作。
本篇实验从Alert_log,分析数据库启动的3个阶段数据库实例的背后行为。
alert_SID.log是Oracle数据库运行阶段的运行日志。在Oracle工作时,会将所有会影响到整体性能的操作、变化和错误信息记录在一个日志中,就是Alert_log。在Oracle11g中,提供了文本文件和XML格式文件两种日志格式。
2. 环境准备
[oracle@oracle11g~]# ps -ef | grep ora //当前后台没有与Oracle相关的进程;
[oracle@oracle11g~]env | grep ORACLE//启动所必需使用的环境变量;
ORACLE_SID=wilson
ORACLE_BASE=/u01
ORACLE_HOME=/u01/oracle
[oracle@oracle11g~]
3. 启动阶段操作
3.1. nomount阶段
[oracle@oracle11g~]$ sqlplus /nolog
SQL*Plus: Release11.2.0.1.0 Production on Tue Apr 5 08:31:25 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn / as sysdba;
Connected to an idle instance. //当前实例未启动
SQL> startup nomount
ORACLE instance started.//实例启动,共享内容空间分配!
Total System Global Area 414298112 bytes
Fixed Size 1336904 bytes
Variable Size 310380984 bytes
Database Buffers 96468992 bytes
Redo Buffers 6111232 bytes
此时,观察后台进程情况:
[oracle@oracle11g~]$ ps -ef | grep ora
oracle 5594 1 0 08:32 ? 00:00:00 ora_pmon_wilson
oracle 5596 1 0 08:32 ? 00:00:00 ora_vktm_wilson
oracle 5600 1 0 08:32 ? 00:00:00 ora_gen0_wilson
oracle 5602 1 0 08:32 ? 00:00:00 ora_diag_wilson
oracle 5604 1 0 08:32 ? 00:00:00 ora_dbrm_wilson
oracle 5606 1 0 08:32 ? 00:00:00 ora_psp0_wilson
oracle 5608 1 0 08:32 ? 00:00:00 ora_dia0_wilson
oracle 5610 1 2 08:32 ? 00:00:00 ora_mman_wilson
oracle 5612 1 0 08:32 ? 00:00:00 ora_dbw0_wilson
oracle 5614 1 0 08:32 ? 00:00:00 ora_lgwr_wilson
oracle 5616 1 0 08:32 ? 00:00:00 ora_ckpt_wilson
oracle 5618 1 0 08:32 ? 00:00:00 ora_smon_wilson
oracle 5620 1 0 08:32 ? 00:00:00 ora_reco_wilson
oracle 5622 1 0 08:32 ? 00:00:00 ora_mmon_wilson
oracle 5624 1 0 08:32 ? 00:00:00 ora_mmnl_wilson
oracle 5626 1 0 08:32 ? 00:00:00 ora_d000_wilson
oracle 5628 1 0 08:32 ? 00:00:00 ora_s000_wilson
oracle 5630 1 0 08:32 ? 00:00:00 ora_s001_wilson
oracle 5632 5547 1 08:32 ? 00:00:00 oraclewilson (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
在nomount状态,虽然没有涉及到数据文件读取、控制文件读取等内容。但是最重要的数据库实例已经建立。核心后台进程PMON、DBWn、LGWr、SMON和CKPT已经建立,共享内存SGA区已经分配。
3.2. Mount状态
SQL> alter database mount;
Database altered.
3.3. Open状态
进入Open状态
SQL> alter database open;
Database altered.
SQL> select count(*) from scott.emp;
COUNT(*)
----------
14
4. 日志分析
根据系统参数可以获取到alert_log的路径,文件名默认为alert_
SQL> show parameter dump_dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest string /u01/diag/rdbms/hamster/hamster/
trace
core_dump_dest string /u01/diag/rdbms/hamster/hamster/
cdump
user_dump_dest string /u01/diag/rdbms/hamster/hamster/
trace
[oracle@oracle11g~]$ date
根据时间间隔进行整理日志,我们看到三个阶段数据库操作情况。
nomount阶段进行的主要是Oracle实例的构建,共享内存的开启,以及初始化参数的读取定位。下面为日志相关部分片段。
Starting ORACLE instance (normal)
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
Picked latch-free SCN scheme 2
Using LOG_ARCHIVE_DEST_1 parameter default value as USE_DB_RECOVERY_FILE_DEST
Autotune of undo retention is turned on.
IMODE=BR
ILAT =27
LICENSE_MAX_USERS = 0
SYS auditing is disabled
在本阶段,Oracle忙于进行如下阶段顺序操作。
- 根据环境变量,确定初始化参数文件位置。根据环境变量中对ORACLE_SID、ORACLE_HOME等的设置,确定要启动数据库在物理磁盘上的位置。根据Oracle的OFS结构,来确定使用参数文件可能的位置。根据spfile
.ora、spfile.ora、init .ora和init.ora的顺序来定位参数文件。 - 读取参数文件,确定基础的参数内容。通过读取参数文件,Oracle启动过程获取到该数据库的基本信息,包括控制文件位置、块大小、各种类型目录的具体位置、特殊表空间名称等内容。其中,对控制文件的定位,是进一步读取更多数据库信息,定位数据库文件的重要前置步骤;
mount阶段
alter database mount
Successful mount of redo thread 1, with mount id 38680
Database mounted in Exclusive Mode
Lost write protection disabled
Completed: alter database mount
mount阶段,Oracle主要进行的各类型文件(数据文件、日志文件)的定位寻找工作。通过在nomount阶段加载的控制文件信息,确定了当前系统的文件的具体位置已经SCN信息。在此阶段,可以进行数据恢复方面的一些工作。
Open阶段
alter database open
Beginning crash recovery of 1 threads
Started redo scan
Completed redo scan
read 188 KB redo, 15 data blocks need recovery
Started redo application at
Thread 1: logseq 8457, block 4216
Recovery of Online Redo Log: Thread 1 Group 3 Seq 87 Reading mem 0
Mem# 0: /u01/oradata/HAMSTER/onlinelog/o1_mf_2_5bsdfj_.log
Mem# 1: /u01/flash_recovery_area/HAMSTER/onlinelog/o1_mf_2_4bdfsfwv_.log
Completed redo application of 1167.33MB
Completed crash recovery at
Thread 1: logseq 856, block 73437, scn 324778
455832 data blocks read, 3421 data blocks written, 35467 redo k-bytes read
在进入Open阶段之后,Oracle进行了一系列的工作。
– 由于上次关闭数据库非正常关闭。Oracle会自动检查是否需要进行前滚、后滚的回复操作。此时,控制文件、日志文件以及各个数据文件上的检查点和SCN记录就是一个重要依据。在本段代码中,Oracle发现需要进行crash恢复,并且使用Group3、顺序号为56的重做日志进行恢复;
确定当前的Oracle Redo Log。进行Seq 56的恢复后,确定Seq57作为当前使用的Redo Log记录;
– 其他组件进程启动;