1調整緣由sql
咱們的客戶反應如今咱們公司的軟件使用起來比較漫。目前他們已經用快要兩年了。根據用戶反應的狀況,公司派我到現場作數據庫調優。我在現場走訪了幾個部門,也向操做人員瞭解了一些狀況。我初步分析認定爲是數據庫性能存在問題。數據庫
認定的理由是在用戶操做的時候,不是每次操做都漫,也有快的時候,根據這樣特色我下定結論是數據庫問題。在操做漫的時候確定是使用的人多(也可說是併發多),因此數據庫資源有些緊張,因此使用時就漫了。緩存
2數據庫分析服務器
我也在網上找了一些資料,對數據庫的性能指標進行了評估,結果幾項指標都沒達到要求。(也不知道我分析的對不對,若有不對的地方,還請大俠多多指教,小弟我剛出道,之前是搞開發的。)session
2.1性能指標架構
性能指標併發
參考辦法oracle
查詢語句性能
原值測試
2010-4-2
8:01:00
2010-4-2
9:56:00
v$librarycache
v$librarycache中reloads/pins的比率應該小於1%,若是大於1%,應該增長參數shared_pool_size的值。
Select sum(pins) 「executions」,sum(reloads) 「cache misses」,sum(reloads)/sum(pins) from v$librarycache;
0.028362
0.011563686
0.026409799
監視共享池的性能
SQL AREA部分的gethitratio、pinhitratio要> 90%。
select namespace,gethitratio,pinhitratio,reloads,invalidations
from v$librarycache where namespace in (‘SQL AREA’,’TABLE/PROCEDURE’,’BODY’,’TRIGGER’);
0.666566
0.539428
0.655988245
從新裝載率Reload Ratio要< 1%。
select SUM(reloads)/SUM(pins)「Reload Ratio」from V$librarycache;
2.83662
0.011831132
0.0264695
調整緩衝區高速緩存(Buffer Cache)的性能
「Buffer Cache Hit Ratio」的值要> 90%。
select 1-((physical.value–direct.value–lobs.value)/logical.value)「Buffer Cache Hit Ratio」from V$SYSSTAT physical, V$SYSSTAT direct,V$SYSSTAT lobs, V$SYSSTAT logical where physical.name =‘physical reads’
And direct.name =‘physical reads direct’and
lobs.name =‘physical reads direct (lob)’
And logical.name =‘session logical reads’;
0.793315
0.786405701
0.698056181
2.2如今的Sgainfo信息
Fixed SGA Size
No
1251172
Redo Buffers
No
7135232
Buffer Cache Size
Yes
1317011456
Shared Pool Size
Yes
125829120
Large Pool Size
Yes
8388608
Java Pool Size
Yes
8388608
Streams Pool Size
Yes
0
Granule Size
No
8388608
Maximum SGA Size
No
1468006400
Startup overhead in Shared Pool
No
58720256
Free SGA Memory Available
0
正是由於根據上面的分析結果,因此就更確定了是數據庫問題。我就把目光放在了Sga_max_size和sga_target它倆上,經過調整它倆來加大共享池(shared_pool_size)。
3應用環境描述
服務器:
型號/類型:IBM SYSTEM 3650 CPU:Intel® Xean® E5430 2.66(4顆單核)
內存:4G 硬盤:146G*7(使用磁盤陣列)
網卡:NetXtreme II GigE(2塊) 是否RIAD:是,RIAD5
操做系統:
名稱:Windows 32位 版本:2003 SP1
數據庫:
名稱:Oracle 版本:E10.2.0.1
所屬行業:
行業名稱:醫院辦公系統(HIS)
系統架構:C/S
客戶端數:150臺,實際應用120臺左右(經過會話看的,也不知道還能怎麼看)
4參數修改
經過對以上內容的分析和在網上找了一些參考資料,決定將sga_max_size和sga_target調整到2200M,可是操做結果失敗了,告訴我內存不夠,數據庫啓不來了,還有備份機,要否則我就慘了(我事先沒作備份,當時老突突了,原本在操做前都想到要備份了,結果仍是沒備,後怕。)。
4.1備份
這步是我後加在的,必須得作。呵呵~~可別讓本身後怕了。
把這個文件考那都行「D:\oracle\product\10.2.0\db_1\dbs\SPFILEORCL.ORA」,要是改完以後啓不了數據庫了那就在把文件考回去。固然還有其它方法。
根據初化參數文件spfile建立pfile文件,此文件能夠進行編輯,修改初始化參數。
開始——》運行——》cmd
>sqlplus / as sysdba
SQL>create pfile='c:\orcl.ora' from spfile;
根據修改後的pfile文件建立spfile文件。
SQL>create spfile from pfile='c:\orcl.ora';
4.2修改參數
開始——》運行——》cmd
>sqlplus / as sysdba;
SQL>ALTER system SET sga_max_size=2200mscope=spfile;
SQL>ALTER system SET sga_target=2000mscope=spfile;
4.3關閉數據庫
SQL>shutdown immediate;
4.4開啓數據庫
SQL>startup;
就在這一步出現問題了,報內存不夠用,當時很不能理解,明明是4G內存,我才設置到2.2G,怎麼能不夠呢!由於比較着急,因此就用備份機上的文件「SPFILEORCL.ORA」給恢復了,數據庫啓來了。就那樣用了。優化失敗。(也不知道這樣用有沒有問題,若是有問題還請你們給指點指點,說明一下存在問題的緣由和解決辦法,小弟多謝了。)
面對失敗我很是不甘心,回去後在本身的筆記本上好個試(機器配置就不詳說了,2.53雙核,2G內存,XP sp3,Oracle Database10gEnterprise Edition Release10.2.0.1.0,32-bit),測試結果是,個人機子最多能夠設置到1700M,當設置到1800M的時候,就啓不了數據庫了。本覺得我就能設置到1700M呢!在次日我又測試了一遍,又設置到了1800M,此次我沒有直接用startup啓動數據庫,而是在「服務」中把數據庫服務從新啓動了一下,呵呵~~數庫也啓動了。試過1900M,是啓不來的(我這只是測試,設置到這麼大是不合理的,我看的資料說大小等於物理內存-1.5麼!也不知道這樣是否是最合理的,有機會必定得試試。呵呵~~)。
經過這個測試,讓我忽然間想起了,前一天晚上對服務器的設置,我當時也是在命令行中直接用startup啓動的數據庫,若是我在服務中將數據庫服務重啓一下,會不會也能夠啓來呢?????有這個可能性。我在想,是否是即便我關閉了數據庫,服務是否是也會點用內存(經過下面的測試,沒看出有關係來),並無釋放內存呢!正是由於這樣,因此物理內存可用的並很少了,而我設置的值卻大於了可用內存,這一點我沒有驗證,只是推測。(寫完了,我就試試,哈哈……)
測試狀況
一、先把我本機的數據庫設置的值恢復到合理的值。(登陸SQLPLUS我就不說了)
SQL>ALTER system SET sga_max_size=600mscope=spfile;
SQL>ALTER system SET sga_target=600mscope=spfile;
二、關閉數據庫,把服務也重啓一下,讓一切恢復到原始狀態。
SQL>shutdown immediate;
三、記錄內存如今佔用的狀況。
系統共用:1.2G;ORACLE:222876K
四、修改數據庫的那倆個參數。
SQL>ALTER system SET sga_max_size=1600mscope=spfile;
SQL>ALTER system SET sga_target=1600mscope=spfile;
五、關閉數據庫。
SQL>shutdown immediate;
六、記錄如今內存使用狀況。(看如今這種狀況,現用內存+我設置的,已經大於物理內存了。)
系統共用:597M;ORACLE:76916K
七、啓動數據庫。
SQL>startup;
八、結果。並記錄如今內存使用狀況。
能夠啓動。
系統共用:2.18G;ORACLE:246384K
九、分析內存的使用狀況。
如今使用的內存已經大於我實際內存(2G,只能看到1.93G)了。怪怪怪……這是怎麼回事啊!阿,知道了,哈哈……是否是把虛擬內存也算上了。個人虛擬內存是2046~4092(至關於2G~4G)。
十、增大SGA到1700,重複第四步,到第8步。
能夠啓動。
系統共用:2.28G;ORACLE:248568K
十一、增大SGA到1800,重複第四步,到第8步。
報錯,數據庫沒法啓動。
ORA-27102: out of memory
十二、在服務中把數據庫服務中止。記錄內存使用狀況。
系統共用:560M;
1三、在服務中啓動數據庫服務。
啓動成功能。
系統共用:2.35G;ORACLE:278292K
1四、結論。
關於最大能加到多大我就不試了,反證加到1900確定是不行的。最後的結論是,沒弄明白究竟是什麼原理,究竟是和個人內存大小有關,仍是和這個值設置的上限有關,嗚嗚嗚~~~~~那位高人知道,那就說說吧!很想知道爲何,還會繼續研究的,頗有意思。哈哈~~
若是是和個人內存大小有關,那麼我以爲個人那臺服務器設置到2200是有戲的。若是是那個值(仍是別那個值了,就是sga_max_size的值)有上限……
我也把個人分析和用戶那個管事的說了,可是因爲要放假了,因此我就不能驗證了。正好這也是給我個機會,有充足的時間,我能夠多問問了,呵呵~~
4.5查看修改後的參數
SQL>select * from v$sga;
SQL>show parameter sga_max_size;
SQL>show parameter sga_target;
4.6分析修改後的性能指標狀況
根據第2節的性能指標,檢查如今的數據庫。
請前輩們多多指教,看看我那臺服務器的配置,參數sga_max_size和sga_target設置爲多大更合理(如今是1400M)。另外,有沒有什麼更好辦法能夠測試出服務器性能的、有沒有其它參數須要修改的或者是有現成的很是實用的文檔,請不要保留,發出來讓俺也學學。多謝。(網上也看了不少,可是沒找到我相要的,多是我太笨了,嗚嗚~~)