oracle數據庫的靜默狀態

靜默狀態

當數據庫處於靜默狀態時,只有擁有DBA權限的用戶
(注:只有sys和system用戶纔可以,其他被授予DBA角色的用戶也不能執行任何操作),
才能對數據庫進行查詢、更新等操作。
任何非DBA用戶(非sys、system用戶)都不能在數據庫中執行任何操作。

注意:在執行下面的語句重新配置em時,也會使數據庫處於靜默狀態!!!
emca -deconfig dbcontrol db -repos drop
因此,在生產庫上重新配置em,一定要慎重,以免因靜默狀態破壞業務的正常運行!!!


測試

使用一個非DBA用戶aa執行一個業務:
begin
for i in 1..100000
loop
insert into sys.test2 values(i,'aa');
commit;
end loop;
end;
/

使用sys或system用戶執行如下語句進入靜默狀態:
alter system quiesce restricted;
此語句會等待所有非DBA用戶的操作執行完畢才能完成。
同時不再允許開始任何新的非DBA會話(此時另一個用戶bb無法開始新的會話)。

在新的窗口中查看狀態:
SQL> select active_state from v$instance;
ACTIVE_ST
---------
QUIESCING    --正在進入靜默狀態,說明仍然存在活動的非DBA用戶會話(即用戶aa的那個業務還沒有執行完畢)。
SQL>
查詢用戶aa的業務執行了多少:
SQL> select count(*) from test2;
  COUNT(*)
----------
     64347
SQL>
用戶aa的業務執行完畢後,查看狀態:
SQL> select active_state from v$instance;
ACTIVE_ST
---------
QUIESCED    --已經處於靜默狀態(已經沒有任何活動的非DBA用戶會話)。
SQL>
用戶aa的業務已經執行完畢:
SQL> select count(*) from test2;
  COUNT(*)
----------
    100000
SQL>

用戶aa發起新的業務:
begin
for i in 100001..200000
loop
insert into sys.test2 values(i,'aa');
commit;
end loop;
end;
/
此sql語句將被掛起,需要一直等到靜默狀態結束,才能繼續運行。

用sys或system用戶重建test2表:
exp tables=test2 file=test2.dmp
drop table test2 purge;
imp tables=test2 file=test2.dmp

執行如下語句退出靜默狀態:
alter system unquiesce;
查詢實例狀態:
SQL> select active_state from v$instance;
ACTIVE_ST
---------
NORMAL    --實例已經處於正常狀態(非靜默狀態)。
SQL>

用戶aa發起的新業務得以繼續執行。
執行成功後,確認數據無丟失:
SQL> select count(*) from test2;
  COUNT(*)
----------
    200000
SQL>

注意:在執行下面的語句重新配置em時,也會使數據庫處於靜默狀態!!!
emca -deconfig dbcontrol db -repos drop
因此,在生產庫上重新配置em,一定要慎重,以免因靜默狀態破壞業務的正常運行!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章