關於32位oracle擴充套件SGA的一些問題

space6212發表於2019-07-14

由於32位下作業系統的程式訪問4g(2的32次方)以下的虛擬地址,而這4g的地址又要為核心、可執行程式碼、共享庫等保留地址空間,所以,實際上可以留給SGA的空間只有1.7G左右。

但32位的linux 為可執行程式碼、共享庫保留的地址空間太大,我們可以降低這部分的地址空間,騰出更多的虛擬地址空間給SGA,從而達到擴充套件SGA的目的。


關於32位oracle擴充套件SGA的一些問題:

一、擴充套件的基本步驟
1. lowering the mapped_base in Linux
降低linux程式的mapped_base。這步需要用shell修改程式的mappend_base。
步驟如下:
1)建立一個shell指令碼,假設叫/usr/bin/lower_mapped_base.sh,指令碼內容如下:

#/bin/sh
echo 268435456 > /proc/$PPID/mapped_base

2)修改指令碼的屬性
分別執行如下命令:
chown root.root lower_mapped_base.sh
chmod 755 lower_mapped_base.sh

3)授權,使其他使用者可以透過sudo執行該指令碼

echo "oracle ALL=NOPASSWD: /usr/bin/lower_mapped_base.sh" >> /etc/sudoers

4)讓oracle使用者登入時自動執行指令碼
在oracle使用者下執行:
echo "sudo /usr/local/bin/ChangeMappedBase" >> ~/.bash_profile

或者直接編輯~/.bash_profile檔案,假如下面這一句:
sudo /usr/local/bin/ChangeMappedBase

到這裡,這一步工作就算完成了。
注意:
1)程式與oracle共享庫的mapped_base必須一致,否則會出錯。如用修改了程式的mapped_base的伺服器的sqlplus連線沒有編譯過共享庫的資料庫,就會報錯。
2)這一步驟只需要在Linux as 2.1上執行,在linux as3/4上,共享庫的mapped_base已經降得很低,不需要再手工去降低它了。


2. lowering the sga_base in Oracle
降低SGA的起點,也就是sga_base。這步需要編譯oracle的共享庫。步驟如下:
1)關閉資料庫,並進入相關目錄
SQL> shutdown

cd $ORACLE_HOME/rdbms/lib

2)在修改前做備份
如果ksms.s檔案不存在可跳過這一步
[[ ! -f ksms.s_orig ]] && cp ksms.s ksms.s_orig

3)修改SGA起點地址
genksms -s 0x12000000 > ksms.s

其中0x12000000表示300M,可以從下面查到(預設是0x40000000,相當於1G)
SQL> select to_number('12000000','xxxxxxxxxxxxxxx') from dual;

TO_NUMBER('12000000','XXXXXXXX
------------------------------
301989888

4)新建ksms檔案

make -f ins_rdbms.mk ksms.o

5)重新編譯
實際上是重新生成$ORACLE_HOME/bin/oracle這個檔案:
make -f ins_rdbms.mk ioracle

到此,降低SGA起點得工作就完成了。

二、不同版本的linux必須執行的步驟

其中1表示lowering the mapped_base in Linux
2表示lowering the sga_base in Oracle

9iR2 10gR1 10gR2*
====================================
RHEL 2.1 x86 1,2 1,2 ---
RHEL 3 x86 2 2 2*
RHEL 4 x86 2 2 2*
SLES 8 x86 1,2 --- ---
SLES 9 x86 1,2 1,2 1,2**

從以上圖表可以看出,要擴充套件SGA:
. linux 2.1需要執行兩個步驟
. linux as3/4都只需要執行第二個步驟。
. 10g r1需要執行第二步
. 10g r2兩個步驟都不需要執行

執行了擴充套件SGA的步驟後,理論上可使用的SGA大小為:
. 9i/10g r1在smp kernel 核心下為2.7 G
. 9i/10g r1在hugemem kernel下為3.42G(不擴充套件的話為2.7G)
. 10g r2在smp kernel 核心下為2.2 G
. 10g r2在smp kernel 核心下為3.3 G


三、其它問題

1、以上討論都是基於不使用VLM前提的。實際上,在LINUX AS 2.1/3可以使用VLM,可以把32位的linux虛擬成36位的,這樣就不需要以做以上步驟來擴充套件SGA了。
2、不同的linux核心下在不同的oracle版本下可使用的最大SGA是不一樣的

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

相關文章