oracle服務器內存設置

一、oracle內存結構

內存結構=SGA(系統全局區)+PGA(程序全局區)
(一)、SGA

SGA是用於存儲數據庫信息的內存區,該信息爲數據庫進程所共享。它包含Oracle 服務器的數據和控制信息,它是在Oracle服務器所駐留的計算機的實際內存中得以分配,如果實際內存不夠再往虛擬內存中寫
設置SGA時,理論上SGA可佔OS系統物理內存的1/2——1/3
原則:SGA+PGA+OS使用內存<總物理RAM
SGA=((db_block_buffers*blocksize)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB

1、SGA系統全局區.(包括以下五個區)
A、數據緩衝區:(db_block_buffers)存儲由磁盤數據文件讀入的數據。
大小: db_block_buffers*db_block_size 
        設置數據緩衝區爲:Db_cache_size
        原則:SGA中主要設置對象,一般爲可用內存40%。
B、共享池:(shared_pool_size):數據字典,sql緩衝,pl/sql語法分析.加大可提速度。
        則:SGA中主要設置對象,一般爲可用內存10%
C、日誌緩衝區:(log_buffer)存儲數據庫的修改信息.
        原則:128K ---- 1M 之間,不應該太大
D 、JAVA池(Java_pool_size)主要用於JAVA語言的開發.
        原則:若不使用java,原則上不能小於20M,給30M通常就夠了
E、 大池(Large_pool_size)  如果不設置MTS,主要用於數據庫備份恢復管理器RMAN。
        原則:若不使用MTS,5---- 10M 之間,不應該太大
SGA=. db_block_buffers*db_block_size+ shared_pool_size+ log_buffer+Java_pool+size+large_pool_size
      原則: 達到可用內存的55-58%就可以了.

 

(二)、PGA程序全局區
PGA:包含單個服務器進程或單個後臺進程的數據和控制信息,與幾個進程共享的SGA 正相反PGA 是隻被一個進程使用的區域,PGA 在創建進程時分配在終止進程時回收.
A、Sort_area_size 用於排序所佔內存
B、Hash_area_size 用於散列聯接,位圖索引
這兩個參數在非MTS下都是屬於PGA ,不屬於SGA,是爲每個session單獨分配的,在我們的服務器上除了OS + SGA,一定要考慮這兩部分
原則:OS 使用內存+SGA+併發執行進程數*(sort_area_size+hash_ara_size+2M) < 0.7*總內存
實例配置
一:物理內存多大
二:操作系統估計需要使用多少內存
三:數據庫是使用文件系統還是裸設備
四:有多少併發連接
五:應用是OLTP 類型還是OLAP 類型
 

 

二、oracle memory_target參數

Oracle9i引入pga_aggregate_target,可以自動對PGA進行調整;
Oracle10引入sga_target,可以自動對SGA進行調整。
Oracle11g則對這兩部分進行綜合,引入memory_target,可以自動調整所有的內存,這就是新引入的自動內存管理特性。

 

設置memory_target參數後,實際上Oracle會自動設置並調整以下兩個參數來分配SGA和PGA的內存,

這和Oracle10g自動設置sga_target後分配db_cache_size和shared_pool_size的機制是一樣的
 

(1)MEMORY_TARGET參數對SGA和PGA的影響

Oracle11g 中新增 MEMORY_MAX_TARGET 參數,memory_max_target 是設定 Oracle 能佔 OS 多大的內存空間,

一個是 Oracle SGA 區最大能佔多大內存空間。

SGA_MAX_SIZE參數是動態分配 Shared Pool Size、Database Buffer Cache、Large Pool、Java Pool、Redo Log Buffer 大小的,

只是根據 Oracle 運行狀況來重新分配 SGA 各內存塊的大小。 PGA 需要單獨設定 .

 

11g MEMORY_MAX_TARGET 參數包含兩部分內存,一個 System global area (SGA), 另一個 system global area(PGA)。

很顯然在 11g 中可已經將 PGA 和 SGA 一起動態管理了。

下面來看看在11g 中Memory_target 設置和不設置對SGA/PGA 的影響:

 

A :如果 Memory_target 設置爲非 0 值

(下面有四種情況來對 SGA 和 PGA 的大小進行分配)

1 : sga_target 和 pga_aggregate_target 已經設置大小

如果 Oracle 中已經設置了參數 sga_target 和 pga_aggregate_target ,則這兩個參數將各自被分配爲 最小值最爲它們的目標值。

Memory_Target =SGA_TARGET+PGA_AGGREGATE_TARGET ,大小和 memory_max_size 一致。

2 : sga_target 設置大小, pga_aggregate_target 沒有設置大小

那麼 pga_aggregate_target 初始化值 =memory_target-sga_target 

3 : sga_target 沒有設置大小, pga_aggregate_target 設置大小

那麼 sga_target 初始化值 =memory_target-pga_aggregate_target

4 : sga_target 和 pga_aggregate_target 都沒有設置大小 Oracle 11g

中對這種 sga_target 和 pga_aggregate_target 都沒有設定大小的情況下, Oracle 將對這兩個值沒有最小值和默認值。 Oracle 將根據數據庫 運行狀況進行分配大小。 但在數據庫啓動是會有一個固定比例來分配:

sga_target =memory_target *60%

pga_aggregate_target=memory_target *40%

 

B :如果 Memory_target 沒有設置或 =0 (在 11g 中默認爲 0 )

11g中默認爲 0 則初始狀態下取消了 Memory_target 的作用,完全和 10g 在內存管理上一致,完全向下兼容。

(也有三種情況來對 SGA 和 PGA 的大小進行分配)

1 : SGA_TARGET 設置值,則自動調節 SGA 中的 shared pool,buffer cache,redo log buffer,java pool,larger pool

等內存空間的大小。 PGA 則依賴 pga_aggregate_target 的大小。 sga 和 pga 不能自動增長和自動縮小。

2 : SGA_target 和 PGA_AGGREGATE_TARGET 都沒有設置

SGA 中的各組件大小都要明確設定,不能自動調整各組建大小。 PGA 不能自動增長和收縮。

3 : MEMORY_MAX_TARGET 設置 而 MEMORY_TARGET =0 這種情況先和 10g 一樣,不做說明

在11g 中可以使用下面看各組件的值

SQL> show parameter target

NAME TYPE VALUE

------------------------ ----------- ---------------------

archive_lag_target integer 0

db_flashback_retention_target integer 1440

fast_start_io_target integer 0

fast_start_mttr_target integer 0

memory_max_target big integer 1024M

memory_target big integer 1024M

pga_aggregate_target big integer 0

sga_target big integer 0

如果需要監視 Memory_target 的狀況則可以使用下面三個動態試圖:

V$MEMORY_DYNAMIC_COMPONENTS

V$MEMORY_RESIZE_OPS

v$memory_target_advice

使用下面 Command 來調節大小:

SQL>ALTER SYSTEM SET MEMORY_MAX_TARGET = 1024M SCOPE = SPFILE;

SQL>ALTER SYSTEM SET MEMORY_TARGET = 1024M SCOPE = SPFILE;

SQL>ALTER SYSTEM SET SGA_TARGET =0 SCOPE = SPFILE;

SQL>ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0 SCOPE = SPFILE ;

 

三、Linux上的free命令詳解

 

[root@h1 ~]# free
                  total           used           free       shared     buffers                 cached
Mem:        889572     781744     107828          0       8588                    523620
-/+ buffers/cache:     249536     640036
Swap:     10239992      85576   10154416

 

解釋一下Linux上free命令的輸出。

   

0

1

2

3

4

5

   

total

used

free

shared

buffers

cached

0

Mem:

889572

781744

107828

0

8588

523620

1

-/+ buffers/cache:

249536

640036

       

2

Swap:

10239992

85576

10154416

     

下面是free的運行結果,一共有4行。爲了方便說明,我加上了列號。

這樣可以把free的輸出看成一個二維數組FO(Free Output)。

free的輸出一共有四行,第四行爲交換區的信息,分別是交換的總量(total),使用量(used)和有多少空閒的交換區(free)。

(1)第一行的輸出時從操作系統(OS)來看的:

  • 889572KB(缺省時free的單位爲KB)物理內存,即FO[0][0];
  • 在這些物理內存中有781744KB(即FO[0][1])被使用了;
  • 還用107828KB(即FO[0][2])是可用的;

    這裏得到第一個等式:

  • FO[0][0] = FO[0][1] + FO[0][2]

    FO[0][3]表示被幾個進程共享的內存的,現在已經deprecated,其值總是0(當然在一些系統上也可能不是0,主要取決於free命令是怎麼實現的)。

    FO[0][4]表示被OS buffer住的內存。FO[0][5]表示被OS cache的內存。在有些時候buffer和cache這兩個詞經常混用:

  • A buffer is something that has yet to be "written" to disk.
  • A cache is something that has been "read" from the disk and stored for later use.

    也就是說buffer是用於存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這二者是爲了提高IO性能的,並由OS管理。

     

    (2)free輸出的第二行是從一個應用程序的角度看系統內存的使用情況。

  • 對於FO[1][0],即-buffers/cache,表示一個應用程序認爲系統被用掉多少內存;
  • 對於FO[1][1],即+buffers/cache,表示一個應用程序認爲系統還有多少內存;

    因爲被系統cache和buffer佔用的內存可以被快速回收,所以通常FO[1][1]比FO[1][0]會大很多。

    這裏還用兩個等式:

    FO[1][0] = FO[0][1] - FO[0][4] - FO[0][5]

    FO[1][1] = FO[0][2] +FO[0][4] +FO[0][5]

     

    free命令的所有輸出值都是從/proc/meminfo中讀出的。

     

    四、linux下/dev/shm tmpfs文件系統

    tmpfs是一種虛擬內存文件系統正如這個定義它最大的特點就是它的存儲空間在VM裏面。

    VM(virtual memory),VM是由linux內核裏面的vm子系統管理的。

    Linux虛擬內存管理機制

    linux下面VM的大小由RM(Real Memory)和swap組成,RM的大小就是物理內存的大小,而Swap的大小是由你自己決定的。Swap是通過硬盤虛擬出來的內存空間,因此它的讀寫速度相對RM(Real Memory)要慢許多。當一個進程申請一定數量的內存時,如內核的vm子系統發現沒有足夠的RM時,就會把RM裏面的一些不常用的數據交換到Swap裏面,如果需要重新使用這些數據再把它們從Swap交換到RM裏面。 如果你有足夠大的物理內存,根本不需要劃分Swap分區。
    通過上面的說明,VM由RM+Swap兩部分組成,因此tmpfs最大的存儲空間可達(The size of RM + The size of Swap)。 但是對於tmpfs本身而言,它並不知道自己使用的空間是RM還是Swap,這一切都是由內核的vm子系統管理的。

     

    • 默認系統就會加載/dev/shm ,它就是所謂的tmpfs。不同於ramdisk(虛擬磁盤),tmpfs不但可以像虛擬磁盤一樣使用您的 RAM,而且可以使用您的交換分區來存儲;
    • 傳統的虛擬磁盤是個塊設備,並需要一個 mkfs 之類的命令才能真正地使用它,tmpfs 是一個文件系統,而不是塊設備,您只是安裝它,它就可以使用了。

    tmpfs有以下優勢:
    1.動態文件系統的大小。

    2.tmpfs 的另一個主要的好處是它閃電般的速度。因爲典型的 tmpfs 文件系統會完全駐留在 RAM 中,讀寫幾乎可以是瞬間的。

    3.tmpfs 數據在重新啓動之後不會保留,因爲虛擬內存本質上就是易失的。所以有必要做一些腳本做諸如加載,綁定的操作。

     

    通常使用/dev/shm作共享內存(shm_open,shm_unlink)。 /dev/shm是個臨時文檔系統(tmpfs),能夠

    從/etc/fstab中mount。因此,支持標準的參數例如"size",能夠用來增加或減少在/dev/shm上的tmpfs大小.(默認的,他的大小是系統RAM的一半

     

    五、oracle11g數據庫出現ORA-00845 MEMORY_TARGET not supported on this system 錯誤

    究其原因就是Linux系統的shm的大小比SGA設置的小造成的,舉例來說,SGA設置4G,而shm可能只有1G

    01、調整sga的大小,這個明顯不是我們所希望的
    02、調整shm的大小,這樣相對簡單,具體操作如下
     

     

    修補方法:

    • 修改tmpfs大小至少是系統RAM的一半,至多是RAM+Swap大小
    • 修改tmpfs大小超過SGA_TARGET或tmpfs超過MEMORY_TARGET*0.6
    • SGA_TARGET+PGA_AGGREGATE_TARGET+OS使用內存<總物理RAM
    •  

    例如1:Oracle11g RAM由4G降低爲1G,數據庫啓動報錯ORA-00845 MEMORY_TARGET not supported on this system

    ,修改tmpfs使數據庫啓動

    #------------------1.oracle用戶啓動數據庫錯誤

    [oracle@h1 ~]$ echo $ORACLE_SID
    bitc
    [oracle@h1 ~]$ sqlplus "/as SYSDBA"

    SQL*Plus: Release 11.2.0.1.0 Production on Thu Jan 3 16:06:15 2013

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

    Connected to an idle instance.

    SQL> startup
    ORA-00845: MEMORY_TARGET not supported on this system
     

    SQL> exit
    Disconnected

     

    #------------------2.已KB單位查看RAM是889572KB,Swap爲10239992KB

    [root@h1 ~]# free -k
                 total       used       free     shared    buffers     cached
    Mem:        889572     793308      96264          0      15880     524032
    -/+ buffers/cache:     253396     636176
    Swap:     10239992      84432   10155560


    #------------------3.已KB單位查看tmpfs是

    [root@h1 ~]# df -k /dev/shm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    tmpfs                   961900    638400    323500  67% /dev/shm

     

    #------------------4.修改tmpfs大小(修改tmpfs大小至少是系統RAM的一半,至多是RAM+Swap大小)

    #------------------

    [root@h1 ~]# vi /etc/fstab

    tmpfs                   /dev/shm                tmpfs   defaults,size=5G        0 0

    #--------tmpfs至少是444786KB,至多是11129564KB

    #--------444786/0.6<=MEMORY_TARGET<=11129564/0.6,即724MB<=MEMORY_TARGET<=17G

    #----------修改tmpfs

    tmpfs                   /dev/shm                tmpfs   defaults,size=1G        0 0

     

    #------------------5./etc/fstab生效

    #------------------(1)Kill關於/dev/shm相關進程

    [root@h1 ~]# fuser -km /dev/shm

    #------------------(2)重載 /dev/shm

    [root@h1 ~]# umount /dev/shm
    [root@h1 ~]# mount  /dev/shm
    [root@h1 ~]# df -k /dev/shm
    Filesystem           1K-blocks      Used Available Use% Mounted on
    tmpfs                  1048576         0   1048576   0% /dev/shm

     

    #------------------6.修改數據庫實例BITC的初始pfile

    #------------------(修改memory_target大小至少是tmpfs/0.6,小於RAM大小)

    #--------444786/0.6<=MEMORY_TARGET<=11129564/0.6,即724MB<=MEMORY_TARGET<1G

    [oracle@h1 ~]$ cd /app/oracle/product/11.2.0/dbhome_2/dbs
    [oracle@h1 dbs]$ ls
    hc_bitc.dat initbitc.ora lkBITC orapwtest spfileorcl.ora.bak
    hc_DBUA0.dat init.ora lkORCL snapcf_bitc.f spfiletest.ora
    hc_orcl.dat initorcl.ora lkTEST spfilebitc.ora
    hc_test.dat inittest.ora orapwbitc spfileorcl.ora
     

    [oracle@h1 dbs]$ vi initbitc.ora

    memory_target=600000000

    #--------memory_target=572MB<724MB,memory_target處於允許狀態

    #--------數據庫可以啓動

    [oracle@h1 pfile]$ echo $ORACLE_SID
    bitc

    [oracle@h1 dbs]$ sqlplus "/as SYSDBA"

    SQL*Plus: Release 11.2.0.1.0 Production on Thu Jan 3 18:51:50 2013

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

    Connected to an idle instance.

    SQL> startup
    ORACLE instance started.

    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             373294256 bytes
    Database Buffers          121634816 bytes
    Redo Buffers                3915776 bytes
    Database mounted.
    Database opened.
    SQL> exit
    Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

     

     

    例如2:Oracle11g RAM爲1G,memory_target由memory_target加大爲1G,

    數據庫啓動報錯ORA-00845: MEMORY_TARGET not supported on this system

    #----------------------------解決方法

    1.修改pfile

    2.數據庫使用pfile置於mount狀態

    3.重建spfile

    4.重啓

    [oracle@h1 dbs]$ export ORACLE_SID=test
    [oracle@h1 dbs]$ sqlplus "/as SYSDBA"

    SQL*Plus: Release 11.2.0.1.0 Production on Thu Jan 3 19:10:22 2013

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

    Connected to an idle instance.

    SQL> startup
    ORACLE instance started.


    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             318768304 bytes
    Database Buffers          176160768 bytes
    Redo Buffers                3915776 bytes
    Database mounted.
    Database opened.
    SQL> SQL> show parameter spfile;

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    spfile                               string      /app/oracle/product/11.2.0/dbh
                                                     ome_2/dbs/spfiletest.ora
    #----ORACLE 的spfile在$ORACLE_HOME/dbs/spfile[$ORACLE_SID].ora

    #----ORACLE 的 pfile在$ORACLE_HOME/dbs/init[$ORACLE_SID].ora

    SQL> show parameter memory_max_target

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    memory_max_target                    big integer 480M
    SQL> show parameter memory_target

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    memory_target                        big integer 480M

    SQL> alter system set memory_max_target=1G scope=spfile;

    System altered.

    SQL> alter system set memory_target=1G scope=spfile;

    System altered.

    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORA-00845: MEMORY_TARGET not supported on this system
    SQL>

    #----------------------------問題解決

    #------------------1.查看或修改pfile

    [oracle@h1 dbs]$ cd $ORACLE_HOME/dbs/
    [oracle@h1 dbs]$ ls
    core_10879    hc_orcl.dat   init.ora      lkBITC  orapwbitc      spfilebitc.ora  spfiletest.ora.bak
    hc_bitc.dat   hc_test.dat   initorcl.ora  lkORCL  orapwtest      spfileorcl.ora
    hc_DBUA0.dat  initbitc.ora  inittest.ora  lkTEST  snapcf_bitc.f  spfiletest.ora

    [oracle@h1 dbs]$ cat inittest.ora |grep memory_target
    memory_target=500612736

    #------------------(修改memory_target大小至少是tmpfs/0.6,小於RAM大小)

     

    #------------------2.數據庫使用pfile置於mount狀態

    [oracle@h1 dbs]$ sqlplus "/as SYSDBA"

    SQL*Plus: Release 11.2.0.1.0 Production on Thu Jan 3 20:09:10 2013

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

    Connected to an idle instance.

    SQL> startup pfile=$ORACLE_HOME/dbs/inittest.ora mount
    ORACLE instance started.

    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             318768304 bytes
    Database Buffers          176160768 bytes
    Redo Buffers                3915776 bytes
    Database mounted.



    #------------------3.重建spfile

    SQL> create spfile from pfile;

    File created.


    #------------------4.重啓數據庫

    SQL> shutdown immediate;
    ORA-01109: database not open


    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.

    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             318768304 bytes
    Database Buffers          176160768 bytes
    Redo Buffers                3915776 bytes
    Database mounted.
    Database opened.
    SQL>


     

     

    六、Oracle內存參數

    #------------------1.實例名

    SQL> select instance_name from v$instance;

    INSTANCE_NAME
    ----------------
    test

     

    #------------------2.memory_target及memory_max_target

    SQL> show parameter memory_target;

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    memory_target                        big integer 480M
    SQL> show parameter memory_max_target;

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    memory_max_target                    big integer 480M

     

    #------------------3.SGA
    SQL> show sga

    Total System Global Area  501059584 bytes
    Fixed Size                  2214736 bytes
    Variable Size             331351216 bytes
    Database Buffers          163577856 bytes
    Redo Buffers                3915776 bytes
    SQL> select * from v$sga;

    NAME                      VALUE
    -------------------- ----------
    Fixed Size              2214736
    Variable Size         331351216
    Database Buffers      163577856
    Redo Buffers            3915776

    SQL> show parameter sga

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    lock_sga                             boolean     FALSE
    pre_page_sga                         boolean     FALSE
    sga_max_size                         big integer 480M
    sga_target                           big integer 0

     

    #------------------4.PGA
    SQL> show parameter pga

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    pga_aggregate_target                 big integer 0
    SQL>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章