如下图所示,为数据库从上一次完全关闭到启动的几个状态。
数据库启动的时候会经历一下三个状态:
实例启动,但是没有关联数据库。
开启实例的时候,会执行下列几个步骤:
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中。
实例已经开启,并且通过读取数据文件关联了一个数据库。数据库为关闭状态,还无法被正常使用。
mount状态所做的操作:通过CONTROL_FILES参数找到控制文件,并且打开它们(多路复用的时候)。读取数据文件以及online redo logfiles的位置。
在这个状态下,数据库只能由管理员访问。附录一为与mount状态相关的CLUSTER_DATABASE参数说明。
实例已经开启,并且关联了一个打开的数据库。包含在数据文件中的数据可以被授权用户使用。
打开数据库的时候,通常情况下会做如下的操作:
●打开在线数据文件(除了undotablespace)。如果tablespace 在上一次database shutdown之前offline了,那么这个tablespace以及相关的data file 会在重新打开数据库的时候offline。
●获取一个undotablespace,如果多个undo tablespace 存在,那么初始化参数undo_tablespace 会确定使用哪个undo tablespace。如果没有指定,那么会使用第一个可用的undo tablespace。
●打开在线重做日志
如下图所示,为数据库关闭所经历的几个状态:
数据库还是挂载状态,但是数据文件以及redologfiles已经关闭。
数据库close操作在数据库关闭中(shutdown操作)是隐式。这个状态的所做的操作本质上依赖于数据库关机时正常还是异常。分为以下两种情况:
●数据库正常关机的时候(非异常关机,并且没有使用shutdown abort命令),数据库将SGA中的数据写到数据文件以及redo logfiles中,然后关闭在线的数据文件以及redo logfiles。在这个状态下数据库被关闭,并且无法做常用的操作。控制文件还是打开的状态。
●数据库异常关闭的时候(shutdownabort或者异常关机),数据库并没有将SGA中的数据写到磁盘上面,而是直接关闭了数据库以及实例,所以在数据库重新开启的时候会自动执行实例恢复。
数据库实例还是启动状态,但是已经不再关联数据库。
数据库关闭以后,会卸载数据库,使实例不再关联数据库,并且关闭了控制文件。但是实例还是残留在内存中。
数据库实例不再是启动状态。
数据库shutdown最后一个步骤就是关闭实例,关闭实例的时候会将SGA移出内存,并且终止后台进程。
在极少数的情况下实例可能没有完全关闭,内存结构残留或者后台进程没有被关闭,后面的实例可能没有办法被正常开启。在这种状态下,可以强制开启实例,移除上一次残留的实例,或者使用shutdown abort命令,或者使用em工具。
附录二为四种shutdown模式的说明
设置oracle数据库的参数CLUSTER_DATABASE参数为true能够让数据库被多个instance挂载。CLUSTER_DATABASE参数设置可以分为下列2种情况:
●第一个 instance 挂载时数据库参数设置为false,那么不允许其他的实例重复挂载。
●第一个 instance 挂载时数据库参数设置为true,其他的instance参数文件中当设置为true时候可以挂载该数据库。
如下图所示为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