1. 程式人生 > >ORACLE資料庫 memory_target SGA 大小

ORACLE資料庫 memory_target SGA 大小

修改 memory_target

(發現:set sga_target+pga_aggregate_target 不能大於memory_target)

 

一份正確的init.ora

db_name='ORCL'
memory_target=23G
processes = 650
audit_file_dest='/u01/app/oracle/admin/orcl/adump'
audit_trail ='db'
db_block_size=8192
db_domain=''
db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
db_recovery_file_dest_size=10G
diagnostic_dest='/u01/app/oracle/'
dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
open_cursors=600
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
# You may want to ensure that control files are created on separate physical
# devices
control_files = ('/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/fast_recovery_area/orcl/control02.ctl')
compatible ='12.1.0.2.'
enable_pluggable_database=true
pga_aggregate_target=8G
sga_target=15G
sga_max_size=15G

 


用oracle使用者登入,
sqlplus "/as sysdba"
SQL> show parameters target;
     show parameters spfile;
     alter system set memory_max_target=4G scope=spfile;
     alter system set memory_max_target=4G scope=both;
     tmpfs /dev/shm tmpfs defaults,size=24G 0 0
     
-檢視當前使用的哪個引數檔案啟動的
SQL> select distinct isspecified from v$spparameter;
ISSPEC

------

FALSE

看第一個值是FALSE還是TRUE,如果是FALSE,則是pfile,否則則是spfile.

第一行為TRUE可知,是從spfile啟動的,
有兩行,其中第二行為FALSE,表示有兩個引數檔案,一個是spfile,一個是pfile
最終:修改引數的方法:
先用 mount -o remount,size=16G  tmpfs
(無論實際記憶體大小如何,上述命令都能成功,只是不知道記憶體太小,oracle是否真能啟動)
或類似 mount -t tmpfs -o remount,size=32G tmpfs /tmp(命令成功,但沒測試oracle啟動正常與否)
修改 tmpfs 大小,使oracle能夠啟動成功;
然後:
用oracle使用者lmoracle登入,執行:
sqlplus "/as sysdba"
create pfile='/pb/lmoracle/a.txt' from memory;
如果oracle已經被正常啟動的情況下,可以得到一個儲存所有引數的檔案:/pb/lmoracle/a.txt
修改a.txt中的
memory_target=2G

memory_target=24G

在sqlplus中執行shutdown;
退出sqlplus,重新執行下面的命令進入sqlplus:
sqlplus "/as sysdba"
然後用修改後的引數檔案啟動資料庫例項:
startup pfile='/pb/lmoracle/a.txt';
看一下引數:
show parameters target;
無誤後,
create spfile from memory;
這樣就把改好的引數檔案儲存到預設的spfile中了。
重啟資料庫(或重啟機器)
----------------------------------------------------------------------------------------------

ORA-00845: MEMORY_TARGET not supported on this system報錯解決
Oracle 11g資料庫修改pfile引數後啟動資料庫報錯ora-00845
SQL> startup
ORA-00845: MEMORY_TARGET not supported on this system
在oracle 11g中新增的記憶體自動管理的引數MEMORY_TARGET,
它能自動調整SGA和PGA,這個特性需要用到/dev/shm共享檔案系統,
而且要求/dev/shm必須大於MEMORY_TARGET,如果/dev/shm比MEMORY_TARGET小就會報錯

解決方案
1.初始化引數MEMORY_TARGET或MEMORY_MAX_TARGET不能大於共享記憶體(/dev/shm),為了解決這個問題,可以增大/dev/shm
如:
# mount -t tmpfs shmfs -o size=7g /dev/shm
2.為了確保作業系統重啟之後能生效,需要修改/etc/fstab檔案
shmfs /dev/shm tmpfs size=7g 0
3.如果/dev/shm沒有掛載也會報上面的錯,所認需要確保已經掛載

[email protected] ~]$ df -h
tmpfs                16G 8.9G 7.2G 56% /dev/shm
下面為一次操作的記錄
[[email protected] ~]# cat /etc/fstab | grep tmpfs
tmpfs                  /dev/shm              tmpfs  defaults,size=8g      0 0
[
[email protected]
~]# mount -o remount,size=16G /dev/shm
[[email protected] ~]# cat /etc/fstab | grep tmpfs
tmpfs                  /dev/shm              tmpfs  defaults,size=8g      0 0
[[email protected] ~]# vi /etc/fstab
/dev/rootvg/LogVol02  /                      ext3  defaults      1 1
/dev/rootvg/LogVol01  /tmp                  ext3  defaults      1 2
/dev/rootvg/lvol0    /ebao                  ext3  defaults      1 2
/dev/rootvg/lvol1    /backup                ext3  defaults      1 2
LABEL=/boot            /boot                  ext3  defaults      1 2
tmpfs                  /dev/shm              tmpfs  defaults,size=16g      0 0
devpts                /dev/pts              devpts gid=5,mode=620 0 0
sysfs                  /sys                  sysfs  defaults      0 0
proc                  /proc                  proc  defaults      0 0
/dev/rootvg/LogVol00  swap                  swap  defaults      0 0
"/etc/fstab" 10L, 769C written

[[email protected] ~]# df -h|grep shm
tmpfs                16G    0  16G  0% /dev/shm
SQL> startup
ORACLE instance started.
Total System Global Area 9420095488 bytes
Fixed Size                2236248 bytes
Variable Size          2315255976 bytes
Database Buffers        7046430720 bytes
Redo Buffers              56172544 bytes
Database mounted.
Database opened.
SQL> exit

---------------------------------------------------------------------------
Oracle調整SGA大小


memory_max_target < shm 切記,否則Oracle例項將啟動失敗,
報  ORA-00845: MEMORY_TARGET not supported on this system 錯,點選檢視shm設定

------------------------------
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 512M
sga_target big integer 512M
SQL>
SQL> show parameter memory
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
memory_max_target big integer 0
memory_target big integer 0
shared_memory_address integer 0
SQL>

sql>alter system set memory_max_target = 15G scope=spfile;
sql>alter system set memory_target = 15G     scope=spfile;
shutdown immediate
startup

SQL> show parameter memory
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
memory_max_target big integer 15G
memory_target big integer 15G
shared_memory_address integer 0

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

如何修改oracle SGA大小
在正常情況下,查詢非常慢。
1、檢查SGA大小,以DBA身份連線到oracle資料庫,輸入show sga。
2、如果SGA過小,請修改其大小
修改SGA必須保持的原則:
 1).sga_target不能大於sga_max_size,可以設定為相等。
 2).SGA加上PGA等其他程序佔用的記憶體總數必須小於作業系統的實體記憶體。
做如下操作前,必須備份dbs目錄下的所有檔案。
方法一:直接SQL命令列修改:
(如果spfile檔案不存在,需先建立create spfile from pfile;)
SQL>alter system set sga_max_size=1024m scope=spfile;
然後需要重啟資料庫
SQL>shutdown immediate
SQL>startup
SQL>show sga;即可看到SGA的大小已經被修改
重啟之後,再修改sga_target
SQL>alter system set sga_target=1024m scope=both;


------------------------------------------------------------------------
設定SGA的原則以及修改它的大小 

一,設定SGA的原則:
有時候會碰到在配置SGA中出現了問題,由於分配的記憶體過多,資料庫啟不起來了。

記憶體結構=SGA(系統全域性區)+PGA(程式全域性區)

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
Oracle9i設定資料緩衝區為: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%就可以了.

2、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 型別
基本掌握的原則是, db_block_buffer 通常可以儘可能的大,shared_pool_size 要適度,log_buffer 通常大到幾百K到1M就差不多了

例如:
記憶體2G 單個CPU db_block_size 是8192 bytes
SGA=0.55*2048M=1126.4M左右
建議 shared_pool_size = 200M , db_block_buffer *db_block_size = 800M
具體: shared_pool_size=209715200 #200M
db_block_buffer=103192 #800M
log_buffer = 131072 # 128k (128K*CPU個數)
large_pool_size= 31457280 #30M
java_pool_size = 20971520 # 20 M
sort_area_size = 524288 # 512k (65k--2M)
sort_area_retained_size = 524288 # MTS 時 sort_area_retained_size = sort_area_size

二,修改SGA的大小:
1.sga_target不能大於sga_max_size,可以設定為相等。                      2.SGA加上PGA等其他程序佔用的記憶體總數必須小於作業系統的實體記憶體。
做如下操作前,必須備份dbs目錄下的所有檔案。
方法一:直接SQL命令列修改:
SQL>alter system set sga_target=1024m scope=spfile;
SQL>alter system set sga_max_size=1024m scope=spfile;
(如果spfile檔案不存在,需先建立createspfile from pfile;)
alter system set sga_target=12g scope=spfile;
alter system set sga_max_size=12g scope=spfile;
然後
SQL>shutdown immediate
SQL>startup
SQL>show sga;   即可看到SGA的大小已經被修改
方法二:通過EM修改:
以SYS登陸到EM:管理->(資料庫配置)所有初始化引數—>SPFile->
               在此介面可以直接定義sga_target與sga_max_size
然後重啟資料庫即可!


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

cmd下部分操作:,oracle10.2.0g

SQL>conn sys/rezin as sysdba
已連線。
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
Oracle 例程已經關閉。
SQL> startup
oracle 例程已經啟動。

TotalSystem Global Area 1073741824 bytes
FixedSize                 1253124 bytes
VariableSize            696254716 bytes
Database Buffers         369098752 bytes
RedoBuffers               7135232 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> show sga;
TotalSystem Global Area 1073741824 bytes   ---原來大小
FixedSize                 1253124 bytes
VariableSize            696254716 bytes
Database Buffers         369098752 bytes
RedoBuffers               7135232 bytes
SQL> alter system set sga_target=300m  scope=spfile;
系統已更改。
SQL>alter system set sga_max_size=280m scope=spfile;
系統已更改。
SQL>shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。

TotalSystem Global Area  314572800 bytes    ---修改後的大小
FixedSize                 1248720 bytes
VariableSize             96469552 bytes
Database Buffers         209715200 bytes
RedoBuffers               7139328 bytes
資料庫裝載完畢。
資料庫已經開啟。


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

oracle 11g安裝後,無法登陸的問題(MEMORY_TARGET not supported on this system)

問題的解決:修改dev/shm的大小,具體和memory的對應關係大小可以參考oracle官方快速安裝教程中寫的設定 
[[email protected] ~]$ sqlplus
SQL*Plus: Release 11.2.0.1.0 Production on Mon Jul 1 20:03:07 2013
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
Enter user-name: sys as sysdba
Enter password: 
Connected to an idle instance.
SQL> startup;
ORA-00845: MEMORY_TARGET not supported on this system
MEMORY_TARGET不知道在哪設定,根據網上資料,設定了系統引數,但依然無效
[[email protected] ~]# mount -o remount /dev/shm
[[email protected] ~]# df -h /dev/shm/
Filesystem            Size  Used Avail Use% Mounted on
shmfs                 20G     0   20G   0% /dev/shm
想重啟資料庫也報錯~~~
SQL> shutdown immediate;
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
SQL> startup mount
ORA-00845: MEMORY_TARGET not supported on this system

(1)登陸orcl資料庫
SQLPLUS SYS/[email protected] AS SYSDBA
(2)設定記憶體大小
ALTER SYSTEM SET MEMROY_MAX_TARGET=500M SCOPE=SPFILE;(SCOPE=SPFILE表示寫如SPFILE檔案,在資料庫重啟後生效)
(3) 設定自動分配的記憶體大小
ALTER SYSTEM SET MEMORY_TARGET = 500M SCOPE=SPFILE;(表示自動調節PGA和SGA的總大小為500M)
ALTER SYSTEM SET SGA_TARGET =0 SCOPE=SPFILE; 
ALTER SYSTEM SET PGA_AGGREGATE_TARGET =0 SCOPE=SPFILE; 
(4)關閉資料庫
SHUTDOWN IMMEDIATE
(5)重啟資料庫EXP1使配置生效
startup

按下面的方法搞定,假設你的例項名為orcl
在linux下執行:
1、cd $ORACLE_HOME/dbs
2、sqlplus / as sysdba
3、create pfile from spfile;
然後修改pfile裡面的內容,將memery_target修改為sga_target 和 pga_aggregate_target,一個256M,一個200M。
並去掉開始所有的orcl.的選項。
5、startup pfile='initorcl.ora'
6、create spfile from pfile='initorcl.ora'
7、startup force 

MEMORY_TARGET 是 oracle database 11g 繼 10g 加入 sga_target 之後新加的一個記憶體自動管理引數,
引數嘛,當然是在 pfile 或 spfile 中設定啦。 


*.memory_target=54087647232
應該是55G,於是我調整了
vi /etc/fstab--調整共享記憶體大小
mount /dev/shm--執行可用
df -h /dev/shm--驗證值為60G,
然後在oracle使用者下startup就把伺服器啟動了。

備註:隨筆中內容來源於網上資料整理,僅供參考。