Oracle 体系结构(10)—— Oracle 数据库的启动过程详解
Oracle 数据库的启动分为三个阶段:
shutdown —> nomount —> mount —> open
一、启动数据库到 nomount 阶段
数据库启动到 nomount 阶段时,将启动数据库实例, 读取参数文件,写审计文件和警报日志,不加载数据库。因此,数据库启动到 nomount 阶段需要有正确的参数文件,需要正确的审计目录(由参数 audit_file_dest 指定)和跟踪文件目录(由 BACKGROUND_DUMP_DEST 参数指定)。
数据库从关闭状态启动到 nomount 状态会执行如下操作:
(1)按如下顺序读取初始化参数文件:spfile<ORACLE_SID>.ora —> spfile.ora —> init<ORACLE_SID>.ora
(2)分配SGA、启动后台进程;
(3)启动警报日志文件(alert_<ORACLE_SID>.log)和跟踪文件。
在 nomount 阶段可以进行如下操作:
(1)可以修改参数;
(2)可以查看内存和后台进程的信息;
(3)可以创建数据库;
(4)可以重建控制文件。
启动数据库到 nomount 阶段的方法如下:
-- shutdown --> nomount
-- startup nomount
SQL> startup nomount
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2257840 bytes
Variable Size 603982928 bytes
Database Buffers 226492416 bytes
Redo Buffers 2371584 bytes
SQL> select status from v$instance;
STATUS
------------
STARTED
查看警告日志关于 startup nomount 的信息:
[oracle@rac1 trace]$ cat alert_orcl1.log
........
Starting up:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options.
ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1
System name: Linux
Node name: rac1
Release: 2.6.32-431.el6.x86_64
Version: #1 SMP Fri Nov 22 03:15:09 UTC 2013
Machine: x86_64
VM name: VMWare Version: 6
Using parameter settings in server-side pfile /u01/app/oracle/product/11.2.0/db_1/dbs/initorcl1.ora
System parameters with non-default values:
processes = 150
spfile = "+DATA/orcl/spfileorcl.ora"
memory_target = 800M
control_files = "+DATA/orcl/controlfile/control_file01.ctl"
control_files = "+BAK/orcl/controlfile/control_file02.ctl"
control_files = "+BAK/ctl_files/control_file03.ctl"
db_block_size = 8192
compatible = "11.2.0.4.0"
cluster_database = TRUE
db_create_file_dest = "+DATA"
db_recovery_file_dest = "+BAK"
db_recovery_file_dest_size= 4407M
thread = 1
undo_tablespace = "UNDOTBS1"
instance_number = 1
remote_login_passwordfile= "EXCLUSIVE"
db_domain = ""
dispatchers = "(PROTOCOL=TCP) (SERVICE=orclXDB)"
remote_listener = "rac-scan:1521"
audit_file_dest = "/u01/app/oracle/admin/orcl/adump"
audit_trail = "DB"
db_name = "orcl"
open_cursors = 300
diagnostic_dest = "/u01/app/oracle"
Cluster communication is configured to use the following interface(s) for this instance
169.254.44.235
.........
ALTER SYSTEM SET local_listener=' (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.101)(PORT=1521))' SCOPE=MEMORY SID='orcl1';
Sat Aug 07 01:07:21 2021
Decreasing number of real time LMS from 1 to 0
由于 nomount 状态下数据库没有加载,因此无法访问数据字典。nomount 状态下参数文件已经加载,可以查看参数。
-- 无法访问数据字典
SQL> select name from v$datafile;
select name from v$datafile
*
ERROR at line 1:
ORA-01507: database not mounted
-- 数据库参数已经加载
SQL> show parameter name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cell_offloadgroup_name string
db_file_name_convert string
db_name string orcl
db_unique_name string orcl
global_names boolean FALSE
instance_name string orcl1
lock_name_space string
log_file_name_convert string
processor_group_name string
service_names string orcl
二、启动数据库到 mount 阶段
数据库启动到 mount 阶段时,将启动数据库实例,加载控制文件的信息到内存,加载数据库并保持数据库关闭状态。数据库启动到 mount 阶段需要有正确的控制文件。
数据库从 nomount 状态启动到 mount 状态会执行如下操作:
(1)将先前启动的实例与数据库相关联;
(2)根据参数文件中保存的控制文件的位置找到控制文件并打开;
(3)从控制文件中读取数据文件及联机日志文件的位置与名称。(此时并不检查数据文件与联机日志文件是否存在)。
数据库启动到 mount 状态可以进行如下操作:
(1)可以备份、还原、恢复;
(2)可以查看所有的动态视图;
(3)可以移动数据库文件;
(4)可以进行数据库文件的 offline;
(5)可以打开和关闭归档模式;
(6)可以打开和关闭闪回数据库的功能。
启动数据库到 nomount 阶段的方法如下:
-- 数据库处于关闭状态(shutdown --> mount)
startup mount;
-- 数据库处于 nomount 状态(nomount --> mount)
alter database mount;
SQL> alter database mount;
Database altered.
SQL> select status from v$instance;
STATUS
------------
MOUNTED
数据库启动到 mount 阶段可以访问所有的动态视图:
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
+DATA/orcl/datafile/system.256.1070471889
+DATA/orcl/datafile/sysaux.257.1070471889
+DATA/orcl/datafile/undotbs1.258.1070471891
+DATA/orcl/datafile/users.259.1070471891
+DATA/orcl/datafile/undotbs2.264.1070472143
三、启动数据库到 open 阶段
数据库启动到 open 阶段时,将启动数据库实例,加载联机日志和数据文件并打开数据库。数据库启动到 open 阶段需要有正确的数据文件和联机日志文件。数据库处于 open 状态时可以对数据库进行所有正常的操作。
数据库从 mount 状态启动到 open 状态会执行如下操作:
(1)打开数据文件;
(2)打开联机日志文件(打开数据库时如果数据文件或联机日志文件中的任何一个不存在,会出现错误);
(3)Oracle 数据库验证数据文件和联机日志文件是否能够打开,并检验数据库的一致性。如果不一致,SMON 后台进程将启动实例恢复。
启动数据库到 open 阶段的方法如下:
-- 数据库处于关闭状态(shutdown --> open)
startup
-- 数据库处于 nomount 状态(nomount --> mount)
alter database mount;
alter database open;
-- 数据库处于 mount 状态(mount --> mount)
alter database open;
SQL> alter database open;
Database altered.
SQL> select status from v$instance;
STATUS
------------
OPEN
四、数据库的停止
停库与启动数据库顺序相反,也分三个步骤:(1)关闭数据库(关闭数据文件);(2)卸载数据库(关闭控制文件, DISMOUNT);(3)关闭 Oracle 实例(SHUTDOWN)。同时关闭的方式有四种:
1、正常停库
数据库正常的关闭方式,以正常停库方式关闭数据库,Oracle 将执行如下操作:
(1)阻止任何用户建立新的连接;
(2)等待查询结束;
(3)等待事务结束;
(4)产生检查点(数据同步);
(5)关闭联机日志和数据文件;
(6)关闭控制文件;
(7)关闭数据库实例。
正常停库的语法如下:
shutdown normal
shutdown
2、事务级停库
以事务级停库方式关闭数据库,Oracle 将执行如下操作:
(1)阻止任何用户建立新的连接;
(2)查询直接终止;
(3)等待事务结束;
(4)产生检查点(数据同步);
(5)关闭联机日志和数据文件;
(6)关闭控制文件;
(7)关闭数据库实例。
事务级停库的语法如下:
shutdown transactional
3、立即停库
以立即停库方式关闭数据库,Oracle 将执行如下操作:
(1)阻止任何用户建立新的连接;
(2)查询直接终止;
(3)中断当前事务,回滚未提交事务;
(4)产生检查点(数据同步);
(5)关闭联机日志和数据文件;
(6)关闭控制文件;
(7)关闭数据库实例。
立即停库的语法如下:
--生产库最常用的停库方式
shutdown immediate
4、强制停库
当数据库出现故障时,如果以上三种方式都无法正常关闭数据库,则使用强制停库。以这种方法停库,Oracle 将执行如下操作:
(1)强制结束当前正在执行的SQL语句;
(2)任何未递交的事务都不被回退!
以强制停库方式停止数据库之后,数据库可能存在脏数据。重启数据库实例时会自动做实例恢复。
立即停库的语法如下:
shutdown abort
startup force = shutdown abort + startup
startup force nomount = shutdown abort + startup nomount
startup force mount = shutdown abort + startup mount