ITPub博客

首页 > Linux操作系统 > Linux操作系统 > RESTRICT、QUIESCE和SUSPEND(三)

RESTRICT、QUIESCE和SUSPEND(三)

原创 Linux操作系统 作者:yangtingkun 时间:2009-04-24 21:44:55 0 删除 编辑

数据库的这三种状态有相似之处,这里简单总结一下。

这一篇介绍SYSPEND状态。

RESTRICTQUIESCESUSPEND(一): http://yangtingkun.itpub.net/post/468/483100

RESTRICTQUIESCESUSPEND(二):http://yangtingkun.itpub.net/post/468/483165

 

 

RESTRICT限制的是没有RESTRICTED SESSION权限的用户,使得这些用户无法登陆数据库。而QUIESCE针对所有的非SYSSYSTEM用户,禁止这个用户的任何新的操作,包括登陆、查询、DML等等。和RESTRICTQUIESCE不同的是,SUSPEND主要是限制数据库IO操作的。而且SUSPEND限制的不仅仅是普通用户,而是数据库中任何的用户。

SQL> alter system suspend;

系统已更改。

在另一个终端上执行:

SQL> SET SQLP 'SQL2> '
SQL2> conn test/test
已连接。
SQL2> conn / as sysdba
已连接。
SQL2> select * from dual;

DU
--
X

SQL2> conn test/test
已连接。
SQL2> select * from dual;

DU
--
X

SQL2> select count(*) from t;

由于数据库已经运行了一段时间,很多数据都在缓存之中,因此无论是DBA用户,还是普通用户,都可以正常登陆,且都可以执行查询操作,只要结果可以在CACHE中找到,不引起物理IO,就不会被阻塞,直到查询引发了物理IO操作,导致会话被挂起。

SQL> alter system resume;

系统已更改。

直到执行了RESUME命令,被挂起的操作恢复执行:


  COUNT(*)
----------
     54020

SQL2> select * from session_roles;

ROLE
------------------------------------------------------------
CONNECT
RESOURCE

下面再次将数据库置于SUSPEND状态:

SQL> alter system suspend;

系统已更改。

执行刚才被阻塞的SQLSELECT COUNT(*) FROM T

SQL2> select count(*) from t;

  COUNT(*)
----------
     54020

SQL2> delete t;

由于CACHE缓存的作用,这次查询T表所有的IO都是逻辑IO,不会导致物理IO的产生,因此上一次被阻塞的操作,这次可以顺利执行,不过随后的DELETE操作由于要产生物理IO,因此被阻塞了。

SQL> alter system resume;

系统已更改。

执行RESUME后,DELETE操作完成:


已删除54020行。

SQL2> select sid from v$mystat where rownum = 1;

       SID
----------
       155

查询V$SESSION_WAIT的信息,并将数据库再次置于SYSPEND状态:

SQL> select event from v$session_wait where sid = 155;

EVENT
--------------------------------------------------------------------------------
SQL*Net message from client

SQL> alter system suspend;

系统已更改。

在会话2执行ROLLBACK操作:

SQL2> rollback;

由于ROLLBACK会导致物理IO,会话被阻塞,下面回到会话1,检查会话2的等待事件:

SQL> select event from v$session_wait where sid = 155;

EVENT
--------------------------------------------------------------------------------
writes stopped by instance recovery or database suspension

这是写操作被阻塞时,会话的等待事件,这个事件的名称已经很清楚的说明了问题。

最后还是看看RAC环境下SUSPEND对不同实例的影响。

依旧是在一个三节点的RAC环境中进行测试,其中两个节点处于启动状态,另一个节点关闭。

随后在实例1上发出ALTER SYSTEM SUSPEN语句,检查这个操作对实例2是否生效,将实例3启动,检查这个限制新启动的实例3是否有效。

bash-2.03$ srvctl status db -d testrac
Instance testrac1 is running on node racnode1
Instance testrac2 is running on node racnode2
Instance testrac3 is running on node racnode3
bash-2.03$ srvctl stop inst -d testrac -i testrac3
bash-2.03$ srvctl status db -d testrac
Instance testrac1 is running on node racnode1
Instance testrac2 is running on node racnode2
Instance testrac3 is not running on node racnode3
bash-2.03$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on 星期五 2 20 19:17:04 2009

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options

SQL> alter system suspend;

系统已更改。

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
testrac1

现在检查实例2上是否也会产生禁止物理IO的产生:

SQL> conn test/test@testrac2
已连接。
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
testrac2

SQL> select * from tab;

显然实例2上的操作被阻塞了,现在启动实例3,看看实例3上是否也会阻塞物理IO操作:

SQL> host
$ srvctl start inst -d testrac -i testrac3

SVRCTL命令居然也被HANG住了,那么SUSPEND是否和QUIESCE一样,禁止没有启动的实例启动呢,通过sqlplus直接连接实例3

$ sqlplus /nolog

SQL*Plus: Release 10.2.0.3.0 - Production on 星期五 2 20 19:23:02 2009

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.

SQL> conn sys@testrac3 as sysdba
输入口令:
已连接。
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
testrac3

SQL> conn test/test@testrac3
ERROR:
ORA-01033: ORACLE initialization or shutdown in progress


警告: 您不再连接到 ORACLE

可以看到,数据库还没有完全被打开,就处于被阻塞状态了。

登陆实例3

SQL> conn sys@testrac3 as sysdba
输入口令:
已连接。
SQL> select instance_name, status, database_status from v$instance;

INSTANCE_NAME    STATUS       DATABASE_STATUS
---------------- ------------ -----------------
testrac3         STARTED      ACTIVE

SQL> conn sys@testrac1 as sysdba
输入口令:
已连接。
SQL> select instance_name, status, database_status from v$instance;

INSTANCE_NAME    STATUS       DATABASE_STATUS
---------------- ------------ -----------------
testrac1         OPEN         SUSPENDED

SQL> conn sys@testrac2 as sysdba
输入口令:
已连接。
SQL> select instance_name, status, database_status from v$instance;

INSTANCE_NAME    STATUS       DATABASE_STATUS
---------------- ------------ -----------------
testrac2         OPEN         SUSPENDED

显然SUSPEND对所有当前运行的RAC实例生效,而新启动的实例,数据库状态并非SUSPEND,而是ACTIVE,但是和文档描述不同的是,这个实例根本无法成功的启动,从这一点上将,SUSPEND还是会对整个数据库起作用的。

同样在实例1和实例2上,都可以执行RESUME命令,来恢复数据库状态:

SQL> conn sys@testrac2 as sysdba
输入口令:
已连接。
SQL> alter system resume;

系统已更改。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-591752/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10438750