Oracle Database 实例关闭和启动 浅谈

实例和数据库启动

如下图所示,为数据库从上一次完全关闭到启动的几个状态。


数据库启动的时候会经历一下三个状态:

1、     开启实例(nomount)

实例启动,但是没有关联数据库。

开启实例的时候,会执行下列几个步骤:

l  在默认位置查找参数文件。查找参数文件的时候会在$ORACLE_HOME/dbs目录下查找目标pfile或者spfile,顺序如下:

spfile$SID.oraàinit$SID.oraàinit.ora

pfile和spfile也可以存在于任何地方。因为可以在启动的时候指定pfile的位置,而spfile的位置可以在pfile文件中定义。例如/tmp/pfile.ora文件的内容:

SPFILE='/tmp/spfile.ora'

 

idle>startup nomount pfile='/tmp/pfile.ora' ;

ORACLEinstance started.

 

Total SystemGlobal Area  409194496 bytes

FixedSize                  2144904 bytes

VariableSize             343934328 bytes

DatabaseBuffers           54525952 bytes

RedoBuffers                8589312 bytes

idle> showparameter spfile

 

NAME                                 TYPE        VALUE

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

spfile                               string      /tmp/spfile.ora

●读取参数文件中的参数值。

● 根据参数文件的值,分配SGA。

● 开启Oracle后台进程。

● 打开alert日志以及tracefiles,并且将所有显式指定的参数值写到alert中。

2、挂载数据库(mount)

实例已经开启,并且通过读取数据文件关联了一个数据库。数据库为关闭状态,还无法被正常使用。

mount状态所做的操作:通过CONTROL_FILES参数找到控制文件,并且打开它们(多路复用的时候)。读取数据文件以及online redo logfiles的位置。

在这个状态下,数据库只能由管理员访问。附录一为与mount状态相关的CLUSTER_DATABASE参数说明。

3、打开数据库(open)

实例已经开启,并且关联了一个打开的数据库。包含在数据文件中的数据可以被授权用户使用。

打开数据库的时候,通常情况下会做如下的操作:

●打开在线数据文件(除了undotablespace)。如果tablespace 在上一次database shutdown之前offline了,那么这个tablespace以及相关的data file 会在重新打开数据库的时候offline。

●获取一个undotablespace,如果多个undo tablespace 存在,那么初始化参数undo_tablespace 会确定使用哪个undo tablespace。如果没有指定,那么会使用第一个可用的undo tablespace。

●打开在线重做日志

实例和数据库关闭

如下图所示,为数据库关闭所经历的几个状态:


1、关闭数据库

数据库还是挂载状态,但是数据文件以及redologfiles已经关闭。

数据库close操作在数据库关闭中(shutdown操作)是隐式。这个状态的所做的操作本质上依赖于数据库关机时正常还是异常。分为以下两种情况:

●数据库正常关机的时候(非异常关机,并且没有使用shutdown abort命令),数据库将SGA中的数据写到数据文件以及redo logfiles中,然后关闭在线的数据文件以及redo logfiles。在这个状态下数据库被关闭,并且无法做常用的操作。控制文件还是打开的状态。

●数据库异常关闭的时候(shutdownabort或者异常关机),数据库并没有将SGA中的数据写到磁盘上面,而是直接关闭了数据库以及实例,所以在数据库重新开启的时候会自动执行实例恢复。

2、数据库卸载

数据库实例还是启动状态,但是已经不再关联数据库。

数据库关闭以后,会卸载数据库,使实例不再关联数据库,并且关闭了控制文件。但是实例还是残留在内存中。

3、实例关闭

数据库实例不再是启动状态。

数据库shutdown最后一个步骤就是关闭实例,关闭实例的时候会将SGA移出内存,并且终止后台进程。

在极少数的情况下实例可能没有完全关闭,内存结构残留或者后台进程没有被关闭,后面的实例可能没有办法被正常开启。在这种状态下,可以强制开启实例,移除上一次残留的实例,或者使用shutdown abort命令,或者使用em工具。

附录二为四种shutdown模式的说明

附录

一、  CLUSTER_DATABASE参数说明

设置oracle数据库的参数CLUSTER_DATABASE参数为true能够让数据库被多个instance挂载。CLUSTER_DATABASE参数设置可以分为下列2种情况:

●第一个 instance 挂载时数据库参数设置为false,那么不允许其他的实例重复挂载。

●第一个 instance 挂载时数据库参数设置为true,其他的instance参数文件中当设置为true时候可以挂载该数据库。

二、  shutdown四种模式说明

如下图所示为shutdown模式的各种行为说明:



●shutdown abort

这个操作适用于紧急情况,比如说其他的shutdown操作没有办法被执行成功。不用说,这个模式是最快的,但是当下次开启数据库的时候需要更多的时间,因为数据库要执行实例恢复。

●shutdown immediate

这个模式是最常用的,数据库会终止所有正在执行的sql语句并且断开用户的连接。正在执行的事务(没有被提交的),会被回滚。

●shutdown transactional

这个模式下,数据库会阻止新的事务开始,但是会等待所有正在执行中的事务完成。这个模式是非常有意义的。但是如果你的应用程序开发人员没有事务的概念,那就惨了。

●normal

这是默认的shutdown模式,它会等待所有的用户连接断开。

三、  实例的生命周期

官方文档说明:

The instance can mount a database onlyonce, close it only

once, and open it only once. After adatabasehas been closed or shut down, you must

start a different instance to mount andopen this database.

数据库实例只能挂载一次,关闭一次,打开一次。数据库曾经被打开过,并且被关闭,想要挂载和打开数据库,必须启动另外一个新的实例。

操作

说明

idle> startup

ORACLE instance started.

 

Total System Global Area  409194496 bytes

Fixed Size                  2144904 bytes

Variable Size             343934328 bytes

Database Buffers           54525952 bytes

Redo Buffers                8589312 bytes

Database mounted.

Database opened.

这个操作创建了一个实例,并且挂载、打开了一个数据库。

sys@FAKE> alter database close ;

 

Database altered.

 

sys@FAKE> select status from v$instance ;

 

STATUS

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

MOUNTED

这个操作关闭了数据库,将实例至于mount状态。也就是说实例还是关联着数据库fake,控制文件还是打开状态。

sys@FAKE> alter database open ;

alter database open

*

ERROR at line 1:

ORA-16196: database has been previously opened and closed

sys@FAKE> !oerr ora 16196

16196, 00000, "database has been previously opened and closed"

// *Cause:  The instance has already opened and closed the database,

//          which is allowed only once in its lifetime.

// *Action: Shut down the instance.

已经open过并且close的实例,虽然是在mount状态,但是无法再次open数据库,因为它的整个生命周期中只能open和close一次数据库。所以只能关闭这个实例并且开启另外一个实例

sys@FAKE> shutdown immediate

ORA-01109: database not open

 

 

Database dismounted.

ORACLE instance shut down.

sys@FAKE>

这个操作会卸载关联的数据库并且关闭这个实例,结束它的生命周期。

sys@FAKE> startup

ORACLE instance started.

 

Total System Global Area  409194496 bytes

Fixed Size                  2144904 bytes

Variable Size             343934328 bytes

Database Buffers           54525952 bytes

Redo Buffers                8589312 bytes

Database mounted.

Database opened.

再次开启一个实例。

四、  实例启动和关闭相关操作

●startup nomount

●startup mount

●alter database mount

●alter database open

●startup

●alter database close

●alter database dismount

●shutdown

你可能感兴趣的:(Oracle)