【Shared Server Mode】測試調整shared_servers引數對資料庫的影響

secooler發表於2011-05-22
  關於Shared Server模式的配置方法請參見文章《【Shared Server Mode】“專有伺服器模式”調整為“共享伺服器模式”》(http://space.itpub.net/519536/viewspace-609990)。
  shared_servers引數是個可以動態調整的引數,我們觀察一下這個引數調整對系統後臺Shared Server程式啟動的影響以及對資料庫的影響。

1.調整shared_servers引數之前後臺Shared Server程式啟動情況
sys@secdb> show parameter shared_servers

NAME                                     TYPE                 VALUE
---------------------------------------- -------------------- -----------
max_shared_servers                       integer
shared_servers                           integer              0

secdb@secdb1 /home/oracle$ ps -ef | grep ora_s0 | grep -v grep
此處沒有任何返回內容,表明伺服器上沒有啟動任何Shared Server程式

2.在資料庫中調整shared_servers引數調整為10
sys@secdb> alter system set shared_servers=10;

System altered.

sys@secdb> show parameter shared_servers

NAME                                     TYPE                 VALUE
---------------------------------------- -------------------- -----------
max_shared_servers                       integer
shared_servers                           integer              10

3.調整shared_servers引數之後後臺Shared Server程式啟動情況
secdb@secdb1 /home/oracle$ ps -ef | grep ora_s0 | grep -v grep
oracle    1596     1  0 13:41 ?        00:00:00 ora_s000_secdb
oracle    1598     1  0 13:41 ?        00:00:00 ora_s001_secdb
oracle    1600     1  0 13:41 ?        00:00:00 ora_s002_secdb
oracle    1602     1  0 13:41 ?        00:00:00 ora_s003_secdb
oracle    1604     1  0 13:41 ?        00:00:00 ora_s004_secdb
oracle    1606     1  0 13:41 ?        00:00:00 ora_s005_secdb
oracle    1608     1  0 13:41 ?        00:00:00 ora_s006_secdb
oracle    1610     1  0 13:41 ?        00:00:00 ora_s007_secdb
oracle    1613     1  0 13:41 ?        00:00:00 ora_s008_secdb
oracle    1615     1  0 13:41 ?        00:00:00 ora_s009_secdb
可見,此時後臺程式隨即啟動了10個後臺Shared Server程式。

4.再次將shared_servers引數調整為0,觀察後臺Shared Server程式是否會自動關閉
sys@secdb> alter system set shared_servers=0;

System altered.

調整引數過程中可以使用如下指令碼監控後臺Shared Server程式啟動情況
$ while :; do ps -ef | grep ora_s0 | grep -v grep; sleep 1; done

觀察大約結果16秒左右的時間,後臺Shared Server程式同時退出,不再有輸出資訊。

5.試問,這個引數可以無限的調大麼
答案當然是否定的!這裡與資料庫最大可以啟動的最大程式數相關,也就是與資料庫processes引數的大小相關。資料庫的總啟動程式數不能超過processes引數值。
測試如下。
1)嘗試將shared_servers調整為200
SQL> alter system set shared_servers=200;

System altered.

2)當系統後臺Shared Server程式陸續啟動到ora_s099_secdb時,alert警告日誌中記錄瞭如下錯誤
Sun May 22 17:59:11 2011
Process S174 died, see its trace file
failed to start shared server, er=0

3)重啟資料庫時的報錯資訊
sys@secdb> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@secdb> startup;
ORA-24324: service handle not initialized
ORA-24323: value not allowed
ORA-00020: maximum number of processes (%s) exceeded

4)此時alert警告日誌內容
Sun May 22 18:05:42 2011
Process S185 died, see its trace file
failed to start shared server, er=0

這裡提示的內容是當Oracle嘗試啟動第185個Shared Server程式時出現了錯誤。

5)此時檢視一下伺服器後臺程式的總數
secdb@secdb1 /home/oracle$ ps -ef | grep ora_ | grep -v secgc | grep -v grep | wc -l
198

此時與secdb例項有關的資料庫後臺程式已經啟動了198個。
導致此故障的原因浮出水面:此時資料庫例項中processes引數設定的值是200,當Shared Server程式過大導致總程式數超過了這個限制,最終導致了這個故障的發生。

6.故障處理方法
故障處理策略:透過調整pfile間接調整spfile的方法調整錯誤設定的shared_servers引數內容。
1)此時嘗試immediate方式停止資料庫是無法完成的
secdb@secdb1 /home/oracle$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun May 22 18:22:06 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected.
NotConnected@> shutdown immediate;
ORA-24324: service handle not initialized
ORA-24323: value not allowed
ORA-00020: maximum number of processes (%s) exceeded

2)只能透過abort方式強制終止資料庫例項
secdb@secdb1 /home/oracle$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun May 22 18:25:55 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected.
NotConnected@> shutdown abort;
ORACLE instance shut down.

3)連線到資料庫生成pfile
secdb@secdb1 /home/oracle$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun May 22 18:32:02 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

sys@secdb> create pfile from spfile;

File created.

4)調整pfile中錯誤設定的引數
secdb@secdb1 /home/oracle$ vi $ORACLE_HOME/dbs/initsecdb.ora
……省略其他內容……
*.processes=200
……省略其他內容……
*.shared_servers=200
……省略其他內容……

將上面的shared_servers引數調整為“0”

5)生成spfile並啟動資料庫
secdb@secdb1 /home/oracle$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun May 22 18:38:19 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to an idle instance.

NotConnected@> create spfile from pfile;

File created.

NotConnected@> startup;
ORACLE instance started.

Total System Global Area  314572800 bytes
Fixed Size                  1219184 bytes
Variable Size             104859024 bytes
Database Buffers          205520896 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.

故障處理完畢。

7.小結
  本文給出了測試調整shared_servers引數對資料庫的影響,重點給出了由於shared_servers引數設定過大導致資料庫無法啟動的故障。對資料庫的管理和維護是一個系統工程,需要DBA全面衡量和探究後給出最佳化策略。

Good luck.

secooler
11.05.22

-- The End --

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

相關文章