
3.3 关闭数据库与实例
与数据库的启动相对应,关闭数据库时也是分步骤进行的。在关闭数据库与实例时,需要使用一个具有SYSDBA权限的用户账户连接Oracle,然后使用SHUTDOWN语句执行关闭操作。
3.3.1 数据库的关闭步骤
与启动数据库实例的3个步骤相同,关闭数据库与实例也可以分为3步:关闭数据、实例卸载数据库、最后终止实例。
当关闭数据库时,Oracle会将日志缓存中的重做日志记录到重做日志文件,并且将数据缓存中被修改的数据写入数据文件,然后再关闭所有的数据文件和重做日志文件。这时数据库的控制文件仍然处于打开状态,但是由于数据库已经处于关闭状态,用户也将无法访问数据库。
关闭数据库后,实例才能够卸载数据库。这时,数据库的控制文件已经被关闭,但是实例仍然存在。
最后是终止实例,实例所拥有的所有后台进程和服务进程都将被终止,内存中的SGA区被回收。
在SQL*Plus中可以使用SHUTDOWN语句关闭数据库,SHUTDOWN语句可以带有不同的子句,以控制数据库关闭的方式,其语法格式如下:
shutdown [normal | transactional | immediate | abort]
3.3.2 关闭方式
Oracle数据库的关闭方式包括正常关闭(NORMAL)、立即关闭(IMMEDIATE)、事物关闭(TRANSACTIONAL)和终止关闭(ABOPT)4种方式。
1. 正常关闭方式(NORMAL)
如果对关闭数据库的时间没有限制,通常会使用正常方式来关闭数据库。使用带有NORMAL子句的SHTUDOWN语句将以正常方式关闭数据库,下面显示了在SQL*Plus中以正常方式关闭的过程。
SQL> shutdown normal 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。
在以正常方式关闭数据库时,Oracle将执行如下操作。
※ 阻止任何用户建立新的连接。
※ 等待当前所有正在连接的用户主动断开连接,已经连接的用户能够继续当前的操作。
※ 一旦所有的用户都断开连接,则立即关闭、卸载数据库,并终止实例。
以正常方式关闭数据库时,Oracle并不会断开当前用户的连接,而是等待当前用户主动断开连接。因此,在使用SHUTDOWN NORMAL语句关闭数据库时,应该通知所有在线的用户尽快断开连接。
2. 立即关闭方式(IMMEDIATE)
立即关闭方式能够在尽可能短的时间内关闭数据库。以立即方式关闭数据库时,Oracle将执行如下操作。
※ 阻止任何用户建立新的连接,同时阻止当前连接的用户开始任何新的事务。
※ 任何未提交的事务均被回退。
※ Oracle不再等待用户主动断开连接,而是直接关闭、卸载数据库,并终止实例。
需要以立即方式关闭数据库时,只需要使用带IMMEDIATE子句的SHUTDOWN语句,例如:
SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。
在立即关闭方式下,Oracle不仅会立即中断当前用户的连接,而且会强行终止用户的当前事务,并将未完成的事务回退。与正常方式类似,以立即方式关闭数据库后,在下次启动数据库时不需要进行任何恢复操作。
提示:
如果存在太多的未提交事务,则立即方式仍然会耗费很长的时间。这时如果需要快速关闭数据库,可以使用SHUTDOWN ABORT语句。
3. 事务关闭方式(TRANSACTIONAL)
事务方式介于正常关闭方式与立即关闭方式之间,能够在尽可能短的时间内关闭数据库,同时能够保证当前所有的活动事务都可以被提交。使用事务方式关闭数据库时,Oracle将等待所有未提交的事务完成后,再关闭数据库。
使用带有TRANSACTIONAL子句的SHUTDOWN语句,将以事务方式关闭数据库,例如:
SQL> shutdown transactional 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。
事务方式关闭数据库时,Oracle将执行如下操作。
※ 阻止任何用户建立新的连接,同时阻止当前连接的用户开始任何新的事务。
※ 等待所有未提交的活动事务提交完毕,然后立即断开用户的连接。
※ 关闭、卸载数据库,并终止实例。
事务关闭方式既能保证用户不会丢失当前工作的信息,又可以尽可能快地关闭数据库。因此,事务关闭数据库方式也是最常用的数据库关闭方式。
4. 终止关闭方式(ABORT)
如果上述3种关闭方式都无法关闭数据库,说明数据库产生了严重的错误,这时只能使用终止方式来关闭数据库。终止关闭方式将丢失一部分数据信息,会对数据库的完整性造成损害。因此,当重新启动实例并打开数据库时,后台进程SMON会执行实例恢复操作。一般情况下,应当尽量避免使用这种方式来关闭数据库。
使用带有ABORT子句的SHUTDOWN语句可以以终止方式关闭数据库,例如:
SQL> shutdown abort ORACLE 例程已经关闭。
以终止方式关闭数据库时,Oracle将执行如下操作。
※ 阻止任何用户建立新的连接,同时阻止当前连接的用户开始任何新的事务。
※ 立即终止当前正在执行的SQL语句。
※ 任何未提交的事务均不被回退。
※ 立即断开所有用户的连接,关闭、卸载数据库,并终止实例。