ORACLE数据库 memory_target SGA 大小

修改 memory_target


用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没有挂载也会报上面的错,所认需要确保已经挂载
oracle@aaaprod-db ~]$ df -h
tmpfs                16G 8.9G 7.2G 56% /dev/shm
下面为一次操作的记录
[root@aaaprod-db ~]# cat /etc/fstab | grep tmpfs
tmpfs                  /dev/shm              tmpfs  defaults,size=8g      0 0
[root@aaaprod-db ~]# mount -o remount,size=16G /dev/shm
[root@aaaprod-db ~]# cat /etc/fstab | grep tmpfs
tmpfs                  /dev/shm              tmpfs  defaults,size=8g      0 0
[root@aaaprod-db ~]# 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

[root@aaaprod-db ~]# 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官方快速安装教程中写的设置
[oracle@r720-2 ~]$ 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不知道在哪设置,根据网上资料,设置了系统参数,但依然无效
[root@r720-2 ~]# mount -o remount /dev/shm
[root@r720-2 ~]# 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/SYS@orcl 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就把服务器启动了。

备注:随笔中内容来源于网上资料整理,仅供参考。

原文地址:https://www.cnblogs.com/Alanf/p/7479741.html