資料庫的三種狀態RESTRICT、QUIESCE和SUSPEND

lhrbest發表於2017-05-23
資料庫的三種狀態RESTRICT、QUIESCE和SUSPEND





資料庫的這三種狀態有相似之處,這裡簡單總結一下。

這一篇介紹RESTRICT狀態。

 

 

Oracle中,有時候要執行一些管理性的操作,而這些操作執行的時候不能有其他使用者同時訪問資料庫。對於這種情況可以設定系統進入RESTRICTED SESSION狀態禁止普通使用者登陸資料庫。

資料庫可以在啟動的時候以RESTRICT方式來啟動資料庫:

SQL> conn / as sysdba
已連線。
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 
例程已經關閉。
SQL> startup restrict
ORACLE 
例程已經啟動。

Total System Global Area 5279498240 bytes
Fixed Size                  2094528 bytes
Variable Size            3192597056 bytes
Database Buffers         2080374784 bytes
Redo Buffers                4431872 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> conn test/test
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege


警告您不再連線到 ORACLE
SQL> conn / as sysdba
已連線。
SQL> select granted_role from dba_role_privs
  2  where grantee = 'TEST';

GRANTED_ROLE
------------------------------------------------------------
CONNECT
RESOURCE

SQL> grant dba to test;

授權成功。

SQL> conn test/test
已連線。
SQL> conn / as sysdba
已連線。
SQL> revoke dba from test;

撤銷成功。

SQL> grant restricted session to test;

授權成功。

SQL> conn test/test
已連線。

可以看到,當資料庫以RESTRICT狀態啟動,或者進入到RESTRICT狀態,則Oracle禁止普通使用者連線資料庫。

而擁有DBA角色的使用者,或者擁有RESTRICTED SESSION許可權的使用者可以登陸資料庫。

Oracle11g的管理員手冊文件中有一個地方的描述錯誤:

Further, when the instance is in restricted mode, a database administrator cannot access the instance remotely through an Oracle Net listener, but can only access the instance locally from the machine that the instance is running on.

根據文件的描述,如果資料庫處於RESTRICTED SESSION狀態,則禁止使用者採用NET服務方式登陸,而必須在伺服器上直接登陸,但是測試發現,Oracle並沒有這個限制。

SQL> conn / as sysdba
已連線。
SQL> alter system disable restricted session;

系統已更改。

SQL> conn test/test@test11g
已連線。
SQL> conn / as sysdba
已連線。
SQL> alter system enable restricted session;

系統已更改。

SQL> conn test/test@test11g
已連線。

無論是在本機透過服務名方式,還是在其他客戶端透過服務名方式都可以連線到RESTRICTED SESSION狀態的資料庫,只要登陸使用者擁有RESTRICTED SESSION許可權。

下面再來看看RESTRICTED SESSION狀態,對於已經登陸資料庫的普通使用者有何影響:

SQL> conn / as sysdba
已連線。
SQL> revoke restricted session from test;

撤銷成功。

SQL> alter system disable restricted session;

系統已更改。

在會話1,回收TEST使用者的RESTRICTED SESSION許可權,使其變為普通使用者。並將資料庫從RESTRICTED SESSION狀態轉為正常狀態。

下面在會話2TEST使用者登陸資料庫:

SQL> CONN TEST/test
已連線。
SQL> SET SQLP 'SQL2> '
SQL2> SELECT * FROM SESSION_PRIVS;

PRIVILEGE
--------------------------------------------------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

已選擇10行。

下面回到會話1,將資料庫置於RESTRICT SESSION狀態:

SQL> alter system enable restricted session;

系統已更改。

執行RESTRICTED SESSION命令很快就返回了,說明命令已經執行成功,下面嘗試普通使用者登陸:

SQL> conn test/test
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege


警告您不再連線到 ORACLE

登陸報錯,說明RESTRICT狀態已經生效,回到會話2,看看資料庫的RESTRICTED SESSION狀態對已經登陸的普通會話是否有影響:

SQL2> SELECT * FROM DUAL;

DU
--
X

SQL2> CREATE TABLE T1 (ID NUMBER);
CREATE TABLE T1 (ID NUMBER)
*
 1 行出現錯誤:
ORA-01536: 
超出表空間 'YANGTK' 的空間限額


SQL2> CREATE OR REPLACE PROCEDURE P AS
  2  BEGIN
  3  NULL;
  4  END;
  5  /

過程已建立。

雖然建表語句失敗了,但是這時由於剛才回收DBA角色,導致UNLIMITED TABLESPACE許可權被連帶回收造成的,與RESTRICTED SESSION的狀態無關。

可以看到,雖然資料庫處於RESTRICTED SESSION狀態,但是資料庫中已經登陸的會話可以繼續執行任何操作,直到會話斷開連線。

這個現象說明,如果希望資料庫處於RESTRICTED SESSION狀態,且此時不希望普通使用者登陸資料庫,那麼最好的方法是採用STARTUP RESTRICT的方式來啟動資料庫,這樣可以確保沒有普通使用者登陸。而ALTER SYSTEM ENABLE RESTRICTED SESSION的方式雖然可以使得資料庫進入RESTRICT狀態,但是不能保證現有的連線使用者都是具有RESTRICTED SESSION許可權的。即使是在STARTUP之後,馬上發出ENABLE RESTRICTED SESSION命令也是不可靠的,因為這個時間差可能使得後臺JOB執行了。因此如果是使用ENABLE RESTRINCTED SESSION方式,還需要在後臺透過ALTER SYSTEM KILL SESSION的方式清除掉所有的普通使用者連線。

最後來看看RESTRICTED SESSION狀態和RAC環境的關係。

RESTRICTED命令是在例項上執行的,因此Oracle是否將這個命令應用到整個RAC環境需要透過測試來說明。

為了更好的說明情況,下面的測試在一個三節點的RAC環境中進行,其中兩個節點處於啟動狀態,另一個節點關閉。

隨後在例項1上發出ALTER SYSTEM ENABLE RESTRICTED SESSION語句,檢查這個操作對例項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 test/test@testrac1

SQL*Plus: Release 10.2.0.3.0 - Production on 星期四 2 19 23:09:47 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> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
CREATE MATERIALIZED VIEW
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

已選擇14行。

SQL> select instance_name from v$instance;

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

將例項1變為RESTRICTED SESSION狀態:

SQL> conn sys@testrac1 as sysdba
輸入口令
已連線。
SQL> alter system enable restricted session;

系統已更改。

SQL> conn test/test@testrac1
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege


警告您不再連線到 ORACLE
SQL> conn test/test@testrac2
已連線。
SQL> select instance_name from v$instance;

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

顯然例項1上的設定與例項2無關,對於例項3而言其實都不用測試,因為資料庫啟動的時候沒有指定STARTUP RESTRICT,自然不會啟用RESTRICTED SESSION狀態,不過為了嚴謹,還是測試一下:

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

SQL> conn test/test@testrac1
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege


警告您不再連線到 ORACLE
SQL> conn test/test@testrac3
已連線。
SQL> select instance_name from v$instance;

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

SQL> select instance_name, status, logins from gv$instance;

INSTANCE_NAME    STATUS       LOGINS
---------------- ------------ ----------
testrac3         OPEN         ALLOWED
testrac2         OPEN         ALLOWED
testrac1         OPEN         RESTRICTED

對於RESTRICTED SESSION狀態,RAC環境的各個例項之間是相互獨立的,各自的狀態完全由各自的例項進行設定。



 

當資料庫處於QUIESCE狀態時,只有DBA會話可以進行操作,而普通會話會處於等待狀態,只有當資料庫退出QUIESCE狀態,普通會話才能繼續操作。

QUIESCE似乎和RESTRICT很相似,都是修改資料庫的狀態,使得DBA使用者可以進行管理操作,避免非DBA使用者同時訪問。但是二者還是有明顯的區別的。首先RESTRICT是禁止普通使用者登陸,而對已經登陸的使用者無能為力。如果要徹底禁止普通使用者的訪問,就必須透過重啟或者手工判斷已經連線的普通會話,並執行KILL SESSION的操作。而QUIESCE並不是這樣,透過設定系統的QUIESCE RESTRICTED,使得所有的非DBA使用者處於等待狀態,不管是新登陸的還是已經存在的普通使用者會話,都無法執行新的操作,直到系統退出QUIESCE狀態。

因此QUIESCE狀態對於7*24環境是十分有幫助的,對於其他使用者而言,只是操作的等待時間變得很長,而並不會報錯。當然QUIESCERESTRICT所沒有的優點,也必然有一些額外的要求,那就是資料庫必須配置了資源管理Resource Management

[oracle@bjtest ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on 星期三 4 22 00:25:59 2009

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


連線到
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> show parameter resource

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
enqueue_resources                    integer     3144
resource_limit                       boolean     FALSE
resource_manager_plan                string
SQL> alter system quiesce restricted;
alter system quiesce restricted
*
ERROR 
位於第 1 :
ORA-25507: 
沒有使資源管理器一直處於開啟狀態

如果資源管理器沒有開啟,在9i中就會出現上面的ORA-25507錯誤。

bash-2.03$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on 星期五 2 20 00:30:49 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> show parameter resource

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
resource_limit                       boolean     FALSE
resource_manager_plan                string
SQL> alter system quiesce restricted;

系統已更改。

而從10g開始,這個限制已經被取消了。

如果是9i,那麼必須設定resource_limit引數為true,並設定resource_manager_plan引數指向一個資源計劃:

SQL> alter system set resource_limit = true;

系統已更改。

SQL> select plan from dba_rsrc_plans;                   

PLAN
------------------------------
SYSTEM_PLAN
INTERNAL_QUIESCE
INTERNAL_PLAN

SQL> alter system set resource_manager_plan = system_plan;

系統已更改。

SQL> alter system quiesce restricted;
alter system quiesce restricted
*
ERROR 
位於第 1 :
ORA-25507: 
沒有使資源管理器一直處於開啟狀態


SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 
例程已經關閉。
SQL> startup
ORACLE 
例程已經啟動。

Total System Global Area 9432971568 bytes
Fixed Size                   756016 bytes
Variable Size             838860800 bytes
Database Buffers         8589934592 bytes
Redo Buffers                3420160 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> show parameter resource

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
enqueue_resources                    integer     3144
resource_limit                       boolean     TRUE
resource_manager_plan                string      SYSTEM_PLAN
SQL> alter system quiesce restricted;

系統已更改。

雖然修改RESOURCE_LIMITRESOURCE_MANAGER_PLAN引數不需要重啟資料庫,但是QUIESCE狀態的修改要求資料庫例項必須自啟動以來資源管理器一直處於開啟的狀態,因此必須重啟資料庫。

當資料庫置於QUIESCE狀態下,普通使用者的新連線將處於等待狀態:

SQL> conn test/test

只有當系統撤銷QUIESCE狀態,使用者才能登陸到資料庫:

SQL> alter system unquiesce;

系統已更改。

這時TEST使用者登陸成功:

已連線。
SQL> select * from session_roles;

ROLE
------------------------------
CONNECT
RESOURCE
DBA
SELECT_CATALOG_ROLE
HS_ADMIN_ROLE
EXECUTE_CATALOG_ROLE
DELETE_CATALOG_ROLE
EXP_FULL_DATABASE
IMP_FULL_DATABASE
GATHER_SYSTEM_STATISTICS
WM_ADMIN_ROLE
JAVA_ADMIN
JAVA_DEPLOY
XDBADMIN
OLAP_DBA
PLUSTRACE

已選擇16行。

SQL> show user
USER 
"TEST"
SQL> SET SQLP 'SQL2> '
SQL2> SELECT * FROM DUAL;

D
-
X

可以看到,和文件描述的一樣,對於TEST使用者而言,即使擁有了DBA角色,也被QUIESCE狀態所禁止,而只有SYSSYSTEM使用者可以對資料庫進行管理操作。

下面再次將資料庫置於QUIESCE狀態,看看對QUIESCE對已經登陸的會話是否有效:

SQL> alter system quiesce restricted;

系統已更改。

檢查第2個會話:

SQL2> SELECT * FROM DUAL;

這個會話在執行操作的時候同樣被HANG住,處於等待狀態:

SQL> select sid from v$session
  2  where sql_address in 
  3  (select address from v$sql          
  4  where sql_text = 'SELECT * FROM DUAL');

       SID
----------
        17

SQL> select sid, event from v$session_wait
  2  where sid = 17;

       SID EVENT
---------- ----------------------------------------------------------------
        17 resmgr:waiting in run (queued)

可以看到,會話2在等待執行,而這個事件是資源管理器所觸發的。

SQL> alter system unquiesce;

系統已更改。

再次解除QUIESCE狀態,下面看看QUIESCE對執行中操作的影響:


D
-
X

SQL2> begin
  2  dbms_lock.sleep(300);
  3  end;
  4  /

在會話2中執行一個5分鐘長的等待事務,然後在會話1執行ALTER SYSTEM QUIESCE RESTRICTED命令:

SQL> alter system quiesce restricted;

這次QUIESCE命令也進入等待狀態,這說明QUIESCE命令會等待所有的當前操作結束,並禁止所有新的操作執行。

這也是QUIESCERESTRICT的差別之一,QUIESCE對所有的會話有效,而RESTRICT只對新連線的會話生效,對已經連線的會話無效。

最後還是看一下QUIESCERAC環境中是如何工作的。

仍然是在一個三節點的RAC環境中進行測試,其中兩個節點處於啟動狀態,另一個節點關閉。

隨後在例項1上發出ALTER SYSTEM QUIESCE RESTRICTED語句,檢查這個操作對例項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 01:28:39 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 quiesce restricted;

系統已更改。

SQL> select instance_name from v$instance;

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

使用普通使用者連線例項1

SQL> CONN TEST/TEST@TESTRAC1

連線被掛起,下面連線例項2

SQL> CONN TEST/TEST@TESTRAC2

例項2的連線也被掛起,看來QUIESCE會傳播到RAC環境的其他例項,那麼對於新啟動的資料庫例項是否有效呢:

SQL> host
$ srvctl start inst -d testrac -i testrac3
PRKP-1001 : Error starting instance testrac3 on node racnode3
CRS-0215: ???????????? 'ora.testrac.testrac3.inst'??

利用SVRCTL命令啟動例項3居然失敗了,下面登陸例項3所在節點,透過SQLPLUS啟動資料庫:

$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on 星期二 4 21 17:44:33 2009

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

已連線到空閒例程。

SQL> startup
ORACLE 
例程已經啟動。

Total System Global Area 2147483648 bytes
Fixed Size                  2031480 bytes
Variable Size             385876104 bytes
Database Buffers         1744830464 bytes
Redo Buffers               14745600 bytes
資料庫裝載完畢。
ORA-25503: 
無法開啟資料庫因為資料庫正在被靜默

錯誤已經很明顯了,雖然執行QUIESCE命令是ALTER SYSTEM語句,但是顯然QUIESCE命令對整個資料庫都是生效的,且RAC的其他例項是無法在QUIESCE狀態下啟動的。

$ exit

SQL> select instance_name, status, active_state from gv$instance;

INSTANCE_NAME    STATUS       ACTIVE_ST
---------------- ------------ ---------
testrac1         OPEN         QUIESCED
testrac3         MOUNTED      NORMAL
testrac2         OPEN         QUIESCED

可以透過V$INSTANCEACTIVE_STATE列檢視資料庫的QUIESCE狀態。

SQL> CONN SYS@TESTRAC2 AS SYSDBA
輸入口令
已連線。
SQL> ALTER SYSTEM UNQUIESCE;

系統已更改。

SQL> SELECT INSTANCE_NAME, STATUS, ACTIVE_STATE FROM GV$INSTANCE;

INSTANCE_NAME    STATUS       ACTIVE_ST
---------------- ------------ ---------
testrac2         OPEN         NORMAL
testrac1         OPEN         NORMAL
testrac3         MOUNTED      NORMAL

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

既然QUIESCE對於每個例項都生效,那麼UNQUIESCE操作也可以在任意一個例項上執行。

 




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;

系統已更改。




About Me

...............................................................................................................................

● 本文整理自網路

● 本文在itpub(http://blog.itpub.net/26736162)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● QQ群:230161599     微信群:私聊

● 聯絡我請加QQ好友(646634621),註明新增緣由

● 於 2017-05-09 09:00 ~ 2017-05-30 22:00 在魔都完成

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

...............................................................................................................................

拿起手機使用微信客戶端掃描下邊的左邊圖片來關注小麥苗的微信公眾號:xiaomaimiaolhr,掃描右邊的二維碼加入小麥苗的QQ群,學習最實用的資料庫技術。

資料庫的三種狀態RESTRICT、QUIESCE和SUSPEND
DBA筆試面試講解
歡迎與我聯絡

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2139738/,如需轉載,請註明出處,否則將追究法律責任。

相關文章