玩技术,Geeker
一个原创技术文章分享网站

Oracle学习笔记——数据库启动原理

很少关注的问题

Oracle数据库启动,你关注过么?说实话,我很少关注。数据库就在那里,不用你起,也能用;平时工作,也就是远程登陆主机,也没让我去启动数据库(资格不够)。但是,作为好奇的我,有强烈强迫症的我,还是决定将这个启动的过程,进行稍微的研究一下,多了解一点知识,也撑不死。毕竟常在河边走,说不定哪天让我去管理数据库呢,是吧;说不定哪天我就又成为了一个DBA了呢,是吧。梦想还是需要有的,接下来就看我们怎么去实现了。

启动三步走

对于我们熟悉的领域,当出现问题时,我们可以很有把握去搞定问题;当对于我们不熟悉的地方,我们就总是祈祷这里不要出现问题,但是对于这些事情来说,貌似都遵循一个法则,你希望不出问题的地方,往往越是会出现问题,对于Oracle的启动,我们都希望它能很顺利的启动起来,越是这样希望,它越容易出现问题,这个时候我们就会变的手忙脚乱。这就要求我们去了解Oracle的启动过程,及其原理。

Oracle的启动过程,从大的角度来说,分为以下三步:

  1. 启动实例;
  2. 装载数据库;
  3. 打开数据库。

就这三步,这三步之中有任何一步出现了问题,都会导致Oracle启动失败。

下面就来详细的说说启动数据库的这三步。

启动实例

首先,我们需要明白我们启动的这个实例,是个什么概念。

实例=内存+进程

内存:启动实例的时候,需要分配一块内存区域,叫做系统全局区;

进程:启动实例的时候,需要启动一系列的后台进程(至于有哪些,后面再说);

就是这块内存和这些后台进程组成了这个实例。

更直白的打个比方,数据库好比一个仓库,而实例就好比这个仓库的管理员,任何人要访问这个仓库,都需要经过这个仓库管理员这一关;所以说,实例实际上控制着数据库的访问。

启动实例是一个复杂的过程,这中间需要去读取配置文件,读取一些信息,比如内存开辟多大啊,这些信息是如何得到的呢?这就要说到《PFILE和SPFILE》了。Oracle就是根据PFILE和SPFILE文件中指定的一些参数进行启动实例的,而后续的很多参数都是从这两个文件中得到的。

我们可以在本地进行测试一下。打开SQLPLUS,以SYSDBA的身份登录,输入以下命令:

startup nomount

SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area  535662592 bytes
Fixed Size                  1375792 bytes
Variable Size             327156176 bytes
Database Buffers          201326592 bytes
Redo Buffers                5804032 bytes

我们可以看到实例已经启动了,系统SGA的大小等信息。

在实例启动完成以后,数据库还没有和实例关联,这个时候,数据库是不能被访问的。接下来就要说说装载。

装载数据库

装载数据库,顾名思义,就是把数据库文件和实例关联起来。如何关联呢?

  1. Oracle根据参数文件PFILE或者SPFILE中的参数找到控制文件;
  2. 打开控制文件;
  3. 从控制文件获得数据文件和重做日志文件的名字及位置;

做完以上三步,没有任何错误的情况下,这个时候Oracle就已经把实例和数据库关联起来了。但是,对于普通用户而言,这个时候数据库还是不可用的。只有等到经历了最后一步——打开数据库之后,才能使用数据库。

我们可以在本地进行测试一下。打开SQLPLUS,以SYSDBA的身份登录,输入以下命令:

startup mount

SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  535662592 bytes
Fixed Size                  1375792 bytes
Variable Size             327156176 bytes
Database Buffers          201326592 bytes
Redo Buffers                5804032 bytes
数据库装载完毕。

相比startup nomount而言,多了一句数据库装载完毕的提示。

打开数据库

打开数据库就表示Oracle打开数据库文件和重做日志文件。这时候,数据库可以使用,也就是说普通用户可以登陆数据库,并对数据库进行操作。

当我们执行startup命令时,也就包含了执行这三步,完成数据库的整个启动过程。显示以下完整信息:

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  535662592 bytes
Fixed Size                  1375792 bytes
Variable Size             327156176 bytes
Database Buffers          201326592 bytes
Redo Buffers                5804032 bytes
数据库装载完毕。
数据库已经打开。

自动启动

有的伙计在执行startup命令的时候,会提示以下错误信息:

ORA-01081: 无法启动已在运行的 ORACLE - 请首先关闭它

然后就蒙了,这是为什么?我明明没有启动实例,运行Oracle,为什么现在提醒我呢?这是Oracle的实例有一个自动启动和自动关系的概念。当你没有运行startup命令,但是Oracle却已经在运行了,这说明Oracle自动启动了。

对于Windows系统,可以在系统服务中找到命名格式为:OracleService+<SID_NAME>的服务器名,这个服务在启动的时候,会去注册表的以下位置读取一些重要信息:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

可以找到一个命名格式为ORA_<SID_NAME>_AUTOSTART的字段,该值被设置成了TRUE。这就意味着把数据库设置成了自动启动。

动手把该字段改成FALSE,然后重新启动OracleService+<SID_NAME>服务,再登陆数据库,看看效果。

自动关闭

说到自动启动,当然有自动关闭了,对应的字段命名格式为:ORA_<SID_NAME>_SHUTDOWN。意思基本和自动启动一样,不过多总结。

有时间了,把这些注册表中的值都可以看看,理解一下。

为什么要这三步?

现在问题来了,明明一步就可以把数据库启动起来,为什么要麻烦的分为3步呢?

你要知道,存在即合理;这样三步走的设计,对于普通用户来说是多余的,但是对于DBA来说,却是非常重要的;DBA可以在每步之后做一些事情,比如:

  1. 在实例启动完成以后,数据库还没有和实例关联,此时,数据库是不可访问的。DBA可以在这个阶段对数据库进行维护,比如重建控制文件;
  2. 在加载完成以后,数据库还不可以被访问,这个阶段,DBA可以进行恢复数据库等操作;
  3. 在完成打开数据库以后,一般的普通用户才能对数据库进行操作。

所以说,当数据库的管理与维护过程中,我们可以根据我们的需要将数据库启动到上述3步中的任意一步,完成数据库的维护工作。

看似简单分工的三步,但是每一步都有自己的工作去完成,这样的设计思路,对你今后的软件开发与设计,是否也有一定的启迪呢?

工欲善其事必先利其器

“工欲善其事必先利其器”,在实际生产中,Oracle基本都是部署在Unix平台上,你工作的工具基本都是和各种命令打交道,而熟练的掌握各种命令,是在众人面前展现你高大“逼格”的一种方式。接下来就将Oracle启动过程中常用的一些命令进行总结:

命令 含义
CONNECT sys AS SYSDBA 使用sys用户以SYSDBA的身份登录数据库
STARTUP NOMOUNT 启动数据库到NOMOUNT状态,也就是启动实例
STARTUP MOUNT 启动数据库到MOUNT状态,也就是加载数据库
ALTER DATABASE MOUNT 如果数据库处于NOMOUNT状态,直接从NOMOUNT状态切换至MOUNT状态
STARTUP 执行数据库的整个启动过程,包含了启动过程中的三步
ALTER DATABASE OPEN 如果数据库处于MOUNT状态,直接从MOUNT状态切换至OPEN状态

总结

这些理论知识总是很枯燥的,但是这又有什么办法呢?只有掌握了扎实的理论基础,才能在实践中更好的发挥,不是么?

2015年5月18日 于呼和浩特。

打赏

未经允许不得转载:果冻想 » Oracle学习笔记——数据库启动原理

分享到:更多 ()

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    我用的是Macbook Pro,想做Oracle数据库真机测试有点困难,虚拟机被排除,不知道博主有没有什么推荐的方式可以让我能够测试Oracle数据库?

    Pan.9个月前 (11-08)回复

在这里玩技术,享受技术带来的疯狂

捐赠名单关于果冻