Oracle数据库的静默状态和挂起状态

来源:互联网 发布:阿里云建梯子 编辑:程序博客网 时间:2024/05/16 01:53
 

静默状态和挂起状态是两种特殊的数据库状态。当数据库处于静默状态时,只有SYSSYSTEM用户能够在数据库中进行操作。当数据库处于挂起状态时,数据库IO操作都被暂时停止。利用这两种数据库状态,DBA能够完成一些特殊的管理和维护操作。 

1:静默状态(quiesced state) 

在静默状态下,只有具有DBA权限的用户能够在数据库中执行查询/更新操作,运行PL/SQL程序,任何非DBA用户都不能在数据库中执行任何操作.如果DBA在非静默状态下执行某些操作时,必须排队等待其他用户的活动,这类操作包括如下两类:

1.某些操作在执行过程,如果有其他用户访问操作的对象,该操作将会失败.比如,DBA正在为某个表添加一个新的字段时,如果有用户恰好正在使用这个表,添加字段的操作将失败.

2.某些操作在执行过程中产生的中间结果不应当被其他用户看到.比如,假设DBA要执行一项分为多个步骤的操作:首先导出一个表的数据,然后删除这个表,最后再重新导入数据建立新的表,以达到重建该表的目的.而如果有某个用户在删除表之后,重建表之前访问这个表,将会得到错误的结果.

如果没有静默功能,要保证成功完成上述类型的操作必须首先关闭数据库,然后再使用受限模式打开数据库.这样做的代价是很大的,尤其是在必须保证数据库不间断运行的环境中.而使用数据库进入静默状态可以快速达到相同的目的,但是却并不需要中断数据库的运行.处于静默状态时只允许SYSSYSTEM两个DBA操作操作,其他用户即使被授予DBA角色或SYSDBA权限也不能够在静默状态的数据库中进行操作.因此,静默状态是比受限状态更为"干净"的状态.

SQL> alter system quiesce restricted; 

执行上面的语句后,数据库将等待所有正在运行的非DBA用户会话主动终止,同时不再允许开始任何新的非DBA用户会话。当所有的非DBA用户的活动会话都被成功暂停后,alter system quiesce restricted语句执行完毕,这是数据库被认为处于静默状态。在静默状态中,即使某个非DBA用户试图执行一条SQL语句强行激活某个会话,该SQL语句也会挂起。当数据库从静默状态中恢复时,停止的会话将继续执行,前面被挂起的SQL语句也会继续执行。 

由于等待所有的非DBA用户会话都被终止可能会需要很长一段时间,在这个过程中如果执行alter system语句的会话被意外中止,进入静默状态的操作将被撤销,已经暂停的会话将被恢复。 

SQL> alter system unquiesce; 

执行上面的语句将从静默状态恢复为正常状态。从静默状态恢复后,所有被暂停的会话和挂起的SQL语句将自动继续执行。可以通过使用动态性能视图V$INSTANCE来查询当前数据库是否处于静默状态。V$INSTANCE.ACTIVE_STATUS字段显示了数据库当前的活动状态: 

NORMAL正常状态QUIESCING正在进入静默状态(仍然存在活动的非DBA用户会话) QUIESCED静默状态(已经没有活动的非DBA用户会话) 

备注:当数据库处于静默状态时,不能通过复制数据文件的方法来对数据库进行备份,因为静默状态中联机数据文件仍然处于读写状态。只能在数据库关闭状态或者挂起状态下才能对数据库物理文件进行复制操作。 

2:挂起状态 

SQL> ALTER SYSTEM SUSPEND;

上面的语句将数据库处于挂起状态,数据库所有的物理文件(控制文件/数据文件以及重做日志文件)的I/O操作都被暂停。这样能够保证数据库在没有任何I/O操作的情况下进行物理备份。挂起的状态与静默状态的区别是:它并不禁止非DBA用户的数据库操作,只是暂时停止所有用户的I/O操作。 

当数据库处于挂起状态时,可以首先为数据库创建磁盘镜像,然后再从镜像中分离出备份文件,这样就提供了一种进行数据库备份和恢复的替代方法。在数据库进入挂起状态时,当前所有的I/O操作能够继续进行,但是所有新提交的I/O不会执行,而是被放入一个等待队列中。一旦数据库恢复到正常状态,这些I/O操作将从队列中取出并继续执行。

可以通过使用动态性能视图V$INSTANCE来查询当前数据库是否处于挂起状态。V$INSTANCE.DATABASE_STATUS字段显示了数据库当前的活动状态: 

SUSPENDED挂起状态ACTIVED正常状态(非挂起状态) 

SQL> ALTER SYSTEM SUSPEND;

System altered

SQL> SELECT DATABASE_STATUS FROM V$INSTANCE;

DATABASE_STATUS

---------

SUSPENDED 

SQL> ALTER SYSTEM RESUME;

System altered

SQL> SELECT DATABASE_STATUS FROM V$INSTANCE;

DATABASE_STATUS

---------

ACTIVE

 

原创粉丝点击