初始化参数之memory_target

一、引言:

    Oracle 9i引入pga_aggregate_target,可以自动对PGA进行调整;

    Oracle 10g引入sga_target,可以自动对SGA进行调整;

    Oracle 11g则对这两部分进行综合,引入memory_target,可以自动调整所有的内存,这就是新引入的自动内存管理特性。

二、本文说明:

      操作系统:rhel5.4 x32

      数据库:oracle11g r2

三、memory_target的介绍:

    3.1、下面通过示例了解一下memory_target的设置与PGASGA关系:

 1 SQL> show parameter memory_target;
 2 
 3 NAME                     TYPE     VALUE
 4 ----------------------------------------------- ------------------------------
 5 memory_target                 big integer 316M
 6 SQL> show sga;
 7 
 8 Total System Global Area 330600448 bytes
 9 Fixed Size           1336344 bytes
10 VariableSize          247466984bytes
11 Database Buffers       75497472 bytes
12 RedoBuffers            6299648bytes
13 SQL> alter system set memory_target=200m scope=spfile;
14 
15 System altered.
16 
17 SQL> alter system set sga_target=0 scope=spfile;
18 
19 System altered.
20 
21 SQL> alter system set pga_aggregate_target=0 scope=spfile;
22 
23 System altered.
24 
25 SQL> shutdown immediate;
26 Database closed.
27 Database dismounted.
28 ORACLE instance shut down.
29 SQL> startup
30 ORACLE instance started.
31 
32 TotalSystem Global Area  209235968bytes
33 FixedSize            1335528bytes
34 VariableSize          201330456bytes
35 Database Buffers        4194304 bytes
36 RedoBuffers            2375680bytes
37 Database mounted.
38 Database opened.


    设置memory_target参数后,实际上Oracle会自动设置并调整一下两个参数来分配SGAPGA的内存,这和Oracle 10g自动设置sga_target后分配db_cache_sizeshared_pool_size的机制是一样的。


 1 SQL> col ksppinm for a20;

 2 SQL> col ksppstvl for a20;
 3 SQL> select a.ksppinm name,b.ksppstvl value
 4   2     from x$ksppi a,x$ksppcv b
 5   3   where a.indx = b.indx
 6   4      and (a.ksppinm like '%sga_target%'
 7   5  or a.ksppinm like '%pga_aggregate_target%');
 8 
 9 NAME                                VALUE
10 -----------------------    -------------------
11sga_target                           0
12__sga_target                     142606336
13pga_aggregate_target                 0
14__pga_aggregate_target            67108864


    3.2、讨论一下11gmemory_target设置和不设置对SGA/PGA的影响:

    3.2.1、如果memory_target设置为非0

      (下面有四种情况来对SGAPGA的大小进行分配)

      3.2.1.1sga_targetpga_aggregate_target已经设置大小

        如果Oracle中已经设置了参数sga_targetpga_aggregate_target,则这两个参数将各自被分配为最小值为他们的目标值。

       memory_target = sga_target +pga_aggregate_target,大小和memory_max_size一致。

      3.2.1.2sga_target设置大小,pga_aggregate_target没有设置大小

       那么pga_aggregate_target初始化值=memory_target-sga_target

      3.2.1.3sga_target没有设置大小,pga_aggregate_target设置大小

       那么sga_target初始化值=memory_target-pga_aggregate_target

      3.2.1.4sga_targetpga_aggregate_target都没有设置大小

        Oracle11g中对这种sga_targetpag_aggregate_target都没有设定大小的情况下,Oracle将对这两个值没有最小值和默认值。Oracle将根据数据库运行状况进行分配大小。但在数据库启动是会有一个固定比例来分配:

        sga_target = memory_target*60%

        pga_aggregate_target = memory_target*40%

    3.2.2、如果memory_target没有设置或 = 0(11g中默认为0)

      11g中默认为0则初始状态下取消了memory_target的作用,完全和10g在内存管理上一致,完全向下兼容。(也有三种情况来对SGAPGA的大小进行分配)

      3.2.2.1sga_target设置值,则自动调节SGA中的shared pool,buffer cache,redo logbuffer,java pool,larger pool等内存空间的大小。PGA则依赖pga_aggregate_target的大小。sgapga不能自动增长和自动缩小。

     3.2.2.2sga_targetpga_aggregate_target都没有设置

        SGA中的各组件大小都要明确设定,不能自动调整各组件大小。PGA不能自动增长和收缩。

      3.2.2.3memory_max_target设置而memory_target = 0这种情况先和10g一样,不做说明。 

三、ORA-00845

    最后谈一下ORA-00845的由来和解决方案:

    如果memory_max_target/memory_target设置过大,可能导致instance无法启动,报ORA-00845错误。

 1 [oracle@yft bin]$ oerr ora 00845
 2 0084500000, "MEMORY_TARGET not supported on this system"
 3 // *Cause: The MEMORY_TARGET parameter was not supported on this operating system or /dev/shm was not sized 
 4 // *Action: Refer to documentation for a list of supported operating systems. Or, size /dev/shm to be at leacle instancerunning on thesystem.
 5 
 6 SQL> alter system set memory_max_target=400m scope=spfile;
 7 
 8 System altered.
 9 
10 SQL> shutdown immediate;
11 Database closed.
12 Database dismounted.
13 ORACLE instance shut down.
14 SQL> startup
15 ORA-00845: MEMORY_TARGET not supported on this system


    这个错误有点误导,实际上这并不是说该平台版本上不支持AMM特性,只是设置的memory_max_target超过了系统中设置的sharememory(/dev/shm)而已。

[oracle@yft bin]$ df -h
Filesystem
            Size  Used Avail 
Use% Mounted on
tmpfs                 395M     
0  395M   0% /dev/shm

    Oracle 11g for linux中似乎是用了一种新的机制来管理共享内存段,而不是传统的sys /dev/shm了。在alert.ora中可以找到更准确的错误描述:


1 Mon Feb 25 12:13:21 2013
2 Starting ORACLE instance (normal)
3 WARNING:You are trying to usethe MEMORY_TARGET feature. This feature requires the /dev/shm file system to be mountedfor at least 419430400bytes. /dev/shm is either not mounted or is mounted with available space less than thissize. Please fix this so that MEMORY_TARGET can work as expected. Current available is 413466624 and used is 0 bytes. Ensure that the mount point is /dev/shm for this directory.
4memory_target needs larger /dev/shm


    解决的办法之一是增加tmpfs文件系统的容量:

      修改/etc/fstabtmpfs对应的行;将原来的tmpfs  /dev/shm  tmpfs defaults 0 0 改成tmpfs /dev/shm tmpfs default,size=1024M 0 0,这样tmpfs增大为1G,重新mount/dev/shm使之生效。


 1 [root@yft ~]# vi /etc/fstab
 2 tmpfs                  /dev/shm                tmpfs   defaults,size=420m        0 0
 3 
 4 [root@yft ~]# mount -o remount /dev/shm
 5 [root@yft ~]# df -h
 6 Filesystem           Size  Used Avail Use% Mounted on
 7 tmpfs                420M     0  420M   0% /dev/shm
 8 
 9 SQL> startup
10 ORACLE instance started.
11 
12 TotalSystem Global Area  418484224bytes
13 FixedSize            1336932bytes
14 VariableSize          406849948bytes
15 Database Buffers        4194304 bytes
16 RedoBuffers            6103040bytes
17 Database mounted.
18 Database opened.

配置 Oracle 数据库的 `MEMORY_TARGET` 参数通常在数据库初始化参数文件(如 `init.ora` 或 `spfile.ora`)中完成。`MEMORY_TARGET` 是一个动态参数,它允许 Oracle 自动管理 SGA(System Global Area,系统全局区)和 PGA(Process Global Area,进程全局区)的内存分配。这个参数Oracle 11g 引入,并在后续版本中得到增强。 具体步骤如下: 1. 首先确定当前的 `SGA_TARGET` 和 `PGA_AGGREGATE_TARGET` 参数设置。因为设置 `MEMORY_TARGET` 后,这两个参数将被自动管理,所以应该检查它们的当前值。 2. 通过 SQL*Plus 或者 Oracle Enterprise Manager 连接到数据库,并以管理员身份登录。 3. 使用 `ALTER SYSTEM` 命令来修改 `MEMORY_TARGET` 参数。例如,如果你想设置 `MEMORY_TARGET` 为 4GB,可以使用如下命令: ```sql ALTER SYSTEM SET MEMORY_TARGET=4G SCOPE=BOTH; ``` `SCOPE=BOTH` 表示修改立即生效,并且会被写入到参数文件中,这样在数据库重启后,修改也会保留。 4. 修改完毕后,Oracle 会根据配置自动调整 SGA 和 PGA 的大小,以最优化数据库的性能。 5. 验证 `MEMORY_TARGET` 是否正确设置,可以查询 `V$MEMORY_TARGET_ADVICE` 视图,来查看不同内存目标下的数据库性能建议。 注意事项: - 修改 `MEMORY_TARGET` 参数前,确保服务器有足够的物理内存来支持设定的值,以避免内存不足的问题。 - 根据数据库的工作负载和运行状况,可能需要调整 `MEMORY_MAX_TARGET` 参数,它是 `MEMORY_TARGET` 参数可以增加到的最大值。 - 进行修改之前,最好先参考 Oracle 官方文档和最佳实践,确保参数调整对你的数据库环境是安全且合适的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值