Oracle的启动和停止

时间会刺破青春表面的彩饰,会在美人的额上掘深沟浅槽;会吃掉稀世之珍!天生丽质,什么都逃不过他那横扫的镰刀。——莎士比亚

Oracle数据库由实例和数据库组成,回看Oracle体系结构,深思熟虑,可以在内心描绘出Oracle数据库的一个整体骨架,后续的所有基础都依托于此,在这副躯体快速运转,Oracle数据库的启动和关闭也是如此。

在外行人或者从表面看来,Oracle的数据库启动和关闭仅仅只需要敲打一条命令即可,数据库将在指令发出后,完成库的启动和关闭。但是,当深入了解,细酌内部流程,将会发现Oracle整个启动过程非常精妙和繁杂。学习Oralce的启动和关闭详细过程,将开启Oracle内部学习的一扇美妙大窗,逐步迈入知识大堂。

Oracle数据库启动和关闭步骤图:

一、启动数据库到nomount

Oracle数据库启动第一步,先去寻找参数文件(spfile或者pfile),然后根据参数文件参数设置,创建实例,分配内存,启动后台进程。

1.1,过程

[[email protected] ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Thu Jan 11 18:49:59 2018

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

Connected to an idle instance.


SQL> startup nomount;

ORACLE instance started.


Total System Global Area  983449600 bytes

Fixed Size                  1340720 bytes

Variable Size             734005968 bytes

Database Buffers          243269632 bytes

Redo Buffers                4833280 bytes


在后台日志中,将记录启动到nomount过程的日志:

Thu Jan 11 18:54:03 2018

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 =167

LICENSE_MAX_USERS = 0

SYS auditing is disabled

Starting up:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options.

Using parameter settings in server-side spfile /oracle/app/oracle/db11g/product/dbs/spfileORCL.ora

System parameters with non-default values:

  processes                = 1000

  nls_language             = "SIMPLIFIED CHINESE"

  nls_territory            = "CHINA"

  memory_target            = 940M

  control_files            = "/oracle/app/data/ORCL/control01.ctl"

  control_files            = "/oracle/app/oracle/flash_recovery_area/ORCL/control02.ctl"

  db_block_size            = 8192

  compatible               = "11.2.0.0.0"

  db_files                 = 300

  db_recovery_file_dest    = "/oracle/app/oracle/flash_recovery_area"

  db_recovery_file_dest_size= 3400M

  undo_management          = "AUTO"

  undo_tablespace          = "UNDOTBS1"

  remote_login_passwordfile= "EXCLUSIVE"

  db_domain                = ""

  audit_file_dest          = "/oracle/app/oracle/admin/ORCL/adump"

  audit_trail              = "DB"

  db_name                  = "ORCL"

  open_cursors             = 300

  diagnostic_dest          = "/oracle/app/oracle"

Thu Jan 11 18:54:11 2018

PMON started with pid=2, OS id=3015 

Thu Jan 11 18:54:11 2018

VKTM started with pid=3, OS id=3017 at elevated priority

VKTM running at (10)millisec precision with DBRM quantum (100)ms

Thu Jan 11 18:54:11 2018

GEN0 started with pid=4, OS id=3021 

Thu Jan 11 18:54:11 2018

DIAG started with pid=5, OS id=3023 

Thu Jan 11 18:54:11 2018

DBRM started with pid=6, OS id=3025 

Thu Jan 11 18:54:11 2018

PSP0 started with pid=7, OS id=3028 

Thu Jan 11 18:54:11 2018

DIA0 started with pid=8, OS id=3030 

Thu Jan 11 18:54:11 2018

MMAN started with pid=9, OS id=3032 

Thu Jan 11 18:54:11 2018

DBW0 started with pid=10, OS id=3034 

Thu Jan 11 18:54:11 2018

LGWR started with pid=11, OS id=3036 

Thu Jan 11 18:54:11 2018

CKPT started with pid=12, OS id=3038 

Thu Jan 11 18:54:11 2018

SMON started with pid=13, OS id=3040 

Thu Jan 11 18:54:12 2018

RECO started with pid=14, OS id=3042 

Thu Jan 11 18:54:12 2018

MMON started with pid=15, OS id=3044 

Thu Jan 11 18:54:12 2018

MMNL started with pid=16, OS id=3046 

ORACLE_BASE from environment = /oracle/app/oracle

从日志中可以看到,数据库启动过程中,先启用基础参数,然后加载/oracle/app/oracle/db11g/product/dbs/spfileORCL.ora参数文件,然后启用参数文件里面配置信息,接着按照时间先后顺序启动后台进程:如PMON,VKTM等,后台进程我们在体系结构中有详细介绍。

1.2,参数文件

Oracle数据库nomount启动过程将会去寻找参数文件。从oracle 9i开始,spfile被引入数据库。启动过程中,oracle将首先去$ORACLE_HOME/dbs目录中寻找spfile<ORACLE_SID>.ora文件作为启动参数文件;如果该文件不存在,Oracle将选择spfile.ora文件;如果还是不存在,oracle将选择init<ORACLE_SID>.ora文件;如果三个文件都找不到,oracle将抛出错误:

a,正常情况

SQL> show parameter spfile;

NAME      TYPE                                              VALUE

---------  ----------------   -----------------------------------------------------------------------

spfile        string          /oracle/app/oracle/db11g/product/dbs/spfileORCL.ora

b,找不到文件:

SQL> startup nomount;

ORA-01078: failure in processing system parameters

LRM-00109: could not open parameter file '/oracle/app/oracle/db11g/product/dbs/initORCL.ora'

二,启动数据库到mount

实例启动到nomount后,oracle将根据参数文件中记录的控制文件信息去查找控制文件,然后根据控制文件记录的信息对数据文件进行存在性判断。

2.1,控制文件定位

查看参数文件信息,获取控制文件配置:

SQL> show parameter control_files;


NAME                TYPE        VALUE

------------------ ----------- ------------------------------

control_files      string   /oracle/app/data/ORCL/control01.ctl,/oracle/app/oracle/

                                     flash_recovery_area/ORCL/control02.ctl

控制文件相互镜像,丢失其中一个控制文件可以在数据库停止状况下进行拷贝另外一份进行克隆。但是如果控制文件全部丢失,数据库mount过程中将会报错:

SQL> alter database mount;

alter database mount

*

ERROR at line 1:

ORA-00205: error in identifying control file, check alert log for more info

后台日志报以下错误:


Thu Jan 11 19:42:36 2018

alter database mount

Thu Jan 11 19:42:36 2018

ORA-00210:cannot open the specified control file

ORA-00202: controlfile ''/oracle/app/oracle/flash_recovery_area/ORCL/control02.ctl''

ORA-27037:unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

2.2,数据文件定位

在oracle 9i及oracle 10g中,控制文件找到后,数据库将根据控制文件中记录的数据文件信息进行数据文件存在校验,如果数据文件不存在,数据库将报错。(oracle 11gR2中,即使数据文件不存在,日志文件中也不提示错误),以下为11g测试:


SQL> select name from v$datafile;

NAME

------------------------------------------------------------

/oracle/app/data/ORCL/system01.dbf

/oracle/app/data/ORCL/sysaux01.dbf

/oracle/app/data/ORCL/undotbs01.dbf

/oracle/app/data/ORCL/users01.dbf

/oracle/app/data/ORCL/DT_TPC_DAT.DBF

/oracle/app/data/ORCL/DT_CAT_DAT.DBF

/oracle/app/data/ORCL/DT_TEST_DAT.DBF


mv /oracle/app/data/ORCL/users01.dbf /oracle/app/data/ORCL/users01.dbf_bk


alter database mount

Thu Jan 11 19:52:18 2018

Successful mount of redo thread 1, with mount id 1492975342

Allocated 3981204 bytes in shared pool for flashback generation buffer

Starting background process RVWR

Thu Jan 11 19:52:18 2018

RVWR started with pid=18, OS id=6137 

Database mounted in Exclusive Mode

Lost write protection disabled

Completed: alter database mount

三、数据库open阶段

oracle数据库在控制文件中记录了数据库的状态和结构信息。在数据库open过程中,数据库将根据控制文件中记录的信息与数据文件中记录的信息进行比对,如果校验通过,数据库就可以正常打开,如果存在异常,数据库将无法打开。

3.1,一致性校验

首先检查数据文件头检查点计数(checkpoint cnt),确保控制文件和数据文件头中的一致。如果一致,说明数据文件来自同一版本。

其次检查数据文件头的开始SCN和控制文件中记录的该文件的结束SCN是否一致,如果控制文件中记录的结束 SCN 等于数据文件头的开始 SCN,则不需要对那个文件进行恢复(如果此前数据库异常崩溃,则结束 SCN 会保持在最大值(无穷大),数据库必须执行实例恢复以确保一致性)。

在两部分检查完成后,数据库将正式打开运行起来。

四、数据库停止过程

数据库停止过程和数据库打开过程相反。数据库停止有几种方式,每一种都对应不同的处理过程:

a、shutdown normal  

正常关闭数据库。不允许新的连接,等待会话结束,等待事务结束,做一个检查点并关闭数据文件。启动时不需要实例恢复。

b、shutdown transactional
不允许新的连接,不等待会话结束,等待事务结束,做一个检查点并关闭数据文件。启动时不需要实例恢复。  

c、shutdown immediate

立即方式关闭数据库。不允许新的连接,不等待会话结束,等待事务结束,做一个检查点并关闭数据文件。没有结束的事务自动回滚,启动时不需要实例恢复。

d、shutdown abort  
   直接关闭数据库,正在访问数据库的会话会被突然终止。如果数据库中有大量操作正在执行,这时执行shutdown abort后,重新启动数据库需要很长时间 

五、概述

数据库的启动和停止远远没有表面上看到的那么简单,其中包含的信息很多很多,喜欢专研的朋友可以通过相应事件和日志信息去查看内部详细流程。

​喜欢的朋友可以扫描以下二维码进行关注,公众号将每天更新文章: