番外系列说明:该系列所有文章都将作为独立篇章进行知识点讲解,是对其他系列博文进行的补充说明,来自于博客园AskScuti

主题:关于数据库启动流程三个阶段

内容预览:本篇涉及数据库启动的三个阶段分别做了什么事及对应操作方式。

目录

1. 启动概述

2. 第一阶段

3. 第二阶段

4. 第三阶段

5. 汇总说明

1. 启动概述

  数据库启动从关闭到开启经历三个阶段:NOMOUNT、MOUNT和OPEN。每个阶段所能查看的动态性能视图也不一样,比如:在NOMOUNT阶段,可查询动态性能视图 v$instance,无法查询 v$database,因为后者里面的内容是在控制文件中查询的,而控制文件是在第二阶段才被加载。具体图例请参考官方文档11g Release 2 (11.2) Database Concepts:Overview of Instance and Database Startup

2. 第一阶段

数据库启动的第一阶段将加载参数文件,按照参数文件具体值进行创建SGA,并开启一系列后台进程。

将数据库启动到NOMOUNT阶段

SQL> startup nomount
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size    2232920 bytes
Variable Size   591400360 bytes
Database Buffers    234881024 bytes
Redo Buffers   2416640 bytes

我们来查下当前实例状态

SQL> select status from v$instance;

STATUS
------------------------
STARTED

在 NOMOUNT 状态显示为:STARTED状态,也就是加载参数文件的第一阶段状态

查看日志确定动作,节选日志片段

 Starting up:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options.
ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1
System name: Linux
Node name: henry
Release: 3.10.0-862.el7.x86_64
Version: #1 SMP Wed Mar 21 18:14:51 EDT 2018
Machine: x86_64
VM name: VMWare Version: 6
Using parameter settings in server-side spfile /u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfilePROD1.ora
System parameters with non-default values:
processes = 150
sessions = 247
memory_target = 796M
control_files = "/u01/app/oracle/oradata/PROD1/control01.ctl"
control_files = "/u01/app/oracle/oradata/PROD1/control02.ctl"
control_files = "/u01/app/oracle/oradata/PROD1/control03.ctl"
control_files = "/u01/app/oracle/oradata/PROD1/control04.ctl"
control_files = "/u01/app/oracle/oradata/PROD1/control05.ctl"
control_files = "/u01/app/oracle/oradata/PROD1/control06.ctl"
control_files = "/u01/app/oracle/oradata/PROD1/control07.ctl"
control_files = "/u01/app/oracle/oradata/PROD1/control08.ctl"
db_block_size = 8192
compatible = "11.2.0.0.0"
log_archive_dest_1 = "location=/u01/app/oracle/archive1"
db_recovery_file_dest = "/u01/app/oracle/fast_recovery_area"
db_recovery_file_dest_size= 4122M
undo_tablespace = "UNDOTBS1"
remote_login_passwordfile= "EXCLUSIVE"
db_domain = ""
dispatchers = "(PROTOCOL=TCP) (SERVICE=PROD1XDB)"
local_listener = "(ADDRESS=(PROTOCOL=tcp)(HOST=henry)(PORT=1566))"
local_listener = "(ADDRESS=(PROTOCOL=tcp)(HOST=henry)(PORT=1521))"
local_listener = "(ADDRESS=(PROTOCOL=tcp)(HOST=henry)(PORT=1234))"
job_queue_processes = 1000
audit_file_dest = "/u01/app/oracle/admin/PROD1/adump"
audit_trail = "DB"
db_name = "PROD1"
open_cursors = 300
diagnostic_dest = "/u01/app/oracle"
Wed May 22 10:21:56 2019
PMON started with pid=2, OS id=14957
Wed May 22 10:21:56 2019
PSP0 started with pid=3, OS id=14960
Wed May 22 10:21:57 2019
VKTM started with pid=4, OS id=14962 at elevated priority
VKTM running at (1)millisec precision with DBRM quantum (100)ms
Wed May 22 10:21:58 2019
GEN0 started with pid=5, OS id=14967
Wed May 22 10:21:58 2019
DIAG started with pid=6, OS id=14969
Wed May 22 10:21:58 2019
DBRM started with pid=7, OS id=14971
Wed May 22 10:21:58 2019
DIA0 started with pid=8, OS id=14973
Wed May 22 10:21:58 2019
MMAN started with pid=9, OS id=14975
Wed May 22 10:21:58 2019
DBW0 started with pid=10, OS id=14977
Wed May 22 10:21:58 2019
LGWR started with pid=11, OS id=14979
Wed May 22 10:21:58 2019
CKPT started with pid=12, OS id=14981
Wed May 22 10:21:58 2019
SMON started with pid=13, OS id=14983
Wed May 22 10:21:58 2019
RECO started with pid=14, OS id=14986
Wed May 22 10:21:58 2019
MMON started with pid=15, OS id=14988
Wed May 22 10:21:58 2019
MMNL started with pid=16, OS id=14990
starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...
starting up 1 shared server(s) ...
ORACLE_BASE from environment = /u01/app/oracle

alert_PROD1.log

可以看到,在第一阶段启动过程中有这么一句话:Using parameter settings in server-side spfile /u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfilePROD1.ora 。默认使用的是动态参数文件,就是按照这个动态参数文件里面的值开始开辟(创建)SGA内存区,包括但不限于整体SGA大小,数据库缓冲区大小,日志缓冲区大小等等。后面可以看到开启了一系列后台进程(这里有6个进程很重要:CKPT、SMON、PMON、DBWn、LGWR、ARCn,其中前5个是必须开启的,第6个是否启动是和当前数据库是否为归档模式有关,如果是归档模式,则启动,如果是非归档模式,则没有此进程)

系统命令查看后台进程

SQL> !ps -ef | grep ora_
oracle 16030 1 0 10:35 ? 00:00:00 ora_pmon_PROD1
oracle 16032 1 0 10:35 ? 00:00:00 ora_psp0_PROD1
oracle 16034 1 14 10:35 ? 00:00:04 ora_vktm_PROD1
oracle 16038 1 0 10:35 ? 00:00:00 ora_gen0_PROD1
oracle 16040 1 0 10:35 ? 00:00:00 ora_diag_PROD1
oracle 16042 1 0 10:35 ? 00:00:00 ora_dbrm_PROD1
oracle 16044 1 0 10:35 ? 00:00:00 ora_dia0_PROD1
oracle 16046 1 2 10:35 ? 00:00:00 ora_mman_PROD1
oracle 16048 1 0 10:35 ? 00:00:00 ora_dbw0_PROD1
oracle 16050 1 0 10:35 ? 00:00:00 ora_lgwr_PROD1
oracle 16052 1 0 10:35 ? 00:00:00 ora_ckpt_PROD1
oracle 16054 1 0 10:35 ? 00:00:00 ora_smon_PROD1
oracle 16056 1 0 10:35 ? 00:00:00 ora_reco_PROD1
oracle 16058 1 3 10:35 ? 00:00:01 ora_mmon_PROD1
oracle 16060 1 0 10:35 ? 00:00:00 ora_mmnl_PROD1
oracle 16062 1 0 10:35 ? 00:00:00 ora_d000_PROD1
oracle 16064 1 0 10:35 ? 00:00:00 ora_s000_PROD1
oracle 16131 1 0 10:35 ? 00:00:00 ora_arc0_PROD1
oracle 16134 1 7 10:35 ? 00:00:01 ora_arc1_PROD1
oracle 16136 1 0 10:35 ? 00:00:00 ora_arc2_PROD1
oracle 16138 1 0 10:35 ? 00:00:00 ora_arc3_PROD1
oracle 16143 1 0 10:35 ? 00:00:00 ora_qmnc_PROD1
oracle 16161 1 2 10:35 ? 00:00:00 ora_cjq0_PROD1
oracle 16166 1 5 10:35 ? 00:00:00 ora_j000_PROD1
oracle 16168 1 2 10:35 ? 00:00:00 ora_j001_PROD1
oracle 16170 1 0 10:35 ? 00:00:00 ora_j002_PROD1
oracle 16173 1 1 10:35 ? 00:00:00 ora_q000_PROD1
oracle 16176 1 0 10:35 ? 00:00:00 ora_q001_PROD1
oracle 16186 14851 0 10:35 pts/1 00:00:00 /bin/bash -c ps -ef | grep ora_
oracle 16188 16186 0 10:35 pts/1 00:00:00 grep ora_

其中,归档模式下,ARCH进程默认开启4个,可通过修改参数 log_archive_max_processes 最多可以开启30个,查看官方文档11g Release 2 (11.2) Database Administrator's Guide:Adjusting the Number of Archiver Processes

3. 第二阶段

数据库启动的第二阶段将加载控制文件,为打开数据文件和日志文件做准备。

将数据库更改到MOUNT状态

SQL> alter database mount;

Database altered.

查看日志片段,可看到在控制文件里面记录了当前数据库的DBID(唯一ID,类似于身份证号),有了这个,就确定了接下来要打开哪个数据库了。

alter database mount
Wed May 22 11:09:49 2019
Successful mount of redo thread 1, with mount id 2230329145
Database mounted in Exclusive Mode
Lost write protection disabled
Completed: alter database mount

数据库在MOUNT阶段后,就可以查询 v$database 数据字典了,刚才说过,它里面的东西都是从控制文件中查出来的。

SQL> select open_mode from v$database;

OPEN_MODE
-------------------------------------
MOUNTED

也可以查询数据文件、日志文件等,因为这些动态性能视图查的都是控制文件里面的内容。

SQL> select name from v$datafile;

NAME
--------------------------------------------------
/u01/app/oracle/oradata/PROD1/system01.dbf
/u01/app/oracle/oradata/PROD1/sysaux01.dbf
/u01/app/oracle/oradata/PROD1/undotbs01.dbf
/u01/app/oracle/oradata/PROD1/users01.dbf
/u01/app/oracle/oradata/PROD1/example01.dbf
/u01/app/oracle/oradata/PROD1/abc01.dbf
/u01/app/oracle/oradata/PROD1/abcd01.dbf
/u01/app/oracle/oradata/PROD1/tbs_c01.dbf
/u01/app/oracle/oradata/PROD1/aaa01.dbf
/u01/app/oracle/oradata/PROD1/aaa02.dbf 10 rows selected.

但是无法查询数据文件里面的具体内容,因为数据文件还没有被加载,数据库还没有被打开。

4. 第三阶段

将数据库开启

SQL> alter database open;

Database altered.

因为控制文件里面指定了数据文件、在线日志文件等具体路径,因此在OPEN阶段为数据库运行做最后检查确认并打开所有文件。至此,数据库完成启动。

SQL> select ename,sal from scott.emp;

ENAME      SAL
---------- -----
SMITH 800
ALLEN 1600
WARD 1250
JONES 2975
MARTIN 1250
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
ADAMS 1100
JAMES 950
FORD 3000
MILLER 1300 14 rows selected.

5. 汇总说明

对于初学者,数据库分步启动命令常与启动命令选项搞混淆。

你可以把数据库启动到NOMOUNT状态,仅加载参数文件:前提是数据库处于关闭状态

SQL> startup nomount
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size    2232920 bytes
Variable Size   591400360 bytes
Database Buffers    234881024 bytes
Redo Buffers   2416640 bytes

你也可以把数据库直接启动到MOUNT状态,加载参数文件和控制文件:前提是数据库处于关闭状态

SQL> startup mount
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size    2232920 bytes
Variable Size   591400360 bytes
Database Buffers    234881024 bytes
Redo Buffers  2416640 bytes
Database mounted.

你也可以直接把数据库启动到OPEN状态,加载参数文件和控制文件,并打开其他所有文件:前提是数据库处于关闭状态

SQL> startup
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size    2232920 bytes
Variable Size   591400360 bytes
Database Buffers    234881024 bytes
Redo Buffers   2416640 bytes
Database mounted.
Database opened.

请注意:

如果处于NOMOUNT状态,之后要打开数据库,可以先将状态更改为MOUNT然后再将状态更改为OPEN,就是不能跨阶段

SQL> startup nomount
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size    2232920 bytes
Variable Size   591400360 bytes
Database Buffers    234881024 bytes
Redo Buffers   2416640 bytes
SQL> alter database mount; Database altered. SQL> alter database open; Database altered.

也可以在NOMOUNT状态,将数据库关闭,然后直接STARTUP。

SQL> startup nomount
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size    2232920 bytes
Variable Size   591400360 bytes
Database Buffers    234881024 bytes
Redo Buffers   2416640 bytes
SQL> shutdown immediate
ORA-01507: database not mounted ORACLE instance shut down.
SQL> startup
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size    2232920 bytes
Variable Size   591400360 bytes
Database Buffers    234881024 bytes
Redo Buffers   2416640 bytes
Database mounted.
Database opened.

如果处于MOUNT状态,打开数据库需要用ALTER语句。

SQL> select status from v$instance;

STATUS
------------------------
MOUNTED SQL> alter database open; Database altered.

或者直接关闭数据库,发出STARTUP命令启动。

最后,老手常用的 startup force 命令,初学者的你请慎用!因为你不知道这个命令是在何时且在什么场景下才能使用,实验测试环境可以随便。这个命令包含两个动作:shutdown abort 和 startup 。

SQL> startup force;
ORACLE instance started. Total System Global Area 830930944 bytes
Fixed Size   2232920 bytes
Variable Size   591400360 bytes
Database Buffers    234881024 bytes
Redo Buffers   2416640 bytes
Database mounted.
Database opened.

查看日志片段

Wed May 22 11:54:00 2019
Shutting down instance (abort)

License high water mark = 3
USER (ospid: 23787): terminating the instance
Instance terminated by USER, pid = 23787
Wed May 22 11:54:01 2019
Instance shutdown complete

注意shutdown abort,它比较特殊,属于非一致性关闭,类似于服务器突然断电。生产库中使用这个命令,是很有可能丢失数据的,因为日志来不及写。shutdown abort 属于数据库关闭四种模式中的其中一种,在数据库关闭的四种模式博文中进行介绍。

番外:你真的了解 Oracle 的启动流程吗?的更多相关文章

  1. Oracle数据库启动流程

    1.oracle也可以通过命令的方式启动, (1)oracle启动流程-windows下 1) lsnrctl start (启动监听) 2)oradim -startup -sid 数据库实例名 2 ...

  2. oracle数据库启动流程及登录认证方式详解

    转自:https://www.2cto.com/database/201803/726644.html ■  oracle启动流程-windows下 1) lsnrctl start  (启动监听) ...

  3. 番外:Oracle 中关于 Control File 的备份说明

    番外系列说明:该系列所有文章都将作为独立篇章进行知识点讲解,是对其他系列博文进行的补充说明,来自于博客园AskScuti. 主题:关于 Control File 控制文件备份的说明 内容预览:本篇涉及 ...

  4. 渗透测试思路 - CTF(番外篇)

    渗透测试思路 ​ Another:影子 (主要记录一下平时渗透的一些小流程和一些小经验) CTF(番外篇) ​ 笔者是一个WEB狗,更多的是做一些WEB类型题目,只能怪笔者太菜,哭~~ 前言 ​ 本篇 ...

  5. 可视化(番外篇)——在Eclipse RCP中玩转OpenGL

    最近在看有关Eclipse RCP方面的东西,鉴于Gephi是使用opengl作为绘图引擎,所以,萌生了在Eclipse RCP下添加画布,使用opengl绘图的想法,网上有博文详细介绍这方面的内容, ...

  6. 可视化(番外篇)——SWT总结

    本篇主要介绍如何在SWT下构建一个应用,如何安装SWT Designer并破解已进行SWT的可视化编程,Display以及Shell为何物.有何用,SWT中的常用组件.面板容器以及事件模型等. 1.可 ...

  7. 番外特别篇之 为什么我不建议你直接使用UIImage传值?--从一个诡异的相册九图连读崩溃bug谈起

    关于"番外特别篇" 所谓"番外特别篇",就是系列文章更新期间内,随机插入的一篇文章.目前我正在更新的系列文章是 实现iOS图片等资源文件的热更新化.但是,这两天 ...

  8. python的类和对象——番外篇(类的静态字段)

    什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...

  9. 番外篇 之 C#委托

    对于上一节 番外篇之C#多线程的反思 反思一:   Thread th = new Thread(参数); ////参数的总结 ////首先,第一情况,对于 Thread th = new Threa ...

随机推荐

  1. The Ether 靶场

    0x01 首先对靶场进行端口扫描 发现只开启了80端口和22端口 0x02 目录扫描 访问了几个目录并没有什么发现 0x03 访问主页几个网站链接 发现了一个疑似文件包含的漏洞 0x04 抓包进行分析 ...

  2. 如何修改Tomcat运行时jvm编码

    问题: 最近在部署项目的时候出现数据乱码的情况,经过一番查看项目都是用的UTF-8编码格式,数据也是,但是经过调用接口传给对方就乱码了. 由于是部署在Windows环境下,Windows默认编码GBK ...

  3. 谷歌BBR拥塞算法内核更新

    为什么想到这个呢,算法什么的又不太懂,这是 因为搭建VPN + BBR 与之简直绝配 有的人搭建SSR ,配一个什么锐速,还需要降内核版本, 而且还容易出错,降了之后更加容易出现兼容性问题,所以偶尔看 ...

  4. php压缩文件zip格式并打包(单个或多个文件压缩)

    最近接到一个需求,就是选择多个文件下载时,不要一个一个下载,直接把多个文件打包成一个文件进行下载.我们项目是前后端分离,所以我写了个接口,让前端传参数,后台下载. 废话不多说,直接上代码: 先是压缩单 ...

  5. 搭建wordpress博客

    环境说明 操作系统: CentOS 7.2 64位 1. 准备LAMP环境 LNMP 是 Linux.Nginx.MySQL 和 PHP 的缩写,是 WordPress 博客系统依赖的基础运行环境.我 ...

  6. Android中创建一个BroadcastReceiver

    首先创建一个java类继承BroadcastReceiver类 package com.example.service; import android.content.BroadcastReceive ...

  7. 初识Socket通讯编程(一)

    一.什么是socket? 当两台计算机需要通信的时候,往往我们使用的都是TCP去实现的,但是并不会直接去操作TCP协议,通常是通过Socket进行tcp通信.Socket是操作系统提供给开发者的一个接 ...

  8. c#---params参数

    写一个方法,求一个同学的总成绩 static void Main(string[] args) { , , }; Test("张三", n); Console.ReadKey(); ...

  9. 学习R语言的一点小心得

    1.目前R 语言处于入门阶段吧,能够执行一些简单的模型了,还是有收获的. 但是在跑模型的时候经常遇到各种各样的错误,最常见的错误就是数据带入模型之后,数据的类型不对,因此模型跑不下去,因此说,利用he ...

  10. 【新人赛】阿里云恶意程序检测 -- 实践记录11.10 - XGBoost学习 / 代码阅读、调参经验总结

    XGBoost学习: 集成学习将多个弱学习器结合起来,优势互补,可以达到强学习器的效果.要想得到最好的集成效果,这些弱学习器应当"好而不同". 根据个体学习器的生成方法,集成学习方 ...