首页 > 代码库 > Oracle内存管理(之五)
Oracle内存管理(之五)
【深入解析--eygle】学习笔记
1.4. 2其他内存组件
Large Pool-大池是SGA的一个可选组件,通常用于共享服务器模式(MTS)、 并行计算或
RMAN的备份恢复等操作。
Java Pool-Java池主要用于JVM等Java选件。
Streams Pool-Streams pool是Oracle10g引入的概念,为Oracle的Streams功能所使用,如果不定义该参数,这部分内存将从Shread Pool中分配
对于SGA各部分内存分配,可以从数据库的视图中查询得到:
17:46:03 sys@felix SQL>select * from v$sga;
NAME VALUE
--------------------------------------------------
Fixed Size 2228944
Variable Size 335547696
Database Buffers 75497472
Redo Buffers 4272128
18:00:20 sys@felix SQL>
在Oracle9i中,Variable Size 包括shared_pool_size,java_pool_size和large_pool_size部分,SGA_MAX_SIZE去除db_cache_size部分也被归入可变部分,所以很多时候我们看到的可变部分内存要远高于可变内存组件大小;
Redo Buffers指日志缓冲区分配的内存大小,这个参数值通常比log_buffers参数设置略大;因为Log Buffer并非按照数据块大小分配,在内存中通常需要设置保护页对Log Buffer进行保护。
18:00:20 sys@felix SQL>select * from v$sgainfo;
NAME BYTESRESIZE
-------------------------------------------------- ------
Fixed SGA Size 2228944 No
Redo Buffers 4272128 No
Buffer Cache Size 75497472 Yes
Shared Pool Size 171966464 Yes
Large Pool Size 4194304 Yes
Java Pool Size 4194304 Yes
Streams Pool Size 8388608 Yes
Shared IO Pool Size 0 Yes
Granule Size 4194304 No
Maximum SGA Size 417546240 No
Startup overhead in Shared Pool 65418776 No
Free SGA Memory Available 146800640
12 rows selected.
18:06:23 sys@felix SQL>
当前SGA的分配和使用具体信息我们还可以通过V$SGASTAT视图查询得到:
select *
FROM(SELECT *
FROM v$sgastat
WHERE pool = ‘shared pool‘
ORDER BY BYTES DESC)
WHERE ROWNUM<= 5
18:06:23 sys@felix SQL>select *
18:08:05 2 FROM (SELECT *
18:08:05 3 FROM v$sgastat
18:08:05 4 WHERE pool = ‘sharedpool‘
18:08:05 5 ORDER BY BYTES DESC)
18:08:05 6 WHERE ROWNUM <= 5;
POOL NAME BYTES
---------------------------------------------------------------- ----------
shared pool free memory 30868336
shared pool SQLA 21540248
shared pool KGLH0 19496600
shared pool row cache 7593704
shared pool PLMCD 6275624
18:08:07 sys@felix SQL>
1.4.3 SGA 与共享内存
SGA的设置在Linux/Unix上和一个操作系统内核参数有关,这个参数是:shmmax。不同操作系统,该参数设置的位置不同,在Solaris 上,该参数由/etc/system 文件中shmsys:shminfo_shmmax定义;在Linux上,该参数由/proc/sys/kernel/shmmax参数定义。
很多人将该参数理解为共享内存的大小,这是不对的。实际上shmmax内核参数定义的是系统允许的单个共享内存段的最大值,如果该参数设置小于Oracle SGA设置,那么SGA仍然可以创建成功,但是会被分配多个共享内存段。我们通常推荐通过调整shmmax设置,将SGA限制在一个共享内存段中。
在Windows系统中,由于系统采用多线程服务器(所有oracle server process 实际上都是一个进程中的线程),所以不存在共享内存的问题,无需进行特殊设置。
以64位Linux平台为例来看一下shmmax参数对于数据库的影响。
[root@felix kernel]# uname -a
Linux felix 2.6.39-200.24.1.el6uek.x86_64 #1 SMPSat Jun 23 02:39:07 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
[root@felix kernel]#
[root@felix kernel]# pwd
/proc/sys/kernel
[root@felix kernel]# ls shm*
shmall shmmax shmmni
[root@felix kernel]# cat shmmax
4398046511104
[root@felix kernel]#
可以通过ipcs 命令查看此设置下共享内存的分配,我们可以看到Oracle分配了多个共享内存段以满足SGA设置的需要
[root@felix kernel]# ipcs -sa
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x6c6c6536 0 root 600 4096 0
0x00000000 32769 gdm 600 393216 2 dest
0x00000000 65538 gdm 600 393216 2 dest
0x00000000 98307 gdm 600 393216 2 dest
0x00000000 131076 gdm 600 393216 2 dest
0x00000000 163845 gdm 600 393216 2 dest
0x00000000 229382 oracle 640 4096 0
0x00000000 262151 oracle 640 4096 0
0xb875ccb0 294920 oracle 640 4096 0 --在此可以看出,该oracle数据库使用了3个内存段
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000000 0 root 600 1
0x00000000 32769 root 600 1
0x549cc314 163842 oracle 640 154
------ Message Queues --------
key msqid owner perms used-bytes messages
[root@felix kernel]#
通过以上输出看到为了创建Oracle的SGA,系 统 共 分 配 了3个共享内存段。接下来针对一个后台进程,使用pmap工具查看一下每个共享内存段的地址空间:
[root@felix kernel]# ps -ef | grep dbw
oracle 2493 1 0 10:22 ? 00:00:00 ora_dbw0_felix
root 2688 2201 0 10:31 pts/0 00:00:00 grep dbw
[root@felix kernel]#
[root@felix kernel]# pmap 2493
2493: ora_dbw0_felix
0000000000400000 183412K r-x-- /u01/app/oracle/product/11.2.0/db_1/bin/oracle
000000000b91d000 1884K rwx-- /u01/app/oracle/product/11.2.0/db_1/bin/oracle
000000000baf4000 304K rwx-- [ anon ]
000000000d796000 444K rwx-- [ anon ]
0000000060000000 4K r-xs- /dev/shm/ora_felix_229382_0
0000000060001000 4092K rwxs- /dev/shm/ora_felix_229382_0
0000000060400000 4096K rwxs- /dev/shm/ora_felix_229382_1
0000000060800000 4096K rwxs- /dev/shm/ora_felix_262151_0
0000000060c00000 4096K rwxs- /dev/shm/ora_felix_262151_1
0000000061000000 4096K rwxs- /dev/shm/ora_felix_262151_2
0000000061400000 4096K rwxs- /dev/shm/ora_felix_262151_3
0000000061800000 4096K rwxs- /dev/shm/ora_felix_262151_4
0000000061c00000 4096K rwxs- /dev/shm/ora_felix_262151_5
0000000062000000 4096K rwxs- /dev/shm/ora_felix_262151_6
0000000062400000 4096K rwxs- /dev/shm/ora_felix_262151_7
0000000062800000 4096K rwxs- /dev/shm/ora_felix_262151_8
0000000062c00000 4096K rwxs- /dev/shm/ora_felix_262151_9
0000000077400000 4096K rwxs- /dev/shm/ora_felix_262151_91
0000000077800000 4096K rwxs- /dev/shm/ora_felix_262151_92
0000000077c00000 4096K rwxs- /dev/shm/ora_felix_262151_93
0000000078000000 4096K rwxs- /dev/shm/ora_felix_262151_94
0000000078400000 4096K rwxs- /dev/shm/ora_felix_262151_95
0000000078800000 4096K rwxs- /dev/shm/ora_felix_262151_96
0000000078c00000 4096K rwxs- /dev/shm/ora_felix_262151_97
0000000079000000 4096K rwxs- /dev/shm/ora_felix_294920_0
注意:这里的229382、262151等就是ipcs里所看到的共享内存ID(shmid)。
00000030a0800000 128K r-x-- /lib64/ld-2.12.so
00000030a0a21000 4K rwx-- [ anon ]
00000030a0c00000 4K r-x-- /lib64/libaio.so.1.0.1
00000030a138c000 4K rwx-- /lib64/libc-2.12.so
00000030a138d000 20K rwx-- [ anon ]
00000030a1400000 524K r-x-- /lib64/libm-2.12.so
00000030a1a18000 4K rwx-- /lib64/libpthread-2.12.so
00000030a1a19000 16K rwx-- [ anon ]
00000030a2207000 4K rwx-- /lib64/librt-2.12.so
00000030b1800000 32K r-x-- /usr/lib64/libnuma.so.1
00000030b2000000 88K r-x-- /lib64/libnsl-2.12.so
00000030b2016000 2044K ----- /lib64/libnsl-2.12.so
00000030b2215000 4K r-x-- /lib64/libnsl-2.12.so
00000030b2216000 4K rwx-- /lib64/libnsl-2.12.so
00000030b2217000 8K rwx-- [ anon ]
00007f7f3c5d0000 64K rwx-- /dev/zero
00007f7f3c5e0000 64K rwx-- /dev/zero
00007f7f3c5f0000 144K rwx-- /dev/zero
00007f7f3c614000 7588K rwx-- [ anon ]
00007f7f3cf8a000 4K rwx-- /lib64/libnss_files-2.12.so
00007f7f3cfab000 4K rwxs- /u01/app/oracle/product/11.2.0/db_1/dbs/hc_felix.dat
00007f7f3cfac000 1296K rwx-- [ anon ]
00007f7f3d0f0000 8K r-x-- /lib64/libdl-2.12.so
00007f7f3d0f2000 2048K ----- /lib64/libdl-2.12.so
00007f7f3d2f2000 4K r-x-- /lib64/libdl-2.12.so
00007f7f3d2f3000 4K rwx-- /lib64/libdl-2.12.so
00007f7f3d2f4000 4K rwx-- [ anon ]
00007f7f3d2f5000 44K r-x-- /u01/app/oracle/product/11.2.0/db_1/lib/libocrutl11.so
00007f7f3d300000 1024K ----- /u01/app/oracle/product/11.2.0/db_1/lib/libocrutl11.so
00007f7f3d400000 4K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libocrutl11.so
00007f7f3d401000 652K r-x-- /u01/app/oracle/product/11.2.0/db_1/lib/libocrb11.so
00007f7f3d4a4000 1020K ----- /u01/app/oracle/product/11.2.0/db_1/lib/libocrb11.so
00007f7f3d5a3000 8K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libocrb11.so
00007f7f3d5a5000 4K rwx-- [ anon ]
00007f7f3d5a6000 668K r-x-- /u01/app/oracle/product/11.2.0/db_1/lib/libocr11.so
00007f7f3df1c000 1020K ----- /u01/app/oracle/product/11.2.0/db_1/lib/libhasgen11.so
00007f7f3e01b000 136K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libhasgen11.so
00007f7f3e03d000 28K rwx-- [ anon ]
00007f7f3e044000 136K r-x-- /u01/app/oracle/product/11.2.0/db_1/lib/libdbcfg11.so
00007f7f3e066000 1020K ----- /u01/app/oracle/product/11.2.0/db_1/lib/libdbcfg11.so
00007f7f3e609000 264K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libnnz11.so
00007f7f3e64b000 144K rwx-- [ anon ]
00007f7f3e66f000 864K r-x-- /u01/app/oracle/product/11.2.0/db_1/lib/libskgxp11.so
00007f7f3e9ab000 40K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libcell11.so
00007f7f3e9b5000 8K rwx-- [ anon ]
00007f7f3eab8000 4K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libodmd11.so
00007f7f3eab9000 4K rwx-- [ anon ]
00007fffba5e0000 132K rwx-- [ stack ]
00007fffba7a6000 4K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 656228K
为了避免多个共享内存段,可以修改shmmax内核参数,使SGA存在于一个共享内存段中。通过修改/proc/sys/kernel/shmmax参数可以达到此目的。
以下是一个环境中的设置:
[root@danaly root]# echo 1610612736 >/proc/sys/kernel/shmmax
[root@danaly root]# more /proc/sys/kernel/shmmax
1610612736
这里修改为1.5G。对于shmmax文件的修改,系统重新启动后会复位。可以通过修改/etc/sysctl.conf文件使更改永久化。在该文件内添加以下一行,这个更改在系统重新启动后生效:
kernel.shmmax =1610612736
修改shmmax之后,需要重起数据库使更改生效。
通常,如果没有修改shmmax参数,Oracle在启动过程中就会在告警日志文件中记录如下警告:
Starting ORACLE instance (normal)
Thu Nov 17 09:27:29 2005
WARNING: EINVAL creating segment of size 0x0000000033400000
fix shm parameters in /etc/system or equivalent
这是一个WARNING的?示,说明是建议修正,但并非强制的内容。在Solaris平台上,有时候也会看到类似的警报:
Sun Apr 30 05:35:20 2006
Starting ORACLE instance (normal)
Sun Apr 30 05:35:20 2006
WARNING: Not enough physical memory forSHM_SHARE_MMU segment of size 0x000000006d400000
[flag=0x4000]
这通常是因为SGA设置过大,超过了物理内存而导致的,这种情况通过修正参数即可解决。有时候这类警告也可能是因为数据库异常关闭,后台进程未正常退出,共享 内 存 未 及 时 释放引起的,对于这种情况,可以通过ipcs命令找到共享内存段id(shared memory id),然后通过ipcrm命令可以强制释放该共享内存段,完成这些特殊处理后,数据库通常就可以正常启动了。
1.4.4 9i SGA管理
从Oracle9i开始,Oracle 推出了动态SGA调整,也就是说,允许我们不重新启动数据库而使得SGA的修改生效
在Oracle9i中,我们可以设置参数SGA_MAX_SIZE,该参数用以控制各缓冲池使用的内存总和,本质上是在进程中预先分配一段虚拟地址备用而不分配物理内存,目的是防止和进程私有地址段的冲突:
11:00:10 sys@felix SQL>show parameter sga_max
NAME TYPE VALUE
---------------------------------------------------------- ------------------------------
sga_max_size big integer 400M
11:00:15 sys@felix SQL>
11:08:02 sys@felix SQL>select tname from tab where tname like‘%ADVICE%‘;
TNAME
------------------------------------------------------------
WRH$_STREAMS_POOL_ADVICE
WRH$_SHARED_POOL_ADVICE
WRH$_SGA_TARGET_ADVICE
WRH$_PGA_TARGET_ADVICE
WRH$_MTTR_TARGET_ADVICE
WRH$_MEMORY_TARGET_ADVICE
WRH$_JAVA_POOL_ADVICE
WRH$_DB_CACHE_ADVICE_BL
WRH$_DB_CACHE_ADVICE
V_$STREAMS_POOL_ADVICE
V_$SHARED_POOL_ADVICE
V_$SGA_TARGET_ADVICE
V_$PX_BUFFER_ADVICE
V_$PGA_TARGET_ADVICE_HISTOGRAM
V_$PGA_TARGET_ADVICE
V_$MTTR_TARGET_ADVICE
V_$MEMORY_TARGET_ADVICE
V_$JAVA_POOL_ADVICE
V_$DB_CACHE_ADVICE
SAM_SPARSITY_ADVICE
GV_$STREAMS_POOL_ADVICE
GV_$SHARED_POOL_ADVICE
GV_$SGA_TARGET_ADVICE
GV_$PX_BUFFER_ADVICE
GV_$PGA_TARGET_ADVICE
GV_$PGATARGET_ADVICE_HISTOGRAM
GV_$MTTR_TARGET_ADVICE
GV_$MEMORY_TARGET_ADVICE
GV_$JAVA_POOL_ADVICE
GV_$DB_CACHE_ADVICE
DBA_HIST_STREAMS_POOL_ADVICE
DBA_HIST_SHARED_POOL_ADVICE
DBA_HIST_SGA_TARGET_ADVICE
DBA_HIST_PGA_TARGET_ADVICE
DBA_HIST_MTTR_TARGET_ADVICE
DBA_HIST_MEMORY_TARGET_ADVICE
DBA_HIST_JAVA_POOL_ADVICE
DBA_HIST_DB_CACHE_ADVICE
38 rows selected.
11:08:24 sys@felix SQL>
其中和SGA相关的是V$DB_CACHE_ADVICE和V$SHARED_POOL_ADVICE,这些新功能通过在数据库运行时持续不断的收集信息,从而对内存的设置?供建议。
缓冲区高速缓存建议(buffer cacheadvisory) 受初始化参数DB_CACHE_ADVICE控制。该参数为动态参数,可用的值有三个OFF、ON 和READY。
DB_CACHE_ADVICE 不同参数值的含义分别如下:
OFF-关闭建议并且不为建议分配内存
ON-开启建议并且CPU 和内存开销都会发生
READY-关闭建议但是仍保留为建议分配的内存
在某些版本中,如果在参数为OFF 状态时尝试将其设置为ON 可能会出现ORA-4031错误,无法从共享池中分配内存;如果参数处于READY 状态则可以将其设置为ON 而不会发生错误,这是因为需要的内存已经分配。
11:08:24 sys@felix SQL>show parameterdb_cache_ad
NAME TYPE VALUE
---------------------------------------------------------- ------------------------------
db_cache_advice string ON
11:13:35 sys@felix SQL>
我们看一下一个数据库中,Oracle收集的buffer cache建议信息:
11:13:35 sys@felix SQL>select id,
11:17:28 2 name,
11:17:28 3 block_size,
11:17:28 4 size_for_estimate sfe,
11:17:28 5 size_factor sf,
11:17:28 6 estd_physical_read_factor eprf,
11:17:28 7 estd_physical_reads epr
11:17:28 8 from v$db_cache_advice;
ID NAME BLOCK_SIZE SFE SF EPRF EPR
------------ ---------- ---------- ---------- ---------- ----------
3DEFAULT 8192 4 .0588 1.4798 20700
3DEFAULT 8192 8 .1176 1.3237 18517
3DEFAULT 8192 12 .1765 1.2074 16890
3DEFAULT 8192 16 .2353 1.1395 15940
3 DEFAULT 8192 20 .2941 1.1236 15717
3DEFAULT 8192 24 .3529 1.1033 15434
3DEFAULT 8192 28 .4118 1.0896 15242
3DEFAULT 8192 32 .4706 1.0838 15161
3DEFAULT 8192 36 .5294 1.0759 15050
3DEFAULT 8192 40 .5882 1.0715 14990
3DEFAULT 8192 44 .6471 1.0643 14889
3DEFAULT 8192 48 .7059 1.0614 14848
3DEFAULT 8192 52 .7647 1.0542 14747
3DEFAULT 8192 56 .8235 1.0441 14606
3DEFAULT 8192 60 .8824 1.0412 14565
3 DEFAULT 8192 64 .9412 1.0094 14120
3 DEFAULT 8192 68 1 1 13989
3DEFAULT 8192 72 1.0588 .9964 13938
3DEFAULT 8192 76 1.1176 .9942 13908
3DEFAULT 8192 80 1.1765 .9877 13817
20 rows selected.
11:17:28 sys@felix SQL>
我们可以看到,伴随db_cache_size的增大,估计的物理读(estd_physical_reads)在逐渐减少,我们的选择就在于在db_cache_size的设置和physical_reads之间寻找一个边际效益最高点,使用可以接受的内存设置,获得尽量低的物理读。
而对于Shred Pool的建议则受到另外一个初始化参数的影响,这个参数是: STATISTICS_LEVEL。STATISTICS_LEVEL控制数据库收集的统计信息的级别,该参数有三个选项:
(1)BASIC-收集基本的统计信息
(2)TYPICAL-收集大部分的统计信息,这是系统的缺省设置,为了从Oracle不断增加的新特性中受益,始终应该将该参数设置为典型.
(3)ALL-收集全部的统计信息.
可以通过v$statistics_level视图来查看该参数的影响范围,在Oracle11g中该视图中的条目已经增加到24个:
11:35:29 sys@felix SQL>col STATISTICS_NAME fora30;
11:35:52 sys@felix SQL>select STATISTICS_NAME,
11:36:00 2 SESSION_STATUS,
11:36:00 3 SYSTEM_STATUS,
11:36:00 4 ACTIVATION_LEVEL,
11:36:00 5 SESSION_SETTABLE
11:36:00 6 from v$statistics_level;
STATISTICS_NAME SESSION_STATUS SYSTEM_STATUS ACTIVATION_LEV SESSIO
------------------------------ -------------------------------- -------------- ------
Buffer Cache Advice ENABLED ENABLED TYPICAL NO
MTTR Advice ENABLED ENABLED TYPICAL NO
Timed Statistics ENABLED ENABLED TYPICAL YES
Timed OS Statistics DISABLED DISABLED ALL YES
Segment Level Statistics ENABLED ENABLED TYPICAL NO
PGA Advice ENABLED ENABLED TYPICAL NO
Plan Execution Statistics DISABLED DISABLED ALL YES
Shared Pool Advice ENABLED ENABLED TYPICAL NO
Modification Monitoring ENABLED ENABLED TYPICAL NO
Longops Statistics ENABLED ENABLED TYPICAL NO
Bind Data Capture ENABLED ENABLED TYPICAL NO
Ultrafast Latch Statistics ENABLED ENABLED TYPICAL NO
Threshold-based Alerts ENABLED ENABLED TYPICAL NO
Global Cache Statistics ENABLED ENABLED TYPICAL NO
Active Session History ENABLED ENABLED TYPICAL NO
Undo Advisor, Alerts and Fast ENABLED ENABLED TYPICAL NO
Ramp up
Streams Pool Advice ENABLED ENABLED TYPICAL NO
Time Model Events ENABLED ENABLED TYPICAL YES
Plan Execution Sampling ENABLED ENABLED TYPICAL YES
Automated Maintenance Tasks ENABLED ENABLED TYPICAL NO
SQL Monitoring ENABLED ENABLED TYPICAL YES
Adaptive Thresholds Enabled ENABLED ENABLED TYPICAL NO
V$IOSTAT_* statistics ENABLED ENABLED TYPICAL NO
23 rows selected.
可以看到在TYPICAL设置下,除Timed OS Statistics 和 Plan Execution Statistics 信息不收集外,其他信息都被收集。其中, Buffer Cache Advice 受 db_cache_advice 参数独立控制, Timed Statistics 受 timed_statistics 参数独立控制。其他统计信息的收集都受到STATISTICS_LEVEL 参数的控制。当STATISTICS_LEVEL为Basic时,除受独立参数影响的Buffer Cache Advice 和TimedStatistics 外,其他信息收集都将被禁止。
我们可以通过查询V$SHARED_POOL_ADVICE视图获得关于Shared Pool的建议信息:
11:36:01 sys@felix SQL>selectSHARED_POOL_SIZE_FOR_ESTIMATE SPSFE,
11:47:38 2 SHARED_POOL_SIZE_FACTOR SPSF,
11:47:38 3 ESTD_LC_SIZE,
11:47:38 4 ESTD_LC_MEMORY_OBJECTS ELMO,
11:47:39 5 ESTD_LC_TIME_SAVED ELTS,
11:47:39 6 ESTD_LC_TIME_SAVED_FACTOR ELTSF,
11:47:39 7 ESTD_LC_MEMORY_OBJECT_HITS ELMOH
11:47:39 8 from v$shared_pool_advice;
SPSFE SPSF ESTD_LC_SIZE ELMO ELTS ELTSF ELMOH
---------- ---------- ------------ -------------------- ---------- ----------
104 .6341 8 834 814 .8781 25081
124 .7561 28 1903 843 .9094 25874
128 .7805 32 2109 848 .9148 25951
132 .8049 35 2318 861 .9288 26110
136 .8293 39 2508 867 .9353 26201
140 .8537 42 2715 873 .9417 26293
144 .878 46 2914 882 .9515 26404
148 .9024 50 3162 889 .959 26515
152 .9268 50 3221 897 .9676 26787
156 .9512 50 3221 904 .9752 27085
160 .9756 50 3221 916 .9881 28117
164 1 50 3221 927 1 29153
168 1.0244 50 3221 927 1 29157
172 1.0488 50 3221 927 1 29157
176 1.0732 50 3221 927 1 29157
180 1.0976 50 3221 927 1 29157
184 1.122 50 3221 927 1 29157
188 1.1463 50 3221 927 1 29157
192 1.1707 50 3221 927 1 29157
196 1.1951 50 3221 927 1 29157
200 1.2195 50 3221 927 1 29157
204 1.2439 50 3221 927 1 29157
224 1.3659 50 3221 927 1 29157
244 1.4878 50 3221 927 1 29157
264 1.6098 50 3221 927 1 29157
284 1.7317 50 3221 927 1 29157
304 1.8537 50 3221 927 1 29157
324 1.9756 50 3221 927 1 29157
344 2.0976 50 3221 927 1 29157
29 rows selected.
11:47:40 sys@felix SQL>
通过以上统计数据分析,当shared_pool_size设置为304M时即可达到和现在相同的效果,
目前的shared_pool_size设置浪费了部分内存,那么我们就可以动态调整shared_pool_size参数,
释放这部分内存,留给其他内存组件使用。
SQL> alter system setshared_pool_size=304M;
当进行动态参数修改时,修改Session会处于等待状态,等待事件为background parameter
adjustment:
SQL> selectsid,seq#,event,SECONDS_IN_WAIT,state
2 from v$session_waitwhere sid=80;
SID SEQ# EVENT SECONDS_IN_WAIT STATE
---------- ------------------------------------------------------------------------80 46479 background parameter adjustment 928 WAITING
这个调整的时间可能极其漫长,从v$lock视图中,我们还可以获得相关锁定信息:
SQL> select * fromv$lock where sid=80;
ADDR KADDR SID TYPE ID1ID2 LMODE
REQUEST CTIME BLOCK
-------------------------------- ---------- ---- ---------- ---------- ------------------------------ ----------00000003CF3D6048 00000003CF3D6068 80 PE 44 0 4
0 1437 0
锁定类型为PE,即Kernel Service system Parameters ENQUEUE,在修改系统参数时需要获取该锁定。
需要提醒的是,虽然Oracle9i中,Oracle提供了动态内存修改的功能,但是仍然建议在系统规划时做好设置,尽量避免运行时的动态调整。动态调整某些系统参数(如undo_retention 等)在繁忙的系统中可能触发bug而造成系统挂起。