时间会刺破青春表面的彩饰,会在美人的额上掘深沟浅槽;会吃掉稀世之珍!天生丽质,什么都逃不过他那横扫的镰刀。——莎士比亚
Oracle数据库由实例和数据库组成,回看Oracle体系结构,深思熟虑,可以在内心描绘出Oracle数据库的一个整体骨架,后续的所有基础都依托于此,在这副躯体快速运转,Oracle数据库的启动和关闭也是如此。
在外行人或者从表面看来,Oracle的数据库启动和关闭仅仅只需要敲打一条命令即可,数据库将在指令发出后,完成库的启动和关闭。但是,当深入了解,细酌内部流程,将会发现Oracle整个启动过程非常精妙和繁杂。学习Oralce的启动和关闭详细过程,将开启Oracle内部学习的一扇美妙大窗,逐步迈入知识大堂。
Oracle数据库启动和关闭步骤图:
一、启动数据库到nomount
Oracle数据库启动第一步,先去寻找参数文件(spfile或者pfile),然后根据参数文件参数设置,创建实例,分配内存,启动后台进程。
1.1,过程
[oracle@oracle11g ~]$ 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
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后,重新启动数据库需要很长时间
五、概述
数据库的启动和停止远远没有表面上看到的那么简单,其中包含的信息很多很多,喜欢专研的朋友可以通过相应事件和日志信息去查看内部详细流程。
喜欢的朋友可以扫描以下二维码进行关注,公众号将每天更新文章: