【体系结构】Oracle 11g实例和数据库关闭过程详解
实例和数据库关闭概览
通常情况下,当执行一些维护或其他管理任务时,将会关闭数据库,使其不可访问。可以使用SQL*Plus的shutdown命令,或者OEM来进行数据库的关闭。下图展示了实例和数据库的关闭顺序:
说明:
- 关闭数据库:数据库处于mounted状态,但是在线数据文件和在线重做日志文件被关闭;
- 卸载数据库:实例处于started状态,但是不再与数据库的控制文件相关联;
- 数据库实例关闭:数据库实例不再处于started状态,即实例关闭。
注:在实例故障或者shutdown abort时,Oracle数据库不会进行上面的这些过程,它会立即终止实例。
关闭模式
下图总结了不同的关闭模式对应的数据库行为:
SHUTDOWN语句如下:
- Shutdown abort
该模式用于紧急情况,例如不能用其它模式关闭,该模式的关闭最快。但是,由于必须执行实例恢复以使数据文件保持一致,因此该数据库的后续打开可能要花费更长时间;
- Shutdown immediate
该模式的关闭速度仅次于shutdown abort,Oracle数据库终止任何正在执行的SQL语句并断开用户连接,活动的事务被终止,未提交的更改被回滚;
- Shutdown transaction
该模式防止用户启动新的事务,但在关闭之前需要等待所有当前事务完成,根据当前事务的特点,该模式可能花费很长时间;
- Shutdown normal
该模式是关闭的默认模式,数据库在关闭之前等待所有连接的用户断开连接。
如何关闭数据库?
数据库的关闭操作隐含在数据库关闭(shutdown)中,该操作取决于数据库是正常关闭还是异常关闭。
1、正常关闭期间,数据库如何关闭?
当数据库以除abort之外的任何选项关闭时,Oracle数据库将SGA中的数据写入数据文件和在线重做日志文件,接下来,数据库关闭在线数据文件和在线重做日志文件。离线表空间的任何离线数据文件已经关闭,当数据库重新打开时,离线的表空间仍然处于离线状态。
在这个阶段,数据库是关闭的,无法进行正常操作,数据库关闭后,控制文件仍然是打开的。
2、异常关闭期间,数据库如何关闭?
如果shutdown abort或者异常终止发生,则处于打开状态的数据库的实例关闭并立即关闭数据库。Oracle数据库不会将SGA的缓冲区的数据写入到数据文件和重做日志文件,随后重新打开数据库时需要进行实例恢复,Oracle数据库会自动执行该操作。
如何卸载数据库?
数据库关闭后,Oracle数据库卸载数据库,将其与实例分离。在数据库卸载后,Oracle数据库关闭数据库的控制文件,此时,实例仍然留在内存中。
如何关闭实例?
数据库关闭的最后一步是关闭实例,当数据库实例关闭时,SGA将从内存移除,后台进程被终止。
注:在非正常情况下,实例可能不会被干净的关闭。内存结构可能不会从内存中移除,或者某个后台进程可能不会被终止。当先前实例的残留内存或进程存在时,随后的实例启动可能会失败,在这种情况下,需要强制新实例启动,或者通过在SQL*Plus或使用OEM中执行shutdown abort语句。