轉自:http://blog.163.com/yy_wq80/blog/static/4027606200812911834338/
前一陣,單位的oralce突然當機了.檢查原因.一看原來SGA的內存只有1.4G太小了.那就調吧.準備先調到3G可是一調報錯了.查了相關資料原來發現是oracle的限制.
我的電腦配置:
CPU:至強2.8X8、內存:12G、硬盤:1T、磁盤陣列5
以下是操作步驟
1.打開開關 boot.ini 增加 /3G /PAE
為什么要加二個呢.有的資料是這么說的:同時使用內存最到能夠支持到16G,如果用使用16G以上的內存,則必須選擇其中的一種使用了。以下是我的boot文件
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /3G /PAE /fastdetect
2.修改注冊表
HKEY_Local_Machine-software-oracle-homeX(代表不同的數0,1,2,3...)
在 他的里面增加一個DWORD值,名稱為AWE_WINDOW_MEMORY 里面的內存是十六進制數,單位為字節,比如你要增加200M就要在里面寫上200X1024X1024=209715200 即200M大小,那么oracle的數據緩沖區將占用200M的普通內存,其余部分(1G - 200M = 824M)則使用間接內存。我填寫的是1024X1024X1024=1048576000,1G內存。大小為你需要讓oracle使用普通內存作為緩存的大小(不是windows讓出來的1G,而是內存地址在0x00000000 到 0x7FFFFFFF 之間的內存大小)這樣在Windows的注冊表中的HKLM\Software\Oracle\HomeX下的AWE_WINDOW_MEMORY若未設定,默認值為1024M。下面會說明這個值的具體計算方法。
3.打開本地安全策略,將本地策略中的用戶權利指派下的“內存中鎖定頁”(Lock Pages in Memory權限)權限賦給管理員(運行Oracle的用戶).
4.重起計算機
5.如果你的是oracle 9.0.2.1就要下載補丁了要用oracle 9.0.2.7 就要去網上下了
6.接下來就是要配oralce的參數
需要設置的參數如下(通過PFILE、SPFILE都可以,注意先備份,免得出錯無法啟動Oracle):
#如果設置了這個參數,對于Oracle9.2.0的版本則不能再使用DB_CACHE_SIZE參數了,只能使用DB_BLOCK_BUFFERS參數。擴展的內存只能增加到BUFFER CACHE中去使用,因此只能增大DB_BLOCK_BUFFERS這個參數去擴展SGA區。
USE_INDIRECT_DATA_BUFFERS=TRUE
#乘數據庫塊的大小,為高速緩存的大小。
#reset掉參數DB_CACHE_SIZE
DB_BLOCK_BUFFERS=262144 #若塊大小為4096,則為1G
# 把oracle SGA鎖定到內存中,不產生頁面交換文件(8i的參數可能是lock_sga = true)
# 對于一個有4G物理內存的系統來講,可能這一個參數并不是必須的
pre_page_sga = true
#使用命令,注意雙引號,alter system set "_db_block_lru_latches"=64 scope=spfile;
_db_block_lru_latches=64
設置完畢。
_db_block_lru_latches = (Max buffer pools * SETS_PER_POOL)
Max Buffer Pools是個常量,等于8,SETS_PER_POOL是個變量,它的大小由是否啟用VLM(即設定USE_INDIRECT_DATA_BUFFERS=TRUE參數)決定:
SETS_PER_POOL = 2* CPU_COUNT (啟用 VLM)
SETS_PER_POOL= CPU Count /2 (不啟用VLM)
例如:
CPU's = 16
DB_BLOCK_SIZE = 8192
Total RAM = 16 GB
SETS_PER_POOL = 2 * CPU_COUNT = 32
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*32 = 256 MIN(AWE_WINDOW_MEMORY)=(4096*DB_BLOCK_SIZE*_DB_BLOCK_LRU_LATCHES)/8 =( 4096 * 8192 * 256) / 8 = 1073741824 bytes = 1024 MB
這樣在Windows的注冊表中的HKLM\Software\Oracle\Homex下的AWE_WINDOW_MEMORY值至少是1024M,否則就會提示錯誤:
ORA-27102 out of memory
OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD
O/S Error: (OS
Not enough storage is available to process this command
另外幾篇文章:
(第一篇)redhat
-----------------------------------
今天一臺Linux服務器擴展了一下內存,達到4G,開發的人自己修改了一下SGA結果數據庫無法啟動了.
啟動不了時,出的錯誤是這個樣子的:
[oracle@neirong oracle]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Fri Nov 25 15:43:26 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to an idle instance.
SQL> startup
ORA-27123: unable to attach to shared memory segment
Linux Error: 22: Invalid argument
Additional information: 1
Additional information: 458753
SQL> exit
Disconnected
在32位平臺上,缺省的SGA最大只能擴展到1.7G,如果需要支持更大的內存,就需要降低mapped_base,重新Link Oracle軟件.
俺的平臺為:
[oracle@neirong bdump]$ cat /etc/redhat-release
Red Hat Enterprise Linux AS release 3 (Taroon Update 2)
簡單操作如下:
cd $ORACLE_HOME/rdbms/lib
cp ksms.s ksms.s.bak
genksms -s 0x12000000 > ksms.s
make -f ins_rdbms.mk ksms.o
make -f ins_rdbms.mk ioracle
此處先備份ksms.s文件,如果編譯過程中出現錯誤,保證操作可以被恢復:
恢復步驟大致如下:
cd $ORACLE_HOME/rdbms/lib
cp ksms.s.bak ksms.s
genksms > ksms.s
make -f ins_rdbms.mk ksms.o
make -f ins_rdbms.mk ioracle
以下是操作日志:
[oracle@neirong dbs]$ cd $ORACLE_HOME/rdbms/lib
[oracle@neirong lib]$ genksms -s 0x12000000 > ksms.s
[oracle@neirong lib]$ make -f ins_rdbms.mk ksms.o
[oracle@neirong lib]$ make -f ins_rdbms.mk ioracle
- Linking Oracle
rm -f /opt/oracle/product/9.2.0/rdbms/lib/oracle
gcc -o /opt/oracle/product/9.2.0/rdbms/lib/oracle -L/opt/oracle/product/9.2.0/rdbms/lib/
-L/opt/oracle/product/9.2.0/lib/ -L/opt/oracle/product/9.2.0/lib/stubs/
-Wl,-E `test -f /opt/oracle/product/9.2.0/rdbms/lib/skgaioi.o && echo
/opt/oracle/product/9.2.0/rdbms/lib/skgaioi.o` /opt/oracle/product/9.2.0/rdbms/lib/opimai.o
/opt/oracle/product/9.2.0/rdbms/lib/ssoraed.o /opt/oracle/product/9.2.0/rdbms/lib/ttcsoi.o
/opt/oracle/product/9.2.0/lib/nautab.o /opt/oracle/product/9.2.0/lib/naeet.o
/opt/oracle/product/9.2.0/lib/naect.o /opt/oracle/product/9.2.0/lib/naedhs.o
/opt/oracle/product/9.2.0/rdbms/lib/config.o -lserver9 -lodm9 -lskgxp9 -lskgxn9 -lclient9
-lvsn9 -lwtcserver9 -lcommon9 -lgeneric9 /opt/oracle/product/9.2.0/rdbms/lib/defopt.o
-lknlopt `if /usr/bin/ar tv /opt/oracle/product/9.2.0/rdbms/lib/libknlopt.a | grep
xsyeolap.o > /dev/null 2>&1 ; then echo "-loraolap9" ; fi`
-lslax9 -lpls9 -lplp9 -lserver9 -lclient9 -lvsn9 -lwtcserver9 -lcommon9 -lgeneric9
-lknlopt -lslax9 -lpls9 -lplp9 -ljox9 -lserver9 -locijdbcst9 -lwwg9
`cat /opt/oracle/product/9.2.0/lib/ldflags` -lnsslb9 -lncrypt9 -lnsgr9 -lnzjs9
-ln9 -lnl9 -lnro9 `cat /opt/oracle/product/9.2.0/lib/ldflags` -lnsslb9 -lncrypt9
......
mv -f /opt/oracle/product/9.2.0/bin/oracle /opt/oracle/product/9.2.0/bin/oracleO
mv /opt/oracle/product/9.2.0/rdbms/lib/oracle /opt/oracle/product/9.2.0/bin/oracle
chmod 6751 /opt/oracle/product/9.2.0/bin/oracle
此后數據庫可以以超過1.7G的SGA區設置啟動:
SQL> startup
ORACLE instance started.
Total System Global Area 2685476820 bytes
Fixed Size 454612 bytes
Variable Size 1073741824 bytes
Database Buffers 1610612736 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
(第二篇)WINDOWS平臺上擴展SGA
-----------------------
針對32bit的Windows。Windows2000上不能利用超過4G的內存,一般是2G的內存保留給進程,2G內存保留給核心的。在Windows2000 Advanced Server上可以分配3G給進程,1G留給核心的。
1. 如果機器的內存在4G以下,可以使用Physical Address Extensions(PAE)或者是Address Windowing Extensions(AWE)進行擴展,如果機器內存大于4GB就只能使用AWE進行擴展了。
AWE支持以下的Windows操作系統:
Windows 2000 Datacenter Server
Windows 2000 Advanced Server
Windows 2003 Datacenter Edition(32bit)
Windows 2003 Enterprise Edition(32bit)
AWE不支持以下的Windows操作系統:
Windows 2000 Server(Standard)
Windows2000 Professional
Windows XP Home Edition
Windows XP Professional
Windows 2003 Standard Edition
Windows 2003 Web Edition
AWE支持的Oracle數據庫的版本:
Oracle 8.1.6.X
Oracle 8.1.7.X
Oracle 9.2.X
AWE不支持Oracle9.0.1.X
在標準版的Oracle9.2.0.1上,如果你設置了use_indirect_data_buffers=true,啟動就會報錯:
ORA-439-feature not enabled:very large memory.
這個是標準版的Oracle的9.2.0.1的一個bug(#2520796),在Oracle9.2.0.2中解決了。
2. 在操作系統上啟動AWE
AWE在操作系統上可以通過在boot.ini文件中加/PAE切換啟用。
例如:
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server" /PAE
也可以同時使用/PAE和/3G在同一臺機器上,例如:
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server" /3GB /PAE
但是同時使用內存最到能夠支持到16G,如果用使用16G以上的內存,則必須選擇其中的一種使用了。
3. 在Oracle上啟用AWE
首先要在啟動的參數文件中設置參數
USE_INDIRECT_DATA_BUFFERS=TRUE
如果設置了這個參數,對于Oracle9.2.0的版本則不能再使用DB_CACHE_SIZE參數了,只能使用DB_BLOCK_BUFFERS參數。
擴展的內存只能增加到BUFFER CACHE中去使用,因此只能增大DB_BLOCK_BUFFERS這個參數去擴展SGA區。
4. AWE_WINDOW_MEMORY實現故障解決
在Oracle8.1.7版本以下啟動數據庫的時候不用設置AWE_WINDOW_MEMORY的最小值,而在Oracle9.2.0的版本中則強制要設置AWE_WINDOW_MEMORY的最小值,這個最小值在Oracle8.1.7中通過DB_BLOCK_LRU_LATCHES參數設定,在Oracle9.2.0中則通過_DB_BLOCK_LRU_LATCHES隱含參數設定,Oracle9.2.0的AWE_WINDOW_MEMORY的最小值由以下的公式計算:
MIN(AWE_WINDOW_MEMORY)=(4096 * DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES)/8
_DB_BLOCK_LRU_LATCHES = (Max buffer pools * SETS_PER_POOL)
Max Buffer Pools是個常量,等于8,SETS_PER_POOL是個變量,它的大小由是否啟用VLM(即設定USE_INDIRECT_DATA_BUFFERS=TRUE參數)決定:
SETS_PER_POOL = 2* CPU_COUNT (啟用 VLM)
SETS_PER_POOL= CPU Count /2 (不啟用VLM)
例如:
CPU's = 16
DB_BLOCK_SIZE = 8192
Total RAM = 16 GB
SETS_PER_POOL = 2 * CPU_COUNT = 32
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*32 = 256 MIN(AWE_WINDOW_MEMORY)=(4096*DB_BLOCK_SIZE*_DB_BLOCK_LRU_LATCHES)/8 =( 4096 * 8192 * 256) / 8 = 1073741824 bytes = 1024 MB
這樣在Windows的注冊表中的HKLM\Software\Oracle\Homex下的AWE_WINDOW_MEMORY值至少是1024M,否則就會提示錯誤:
ORA-27102 out of memory
OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD
O/S Error: (OS
Not enough storage is available to process this command
(第三篇)windows內存調優
內存優化是Windows平臺的關鍵設置,首先了解一下Windows 2000平臺的Oracle結構:
基于線程的結構
Windows2000是基于線程的結構,相反,Unix操作系統是基于進程的結構。這意味著Windows中更多的應用,包括Oracle在內,是以帶有多個線程的單個進程的形式執行,這種基于線程的結構的確給Window2000帶來優勢——更容易共享內存。內存空間為每個進程分配,進程間共享內存很笨拙,要使用附加編碼,線程是進程的子集,使用比進程少得多的內存。特定進程的所有線程共享同樣的進程內存空間,同一進程的線程間共享內存比不同進程共享內存要快,這給基于線程的結構很大優勢,更有效。
在服務器上運行的每個應用程序都有一個,而且只有一個進程。進程是應用程序的載體,是用來容納執行應用程序實際工作的線程的。從用戶角度看,進程是不用任何專門工具就可以看到的組件。進程對其他應用程序組件的作用就像容器一樣。它持有虛擬的存儲空間、數據、系統資源和應用程序設置。雖然線程可以分配、重新分配和釋放內存,但是進程接受初始的內存分配,并將它分配到請求內存的所有線程。線程是包含在進程內共享所有進程資源的單個執行路徑。它還包含堆棧(存儲在內存中的變量和其他數據)、CPU寄存器的狀態信息(所以,線程可以恢復它的環境)、和在系統調度程序的執行列表中的一個登錄項。每個線程規定了完成任務應用程序需要作的某種工作。
使用Task Manager的主要問題是看不到任何線程。Task Manager被設計成從進程層將應用程序作為整體看待。當然還可以使用性能監視器來監視Windows下的Oracle內存使用。
從“開始/程序/管理工具”選擇“性能”啟動“系統監視器”。注意,“性能”包括兩個MMC插件:“系統監視器”和“性能日志和變更”。這時,需要一些被監視的計數器(計數器是一些性能指示器,用于對 Windows 2000的特殊對象進行統計,例如統計特定線程所要求的處理器時間)。單擊“添加”按鈕(在圖中看起來象一個加號),將看到“添加計數器”對話框。首先需要選擇想監視的“性能”對象。在包含“進程”對象和“線程”對象的“性能”下拉列表中選擇。
進程觀察器(Process Viewer)是比較容易檢查線程和進程的方法之一。可以在 Windows 2000 Support Tools 或Windows 2000 Resource Kit內找到一些工具。Windows 2000 Support Tools是Windows 2000的一部分,但是并不自動安裝。支持安裝的Windows Installer文件在%CDROM%\SUPPORT\TOOLS\目錄下。只要在2000RKST.MSJ上右擊,并從context菜單上選擇安裝即可。
內存
基于線程的結構的確有一些內存限制,因為單個進程由線程組成,而進程的地址空間是受限的,因此很少有空間是機動的。因為Windows 2000仍然是32為操作系統,單個進程地址空間被限制在4GB內,其中一半被操作系統保留,這2GB被OS保留的系統內存也被視為系統地址空間,他包括OS內核編碼、硬件抽象層編碼(HAL)和需要管理進程和OS交互的不同的其它結構,這2GB的系統地址空間是禁止應用程序進程訪問的。因此,Windows 2000標準服務器單個應用程序進程可使用內存空間共2GB。在Windows 2000高級服務器啟動文件boot.ini中有/3GB開關,改變這個比例到3GB,這項技術被稱作4GB調優(4-gigabyte tuning,或4GT),我們將針對這個問題展開詳細討論。
保留的內存是分配給線程的內存并且留作將來使用,但沒有實際使用的內存。因為沒有實際使用,因此它對其它進程仍然有效。但是,因為它已經被分配,它仍然由對擁有線程的進程的總的內存限制產生,因此,保留內存的計算針對2GB或3GB的限制,并且進程保留的和使用的內存的總和不能超過這個限制。
除了系統中安裝的物理內存之外,Windows 2000還使用虛擬內存。這實際上是駐留在硬盤上的內存。但是Windows 2000使得它對應用程序來說,就像是安裝在機器上內存一樣。當某個應用程序塊要求訪問那個內存時,Windows 2000就把另外的內存塊復制到磁盤上,而把所要求的內存放到物理內存中,這些內存塊的大小是4KB。也就是說,每次應用程序提出對內存的要求時,內存就被分配在4KB的頁面內。在磁盤上模擬內存的文件叫做頁面調度文件。Virtual Memory Manager(VMM虛擬內存管理器)是操作系統管理機器上的虛擬內存組件。所有的內存訪問都通過VMM。這意味著每當操作系統需要進行內存調頁時,就要提出VMM請求。
內存調優方法:
(一)使用超過4GB的內存
另外,有辦法允許為單個進程或應用分配超過32位地址空間的內存,為實現這一點,Windows 2000使用物理地址擴展(physical address extensions ,或PAE),PAE本質上把地址空間從32位增加到36位,但是必須有Pentium Pro或更新的處理器才能享受這個優勢。在Windows NT 4.0下,Intel提供PSE36驅動程序享受全部36位地址空間的優勢,但是在Windows 2000 Advanced Server中36位地址空間的支持已經建立在操作系統中,然而,應用程序必須使用地址窗口擴展(Address Windowing Extensions ,或AWE)API寫成,Oracle9i 發行號1(Release 1)不支持AWE,所有的Oracle 8i發行號(releases 8.1.5–8.1.7)都支持AWE。Oracle在9i發行號2(Release 2)中實現了對AWE的支持。
(二)AWE和Windows 2000
AWE允許你使用系統中任何附加的超過4GB的內存,為了體現這個優勢,你必須有超過4GB的內存,必須有Pentium Pro或更新的處理器,必須運行Windows 2000高級服務器或Windows 2000數據中心服務器,不需要特殊的驅動程序,因為Windows 2000已經支持AWE。
為了利用這項優勢,必須在啟動Windows 2000機器時在boot.ini文件中使用/PAE開關,你必須確保運行Oracle服務的帳戶有Lock Pages in Memory權限。給運行Oracle服務的帳戶增加Lock Pages in Memory權限后,要重新啟動OracleService 服務。
(三)AWE和Oracle
可以確定,Oracle8i所有發行號版本和Oracle9i發行號2只允許你為數據庫塊緩沖區配置超過4GB限制的內存空間,因此,要為用戶連接釋放標準進程地址空間的內存(低于3GB界限的內存)、PGA內存和組成SGA的不同內存緩沖池。
在初始化參數文件init.ora中要設置參數USE_INDIRECT_DATA_BUFFERS=TRUE,沒有這個參數,Oracle不能尋址到4GB以上的地址空間。接下來要設置決定內存使用總量的緩沖池大小,設定DB_BLOCK_SIZE和DB_BLOCK_BUFFERS兩個參數。
在Oracle9i發行號2中,參數DB_BLOCK_BUFFERS被參數DB_CACHE_SIZE所代替,這樣就改變了原來指定緩沖區塊數到指定緩沖區字節數,同樣,也解釋了在Oracle9i發行號2的一個數據庫中支持多個數據庫塊大小。無論用哪種辦法,如果你設定參數USE_INDIRECT_BUFFERS=TRUE,你將只能定義和使用單個數據庫塊大小和塊緩沖區(就象在9i以前的發行號中),因此,如果缺省數據庫塊大小是4k、8k或其它,而設置DB_2k_CACHE_SIZE是不允許的。
接下來需要在注冊表中為ORACLE_HOME設置合適的AWE_WINDOW_MEMORY參數值,也就是在HKEY_LOCAL_MACHINE\ Software\Oracle\HOME0下,這個參數指定字節數,如果沒有設置,缺省值是1 GB。這個參數的大小取決于你要設置多少緩沖區大小,并視為來自3GB進程地址空間的常規內存。以緩沖區大小為6 GB為例,設置AWE_WINDOW_MEMORY為缺省值1GB,你希望1GB 視為常規內存,并且剩余5GB緩沖區來自4GB限制以上的地址空間。你希望更多的緩沖池盡可能保留在常規地址空間,因為訪問超過4GB以上的緩沖池比訪問虛擬地址空間緩沖池要慢(盡管仍然比磁盤I/O操作快)。
(四)解決與AWE相關的內存問題
需要注意的是每個4GB界限以上的塊緩沖區需要在常規地址空間保留大約200字節的緩沖區頭,因此,在上面的例子中,我們大約有312000個緩沖區頭指向擴展地址空間的緩沖區,緩沖區頭大約占80MB常規內存空間,如果數據庫塊很小,那么這個數量會相當高,因此,必須確保這些緩沖區頭、AWE_WINDOW_MEMORY、和所有Oracle.exe進程的內存需求,包括編碼、SGA其它組件、PGA內存和每個用戶連接棧都適合Oracle.exe進程的常規3GB虛擬地址空間。
確認你有足夠的物理內存處理超過AWE_WINDOW_MEMORY之外的DB_BLOCK_BUFFERS,在我們的例子中定義緩沖池大小為6GB,1GB來自常規地址空間,剩余5GB來自4GB以外的對整個進程有效的系統和進程地址空間,因此,這個例子只能工作在至少有9GB內存的機器上,你還應該為其它進程保留一些空間,只有一個進程可以在某一時刻訪問附加的內存。
象前面所說的那樣,/PAE開關只用于系統有超過4GB物理內存的時候,但如果系統內存少于4GB時,也可模仿這項功能。在boot.ini文件中設置MAXMEM參數的值,如下面例子,設為2GB,意味著任何2GB以上的內存都將保留為AWE內存。
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced
Server" /fastdetect /PAE /MAXMEM:2048
為一個數據庫使用附加的多個進程
真正的應用集群(Real Applications Clusters,RAC)提供有多個實例運行和訪問同一數據的能力。通常,這用于有兩個或多個節點的項目,一個實例運行在每個節點。無論如何,它支持在Oracle9i有兩個實例運行在一個節點訪問同一個數據庫。這能克服每個進程的內存限制,又提供某些其它的利益,如應用程序失敗檢測。
前一陣,單位的oralce突然當機了.檢查原因.一看原來SGA的內存只有1.4G太小了.那就調吧.準備先調到3G可是一調報錯了.查了相關資料原來發現是oracle的限制.
我的電腦配置:
CPU:至強2.8X8、內存:12G、硬盤:1T、磁盤陣列5
以下是操作步驟
1.打開開關 boot.ini 增加 /3G /PAE
為什么要加二個呢.有的資料是這么說的:同時使用內存最到能夠支持到16G,如果用使用16G以上的內存,則必須選擇其中的一種使用了。以下是我的boot文件
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /3G /PAE /fastdetect
2.修改注冊表
HKEY_Local_Machine-software-oracle-homeX(代表不同的數0,1,2,3...)
在 他的里面增加一個DWORD值,名稱為AWE_WINDOW_MEMORY 里面的內存是十六進制數,單位為字節,比如你要增加200M就要在里面寫上200X1024X1024=209715200 即200M大小,那么oracle的數據緩沖區將占用200M的普通內存,其余部分(1G - 200M = 824M)則使用間接內存。我填寫的是1024X1024X1024=1048576000,1G內存。大小為你需要讓oracle使用普通內存作為緩存的大小(不是windows讓出來的1G,而是內存地址在0x00000000 到 0x7FFFFFFF 之間的內存大小)這樣在Windows的注冊表中的HKLM\Software\Oracle\HomeX下的AWE_WINDOW_MEMORY若未設定,默認值為1024M。下面會說明這個值的具體計算方法。
3.打開本地安全策略,將本地策略中的用戶權利指派下的“內存中鎖定頁”(Lock Pages in Memory權限)權限賦給管理員(運行Oracle的用戶).
4.重起計算機
5.如果你的是oracle 9.0.2.1就要下載補丁了要用oracle 9.0.2.7 就要去網上下了
6.接下來就是要配oralce的參數
需要設置的參數如下(通過PFILE、SPFILE都可以,注意先備份,免得出錯無法啟動Oracle):
#如果設置了這個參數,對于Oracle9.2.0的版本則不能再使用DB_CACHE_SIZE參數了,只能使用DB_BLOCK_BUFFERS參數。擴展的內存只能增加到BUFFER CACHE中去使用,因此只能增大DB_BLOCK_BUFFERS這個參數去擴展SGA區。
USE_INDIRECT_DATA_BUFFERS=TRUE
#乘數據庫塊的大小,為高速緩存的大小。
#reset掉參數DB_CACHE_SIZE
DB_BLOCK_BUFFERS=262144 #若塊大小為4096,則為1G
# 把oracle SGA鎖定到內存中,不產生頁面交換文件(8i的參數可能是lock_sga = true)
# 對于一個有4G物理內存的系統來講,可能這一個參數并不是必須的
pre_page_sga = true
#使用命令,注意雙引號,alter system set "_db_block_lru_latches"=64 scope=spfile;
_db_block_lru_latches=64
設置完畢。
_db_block_lru_latches = (Max buffer pools * SETS_PER_POOL)
Max Buffer Pools是個常量,等于8,SETS_PER_POOL是個變量,它的大小由是否啟用VLM(即設定USE_INDIRECT_DATA_BUFFERS=TRUE參數)決定:
SETS_PER_POOL = 2* CPU_COUNT (啟用 VLM)
SETS_PER_POOL= CPU Count /2 (不啟用VLM)
例如:
CPU's = 16
DB_BLOCK_SIZE = 8192
Total RAM = 16 GB
SETS_PER_POOL = 2 * CPU_COUNT = 32
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*32 = 256 MIN(AWE_WINDOW_MEMORY)=(4096*DB_BLOCK_SIZE*_DB_BLOCK_LRU_LATCHES)/8 =( 4096 * 8192 * 256) / 8 = 1073741824 bytes = 1024 MB
這樣在Windows的注冊表中的HKLM\Software\Oracle\Homex下的AWE_WINDOW_MEMORY值至少是1024M,否則就會提示錯誤:
ORA-27102 out of memory
OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD
O/S Error: (OS

另外幾篇文章:
(第一篇)redhat
-----------------------------------
今天一臺Linux服務器擴展了一下內存,達到4G,開發的人自己修改了一下SGA結果數據庫無法啟動了.
啟動不了時,出的錯誤是這個樣子的:
[oracle@neirong oracle]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Fri Nov 25 15:43:26 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to an idle instance.
SQL> startup
ORA-27123: unable to attach to shared memory segment
Linux Error: 22: Invalid argument
Additional information: 1
Additional information: 458753
SQL> exit
Disconnected
在32位平臺上,缺省的SGA最大只能擴展到1.7G,如果需要支持更大的內存,就需要降低mapped_base,重新Link Oracle軟件.
俺的平臺為:
[oracle@neirong bdump]$ cat /etc/redhat-release
Red Hat Enterprise Linux AS release 3 (Taroon Update 2)
簡單操作如下:
cd $ORACLE_HOME/rdbms/lib
cp ksms.s ksms.s.bak
genksms -s 0x12000000 > ksms.s
make -f ins_rdbms.mk ksms.o
make -f ins_rdbms.mk ioracle
此處先備份ksms.s文件,如果編譯過程中出現錯誤,保證操作可以被恢復:
恢復步驟大致如下:
cd $ORACLE_HOME/rdbms/lib
cp ksms.s.bak ksms.s
genksms > ksms.s
make -f ins_rdbms.mk ksms.o
make -f ins_rdbms.mk ioracle
以下是操作日志:
[oracle@neirong dbs]$ cd $ORACLE_HOME/rdbms/lib
[oracle@neirong lib]$ genksms -s 0x12000000 > ksms.s
[oracle@neirong lib]$ make -f ins_rdbms.mk ksms.o
[oracle@neirong lib]$ make -f ins_rdbms.mk ioracle
- Linking Oracle
rm -f /opt/oracle/product/9.2.0/rdbms/lib/oracle
gcc -o /opt/oracle/product/9.2.0/rdbms/lib/oracle -L/opt/oracle/product/9.2.0/rdbms/lib/
-L/opt/oracle/product/9.2.0/lib/ -L/opt/oracle/product/9.2.0/lib/stubs/
-Wl,-E `test -f /opt/oracle/product/9.2.0/rdbms/lib/skgaioi.o && echo
/opt/oracle/product/9.2.0/rdbms/lib/skgaioi.o` /opt/oracle/product/9.2.0/rdbms/lib/opimai.o
/opt/oracle/product/9.2.0/rdbms/lib/ssoraed.o /opt/oracle/product/9.2.0/rdbms/lib/ttcsoi.o
/opt/oracle/product/9.2.0/lib/nautab.o /opt/oracle/product/9.2.0/lib/naeet.o
/opt/oracle/product/9.2.0/lib/naect.o /opt/oracle/product/9.2.0/lib/naedhs.o
/opt/oracle/product/9.2.0/rdbms/lib/config.o -lserver9 -lodm9 -lskgxp9 -lskgxn9 -lclient9
-lvsn9 -lwtcserver9 -lcommon9 -lgeneric9 /opt/oracle/product/9.2.0/rdbms/lib/defopt.o
-lknlopt `if /usr/bin/ar tv /opt/oracle/product/9.2.0/rdbms/lib/libknlopt.a | grep
xsyeolap.o > /dev/null 2>&1 ; then echo "-loraolap9" ; fi`
-lslax9 -lpls9 -lplp9 -lserver9 -lclient9 -lvsn9 -lwtcserver9 -lcommon9 -lgeneric9
-lknlopt -lslax9 -lpls9 -lplp9 -ljox9 -lserver9 -locijdbcst9 -lwwg9
`cat /opt/oracle/product/9.2.0/lib/ldflags` -lnsslb9 -lncrypt9 -lnsgr9 -lnzjs9
-ln9 -lnl9 -lnro9 `cat /opt/oracle/product/9.2.0/lib/ldflags` -lnsslb9 -lncrypt9
......
mv -f /opt/oracle/product/9.2.0/bin/oracle /opt/oracle/product/9.2.0/bin/oracleO
mv /opt/oracle/product/9.2.0/rdbms/lib/oracle /opt/oracle/product/9.2.0/bin/oracle
chmod 6751 /opt/oracle/product/9.2.0/bin/oracle
此后數據庫可以以超過1.7G的SGA區設置啟動:
SQL> startup
ORACLE instance started.
Total System Global Area 2685476820 bytes
Fixed Size 454612 bytes
Variable Size 1073741824 bytes
Database Buffers 1610612736 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
(第二篇)WINDOWS平臺上擴展SGA
-----------------------
針對32bit的Windows。Windows2000上不能利用超過4G的內存,一般是2G的內存保留給進程,2G內存保留給核心的。在Windows2000 Advanced Server上可以分配3G給進程,1G留給核心的。
1. 如果機器的內存在4G以下,可以使用Physical Address Extensions(PAE)或者是Address Windowing Extensions(AWE)進行擴展,如果機器內存大于4GB就只能使用AWE進行擴展了。
AWE支持以下的Windows操作系統:
Windows 2000 Datacenter Server
Windows 2000 Advanced Server
Windows 2003 Datacenter Edition(32bit)
Windows 2003 Enterprise Edition(32bit)
AWE不支持以下的Windows操作系統:
Windows 2000 Server(Standard)
Windows2000 Professional
Windows XP Home Edition
Windows XP Professional
Windows 2003 Standard Edition
Windows 2003 Web Edition
AWE支持的Oracle數據庫的版本:
Oracle 8.1.6.X
Oracle 8.1.7.X
Oracle 9.2.X
AWE不支持Oracle9.0.1.X
在標準版的Oracle9.2.0.1上,如果你設置了use_indirect_data_buffers=true,啟動就會報錯:
ORA-439-feature not enabled:very large memory.
這個是標準版的Oracle的9.2.0.1的一個bug(#2520796),在Oracle9.2.0.2中解決了。
2. 在操作系統上啟動AWE
AWE在操作系統上可以通過在boot.ini文件中加/PAE切換啟用。
例如:
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server" /PAE
也可以同時使用/PAE和/3G在同一臺機器上,例如:
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server" /3GB /PAE
但是同時使用內存最到能夠支持到16G,如果用使用16G以上的內存,則必須選擇其中的一種使用了。
3. 在Oracle上啟用AWE
首先要在啟動的參數文件中設置參數
USE_INDIRECT_DATA_BUFFERS=TRUE
如果設置了這個參數,對于Oracle9.2.0的版本則不能再使用DB_CACHE_SIZE參數了,只能使用DB_BLOCK_BUFFERS參數。
擴展的內存只能增加到BUFFER CACHE中去使用,因此只能增大DB_BLOCK_BUFFERS這個參數去擴展SGA區。
4. AWE_WINDOW_MEMORY實現故障解決
在Oracle8.1.7版本以下啟動數據庫的時候不用設置AWE_WINDOW_MEMORY的最小值,而在Oracle9.2.0的版本中則強制要設置AWE_WINDOW_MEMORY的最小值,這個最小值在Oracle8.1.7中通過DB_BLOCK_LRU_LATCHES參數設定,在Oracle9.2.0中則通過_DB_BLOCK_LRU_LATCHES隱含參數設定,Oracle9.2.0的AWE_WINDOW_MEMORY的最小值由以下的公式計算:
MIN(AWE_WINDOW_MEMORY)=(4096 * DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES)/8
_DB_BLOCK_LRU_LATCHES = (Max buffer pools * SETS_PER_POOL)
Max Buffer Pools是個常量,等于8,SETS_PER_POOL是個變量,它的大小由是否啟用VLM(即設定USE_INDIRECT_DATA_BUFFERS=TRUE參數)決定:
SETS_PER_POOL = 2* CPU_COUNT (啟用 VLM)
SETS_PER_POOL= CPU Count /2 (不啟用VLM)
例如:
CPU's = 16
DB_BLOCK_SIZE = 8192
Total RAM = 16 GB
SETS_PER_POOL = 2 * CPU_COUNT = 32
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*32 = 256 MIN(AWE_WINDOW_MEMORY)=(4096*DB_BLOCK_SIZE*_DB_BLOCK_LRU_LATCHES)/8 =( 4096 * 8192 * 256) / 8 = 1073741824 bytes = 1024 MB
這樣在Windows的注冊表中的HKLM\Software\Oracle\Homex下的AWE_WINDOW_MEMORY值至少是1024M,否則就會提示錯誤:
ORA-27102 out of memory
OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD
O/S Error: (OS

(第三篇)windows內存調優
內存優化是Windows平臺的關鍵設置,首先了解一下Windows 2000平臺的Oracle結構:
基于線程的結構
Windows2000是基于線程的結構,相反,Unix操作系統是基于進程的結構。這意味著Windows中更多的應用,包括Oracle在內,是以帶有多個線程的單個進程的形式執行,這種基于線程的結構的確給Window2000帶來優勢——更容易共享內存。內存空間為每個進程分配,進程間共享內存很笨拙,要使用附加編碼,線程是進程的子集,使用比進程少得多的內存。特定進程的所有線程共享同樣的進程內存空間,同一進程的線程間共享內存比不同進程共享內存要快,這給基于線程的結構很大優勢,更有效。
在服務器上運行的每個應用程序都有一個,而且只有一個進程。進程是應用程序的載體,是用來容納執行應用程序實際工作的線程的。從用戶角度看,進程是不用任何專門工具就可以看到的組件。進程對其他應用程序組件的作用就像容器一樣。它持有虛擬的存儲空間、數據、系統資源和應用程序設置。雖然線程可以分配、重新分配和釋放內存,但是進程接受初始的內存分配,并將它分配到請求內存的所有線程。線程是包含在進程內共享所有進程資源的單個執行路徑。它還包含堆棧(存儲在內存中的變量和其他數據)、CPU寄存器的狀態信息(所以,線程可以恢復它的環境)、和在系統調度程序的執行列表中的一個登錄項。每個線程規定了完成任務應用程序需要作的某種工作。
使用Task Manager的主要問題是看不到任何線程。Task Manager被設計成從進程層將應用程序作為整體看待。當然還可以使用性能監視器來監視Windows下的Oracle內存使用。
從“開始/程序/管理工具”選擇“性能”啟動“系統監視器”。注意,“性能”包括兩個MMC插件:“系統監視器”和“性能日志和變更”。這時,需要一些被監視的計數器(計數器是一些性能指示器,用于對 Windows 2000的特殊對象進行統計,例如統計特定線程所要求的處理器時間)。單擊“添加”按鈕(在圖中看起來象一個加號),將看到“添加計數器”對話框。首先需要選擇想監視的“性能”對象。在包含“進程”對象和“線程”對象的“性能”下拉列表中選擇。
進程觀察器(Process Viewer)是比較容易檢查線程和進程的方法之一。可以在 Windows 2000 Support Tools 或Windows 2000 Resource Kit內找到一些工具。Windows 2000 Support Tools是Windows 2000的一部分,但是并不自動安裝。支持安裝的Windows Installer文件在%CDROM%\SUPPORT\TOOLS\目錄下。只要在2000RKST.MSJ上右擊,并從context菜單上選擇安裝即可。
內存
基于線程的結構的確有一些內存限制,因為單個進程由線程組成,而進程的地址空間是受限的,因此很少有空間是機動的。因為Windows 2000仍然是32為操作系統,單個進程地址空間被限制在4GB內,其中一半被操作系統保留,這2GB被OS保留的系統內存也被視為系統地址空間,他包括OS內核編碼、硬件抽象層編碼(HAL)和需要管理進程和OS交互的不同的其它結構,這2GB的系統地址空間是禁止應用程序進程訪問的。因此,Windows 2000標準服務器單個應用程序進程可使用內存空間共2GB。在Windows 2000高級服務器啟動文件boot.ini中有/3GB開關,改變這個比例到3GB,這項技術被稱作4GB調優(4-gigabyte tuning,或4GT),我們將針對這個問題展開詳細討論。
保留的內存是分配給線程的內存并且留作將來使用,但沒有實際使用的內存。因為沒有實際使用,因此它對其它進程仍然有效。但是,因為它已經被分配,它仍然由對擁有線程的進程的總的內存限制產生,因此,保留內存的計算針對2GB或3GB的限制,并且進程保留的和使用的內存的總和不能超過這個限制。
除了系統中安裝的物理內存之外,Windows 2000還使用虛擬內存。這實際上是駐留在硬盤上的內存。但是Windows 2000使得它對應用程序來說,就像是安裝在機器上內存一樣。當某個應用程序塊要求訪問那個內存時,Windows 2000就把另外的內存塊復制到磁盤上,而把所要求的內存放到物理內存中,這些內存塊的大小是4KB。也就是說,每次應用程序提出對內存的要求時,內存就被分配在4KB的頁面內。在磁盤上模擬內存的文件叫做頁面調度文件。Virtual Memory Manager(VMM虛擬內存管理器)是操作系統管理機器上的虛擬內存組件。所有的內存訪問都通過VMM。這意味著每當操作系統需要進行內存調頁時,就要提出VMM請求。
內存調優方法:
(一)使用超過4GB的內存
另外,有辦法允許為單個進程或應用分配超過32位地址空間的內存,為實現這一點,Windows 2000使用物理地址擴展(physical address extensions ,或PAE),PAE本質上把地址空間從32位增加到36位,但是必須有Pentium Pro或更新的處理器才能享受這個優勢。在Windows NT 4.0下,Intel提供PSE36驅動程序享受全部36位地址空間的優勢,但是在Windows 2000 Advanced Server中36位地址空間的支持已經建立在操作系統中,然而,應用程序必須使用地址窗口擴展(Address Windowing Extensions ,或AWE)API寫成,Oracle9i 發行號1(Release 1)不支持AWE,所有的Oracle 8i發行號(releases 8.1.5–8.1.7)都支持AWE。Oracle在9i發行號2(Release 2)中實現了對AWE的支持。
(二)AWE和Windows 2000
AWE允許你使用系統中任何附加的超過4GB的內存,為了體現這個優勢,你必須有超過4GB的內存,必須有Pentium Pro或更新的處理器,必須運行Windows 2000高級服務器或Windows 2000數據中心服務器,不需要特殊的驅動程序,因為Windows 2000已經支持AWE。
為了利用這項優勢,必須在啟動Windows 2000機器時在boot.ini文件中使用/PAE開關,你必須確保運行Oracle服務的帳戶有Lock Pages in Memory權限。給運行Oracle服務的帳戶增加Lock Pages in Memory權限后,要重新啟動OracleService 服務。
(三)AWE和Oracle
可以確定,Oracle8i所有發行號版本和Oracle9i發行號2只允許你為數據庫塊緩沖區配置超過4GB限制的內存空間,因此,要為用戶連接釋放標準進程地址空間的內存(低于3GB界限的內存)、PGA內存和組成SGA的不同內存緩沖池。
在初始化參數文件init.ora中要設置參數USE_INDIRECT_DATA_BUFFERS=TRUE,沒有這個參數,Oracle不能尋址到4GB以上的地址空間。接下來要設置決定內存使用總量的緩沖池大小,設定DB_BLOCK_SIZE和DB_BLOCK_BUFFERS兩個參數。
在Oracle9i發行號2中,參數DB_BLOCK_BUFFERS被參數DB_CACHE_SIZE所代替,這樣就改變了原來指定緩沖區塊數到指定緩沖區字節數,同樣,也解釋了在Oracle9i發行號2的一個數據庫中支持多個數據庫塊大小。無論用哪種辦法,如果你設定參數USE_INDIRECT_BUFFERS=TRUE,你將只能定義和使用單個數據庫塊大小和塊緩沖區(就象在9i以前的發行號中),因此,如果缺省數據庫塊大小是4k、8k或其它,而設置DB_2k_CACHE_SIZE是不允許的。
接下來需要在注冊表中為ORACLE_HOME設置合適的AWE_WINDOW_MEMORY參數值,也就是在HKEY_LOCAL_MACHINE\ Software\Oracle\HOME0下,這個參數指定字節數,如果沒有設置,缺省值是1 GB。這個參數的大小取決于你要設置多少緩沖區大小,并視為來自3GB進程地址空間的常規內存。以緩沖區大小為6 GB為例,設置AWE_WINDOW_MEMORY為缺省值1GB,你希望1GB 視為常規內存,并且剩余5GB緩沖區來自4GB限制以上的地址空間。你希望更多的緩沖池盡可能保留在常規地址空間,因為訪問超過4GB以上的緩沖池比訪問虛擬地址空間緩沖池要慢(盡管仍然比磁盤I/O操作快)。
(四)解決與AWE相關的內存問題
需要注意的是每個4GB界限以上的塊緩沖區需要在常規地址空間保留大約200字節的緩沖區頭,因此,在上面的例子中,我們大約有312000個緩沖區頭指向擴展地址空間的緩沖區,緩沖區頭大約占80MB常規內存空間,如果數據庫塊很小,那么這個數量會相當高,因此,必須確保這些緩沖區頭、AWE_WINDOW_MEMORY、和所有Oracle.exe進程的內存需求,包括編碼、SGA其它組件、PGA內存和每個用戶連接棧都適合Oracle.exe進程的常規3GB虛擬地址空間。
確認你有足夠的物理內存處理超過AWE_WINDOW_MEMORY之外的DB_BLOCK_BUFFERS,在我們的例子中定義緩沖池大小為6GB,1GB來自常規地址空間,剩余5GB來自4GB以外的對整個進程有效的系統和進程地址空間,因此,這個例子只能工作在至少有9GB內存的機器上,你還應該為其它進程保留一些空間,只有一個進程可以在某一時刻訪問附加的內存。
象前面所說的那樣,/PAE開關只用于系統有超過4GB物理內存的時候,但如果系統內存少于4GB時,也可模仿這項功能。在boot.ini文件中設置MAXMEM參數的值,如下面例子,設為2GB,意味著任何2GB以上的內存都將保留為AWE內存。
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced
Server" /fastdetect /PAE /MAXMEM:2048
為一個數據庫使用附加的多個進程
真正的應用集群(Real Applications Clusters,RAC)提供有多個實例運行和訪問同一數據的能力。通常,這用于有兩個或多個節點的項目,一個實例運行在每個節點。無論如何,它支持在Oracle9i有兩個實例運行在一個節點訪問同一個數據庫。這能克服每個進程的內存限制,又提供某些其它的利益,如應用程序失敗檢測。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
