數據庫共有三種狀態:quiesce、resrict、suspend
一、quiesce模式
首先來說說數據庫的靜默狀態
靜默狀態是指數據庫中只存在sys和system用戶建立的活動會話。只有dba能繼續操作數據庫。
此狀態下可以進行一些在非靜默狀態下執行可能存在不安全因素的特殊操作。
對于必須持續運行的系統,在不關閉數據庫就能執行某些特殊操作的功能十分重要。
靜默狀態下數據庫資源管理器(database resource manager)將阻止sys、system用戶以外的用戶提交操作。
進入靜默狀態的方法為:
alter system quiesce restricted;(sys或system用戶執行)
進入靜默模式的過程為:數據庫資源管理器控制所有實例,阻止非活動會話恢復為活動狀態。普通用戶無法執
行新的事務、查詢、數據提取和pl/sql過程。如果一個查詢是由多個連續的 OCI 數據提取操作執行的,Oracle
不會等待所有的數據提取全部結束。Oracle 只會等待當前的數據提取結束并阻塞之后的數據提取。Oracle 還
會等待所有擁有共享資源的會話(SYS 及 SYSTEM 用戶的資源除外)釋放資源。上面提到的所有等待都結束之
后,Oracle 可以將數據庫置為靜默狀態,并結束 QUIESCE RESTRICTED 語句。
如果數據庫的某個實例是在共享服務模式(shared server mode)下運行的,Oracle 通過數據庫資源管理器(
Database Resource Manager)阻止用戶(SYS 及 SYSTEM 用戶除外)登錄到此實例。如果實例運行在專用服務
模式(dedicated server mode)下,Oracle 不會對此實例的用戶登錄進行限制。
靜默狀態恢復到正常狀態方法為:
alter system unquiesce
可以通過v$instance等視圖得到數據庫狀態。
具體實例為:
Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.
D:\Documents and Settings\tian>set oracle_sid=test_database
D:\Documents and Settings\tian>sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on 星期五 10月 19 09:19:50 2012
Copyright (c) 1982, 2002, Oracle Corporation.? All rights reserved.
SQL> conn /as sysdba
已連接。
SQL> alter system quiesce restricted
2? ;
alter system quiesce restricted
*
ERROR 位于第 1 行:
ORA-25507: 沒有使資源管理器一直處于打開狀態
//如果是9i,那么必須設置resource_limit參數為true,并設置resource_manager_plan參數指向一個資源計劃
SQL> alter system set resource_manager_plan='SYSTEM_PLAN' scope=spfile sid='JLRP
S';
//由于數據庫沒有開啟資源管理器,無法執行這個操作。需要開啟后重啟才生效。
系統已更改。
SQL> shutdown immediate;
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area? 126950220 bytes
Fixed Size?????????????????? 453452 bytes
Variable Size???????????? 109051904 bytes
Database Buffers?????????? 16777216 bytes
Redo Buffers???????????????? 667648 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL> alter system quiesce restricted;
系統已更改。
SQL> conn
^C
//此處證明靜默模式下其他用戶不能登錄數據庫
D:\Documents and Settings\tian>sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on 星期五 10月 19 09:32:07 2012
Copyright (c) 1982, 2002, Oracle Corporation.? All rights reserved.
SQL> conn /as sysdba
已連接。
SQL> select * from v$instance;
INSTANCE_NUMBER INSTANCE_NAME
--------------- ----------------
HOST_NAME
----------------------------------------------------------------
VERSION?????????? STARTUP_TI STATUS?????? PAR??? THREAD# ARCHIVE LOG_SWITCH_
----------------- ---------- ------------ --- ---------- ------- -----------
LOGINS???? SHU DATABASE_STATUS?? INSTANCE_ROLE????? ACTIVE_ST
---------- --- ----------------- ------------------ ---------
1 test_database
TIANLEI
9.2.0.1.0???????? 19-10月-12 OPEN???????? NO?????????? 1 STARTED
ALLOWED??? NO? ACTIVE??????????? PRIMARY_INSTANCE?? QUIESCED//處于靜默狀態
SQL> alter system unquiesce;
系統已更改。
SQL> conn scott/tiger
已連接。
SQL> select * from v$instance;
INSTANCE_NUMBER INSTANCE_NAME
--------------- ----------------
HOST_NAME
----------------------------------------------------------------
VERSION?????????? STARTUP_TI STATUS?????? PAR??? THREAD# ARCHIVE LOG_SWITCH_
----------------- ---------- ------------ --- ---------- ------- -----------
LOGINS???? SHU DATABASE_STATUS?? INSTANCE_ROLE????? ACTIVE_ST
---------- --- ----------------- ------------------ ---------
1 test_database
TIANLEI
9.2.0.1.0???????? 19-10月-12 OPEN???????? NO?????????? 1 STARTED
ALLOWED??? NO? ACTIVE??????????? PRIMARY_INSTANCE?? NORMAL//恢復正常狀態了
在設置靜默狀態時,正在登陸的普通用戶被掛起,無法進行操作了。
而當狀態改為正常后,普通用戶的會話繼續執行。
以上的實驗是在oracle9i環境下操作的,在10g中,必須開啟數據庫資源管理器的限制已經被取消了。因此,向
上面實驗中的操作其實是沒意義的,因為靜默狀態和restricted狀態的區別就在于其不用停掉數據庫而執行操
作。
在RAC環境下某個節點設置了靜默狀態后,其他節點也是能夠監測到的。
二、restrict模式:
直接實驗
1.會話1中進行操作:
SQL> startup restrict
ORACLE 例程已經啟動。
Total System Global Area? 126950220 bytes
Fixed Size?????????????????? 453452 bytes
Variable Size???????????? 109051904 bytes
Database Buffers?????????? 16777216 bytes
Redo Buffers???????????????? 667648 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL> select * from v$instance;
INSTANCE_NUMBER INSTANCE_NAME
--------------- ----------------
HOST_NAME
----------------------------------------------------------------
VERSION?????????? STARTUP_TI STATUS?????? PAR??? THREAD# ARCHIVE LOG_SWITCH_
----------------- ---------- ------------ --- ---------- ------- -----------
LOGINS???? SHU DATABASE_STATUS?? INSTANCE_ROLE????? ACTIVE_ST
---------- --- ----------------- ------------------ ---------
1 jlrps
TIANLEI
9.2.0.1.0???????? 19-10月-12 OPEN???????? NO?????????? 1 STARTED
RESTRICTED NO? ACTIVE??????????? PRIMARY_INSTANCE?? NORMAL
SQL> create user tes1 identified by tes1;
用戶已創建
SQL> grant create session to tes1;
授權成功。
2.會話2中進行操作:
SQL> conn tes1/tes1
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege
SQL> conn scott/tiger
已連接。
SQL> select * from emp;
EMPNO ENAME????? JOB????????????? MGR HIREDATE????????? SAL?????? COMM
---------- ---------- --------- ---------- ---------- ---------- ----------
DEPTNO
----------
7369 SMITH????? CLERK?????????? 7902 17-12月-80??????? 800
20
7499 ALLEN????? SALESMAN??????? 7698 20-2月 -81?????? 1600??????? 300
30
7521 WARD?????? SALESMAN??????? 7698 22-2月 -81?????? 1250??????? 500
30
……//結果省略,scott用戶擁有dba角色(RESTRICTED SESSION privilege)
3.會話1中操作:
SQL> shutdown immediate;
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area? 126950220 bytes
Fixed Size?????????????????? 453452 bytes
Variable Size???????????? 109051904 bytes
Database Buffers?????????? 16777216 bytes
Redo Buffers???????????????? 667648 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL>
4.會話2中操作:
SQL> conn tes1/tes1
已連接。
可以看到,restrict模式需要重啟數據庫,且擁有RESTRICTED SESSION privilege的用戶在此模式可以登錄系
統進行操作。
而quiese模式就死板多了,除了sys、system都不行,不過也更安全。
三、suspend模式:
面向所有用戶,限制I/O操作。當我們需要進行物理讀操作時,會話會暫停。
SQL> shutdown immediate
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area? 126950220 bytes
Fixed Size?????????????????? 453452 bytes
Variable Size???????????? 109051904 bytes
Database Buffers?????????? 16777216 bytes
Redo Buffers???????????????? 667648 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL> alter system suspend;
系統已更改。
SQL> select * from scott.emp;
//一直沒有查詢結果。
這個問題還真不會解決了。將數據庫重啟再操作還是無效的
說到了數據庫啟停,再復習一下:
啟動類型:
startup nomount? --啟動實例
startup mount??? --啟動實例、裝載
startup (normal) --啟動實例、裝載、打開數據庫
startup pfile='xx/xx/xx.ora'? --參數文件啟動
startup restrict --限制模式,無restricted session權限的用戶無法登錄
startup force??? --強制啟動,正常啟動不了才用
startup open recover --啟動實例,裝載數據庫和啟動完全介質恢復
停止類型:
shutdown (normal) --正常模式
shutdownimmediate --立即模式
shutdown abort??? --中斷模式,再次啟動時可能需要恢復
alter system quiese restricted; --停頓數據庫,只有sys、system用戶可操作
掛起數據庫
--暫停對數據文件和控制文件的所有IO,可以在無IO干擾情況先進行備份
--掛起命令可以掛起數據庫而并不指定一個實例
ALTER SYSTEM SUSPEND;
--恢復到非掛起狀態
ALTER SYSTEM RESUME;
--查看掛起狀態
SELECT DATABASE_STATUS FROM V$INSTANCE;