oracle 9i 突破win2003記憶體限制

wallimn發表於2011-08-30
轉自: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區。
[color=green]USE_INDIRECT_DATA_BUFFERS=TRUE[/color]
#乘資料庫塊的大小,為快取記憶體的大小。
#reset掉引數DB_CACHE_SIZE
[color=green]DB_BLOCK_BUFFERS=262144[/color] #若塊大小為4096,則為1G
# 把oracle SGA鎖定到記憶體中,不產生頁面交換檔案(8i的引數可能是lock_sga = true)
# 對於一個有4G實體記憶體的系統來講,可能這一個引數並不是必須的
[color=green]pre_page_sga = true[/color]
#使用命令,注意雙引號,alter system set "_db_block_lru_latches"=64 scope=spfile;
[color=green]_db_block_lru_latches=64 [/color]
設定完畢。

[color=red]_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 8) Not enough storage is available to process this command [/color]

另外幾篇文章:
(第一篇)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)
簡單操作如下:
[b]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
[/b]
此處先備份ksms.s檔案,如果編譯過程中出現錯誤,保證操作可以被恢復:
恢復步驟大致如下:
[b]
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
[/b]以下是操作日誌:
[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 8) 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有兩個例項執行在一個節點訪問同一個資料庫。這能克服每個程式的記憶體限制,又提供某些其它的利益,如應用程式失敗檢測。

相關文章