第1章 章名章名章名章名章名
2 SYSTEM_STATUS,ACTIVATION_LEVEL,SESSION_SETTABLE from v$statistics_level; STATISTICS_NAME SESSION_ SYSTEM_S ACTIVAT SES ---------------------------------------- -------- -------- ------- --- 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 Ramp up ENABLED ENABLED TYPICAL NO 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 Session Wait Stack ENABLED ENABLED TYPICAL NO
24 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 和Timed Statistics 外,其他信息收集都将被禁止。
我们可以通过查询V$SHARED_POOL_ADVICE视图获得关于Shared Pool的建议信息:
SQL> select SHARED_POOL_SIZE_FOR_ESTIMATE SPSFE,SHARED_POOL_SIZE_FACTOR SPSF, 2 ESTD_LC_SIZE,ESTD_LC_MEMORY_OBJECTS ELMO,ESTD_LC_TIME_SAVED ELTS, 3 ESTD_LC_TIME_SAVED_FACTOR ELTSF,ESTD_LC_MEMORY_OBJECT_HITS ELMOH 4 from v$shared_pool_advice;
·41·
书名书名书名书名书名书名书名书名书名书名书名书名书名书名
SPSFE SPSF ESTD_LC_SIZE ELMO ELTS ELTSF ELMOH ---------- ---------- ------------ ---------- ---------- ---------- ---------- 208 0.52 193 17972 8295638 0.9999 359670096 256 0.64 240 22083 8296182 0.9999 359708386 304 0.76 289 26310 8296446 1 359725903 352 0.88 336 30330 8296589 1 359735662 400 1 383 34632 8296693 1 359745443 448 1.12 430 42078 8296767 1 359752957 496 1.24 479 50650 8296816 1 359757737 544 1.36 526 59499 8296855 1 359761517 592 1.48 573 68609 8296891 1 359764717 640 1.6 620 77522 8296930 1 359767727 688 1.72 667 85969 8296953 1 359769641 736 1.84 716 96051 8296968 1 359770920 784 1.96 764 105940 8296987 1 359772425 832 2.08 795 112434 8296992 1 359772998 14 rows selected
通过以上数据可以得知,当前的shared_pool_size大小为400M(大小因子为1的是当前设置),通过OEM,也可以直观的看到图形显示:
·42·
第1章 章名章名章名章名章名
通过以上统计数据分析,当shared_pool_size设置为304M时即可达到和现在相同的效果,目前的shared_pool_size设置浪费了部分内存,那么我们就可以动态调整shared_pool_size参数,释放这部分内存,留给其他内存组件使用。
SQL> alter system set shared_pool_size=304M;
当进行动态参数修改时,修改Session会处于等待状态,等待事件为background parameter adjustment:
SQL> select sid,seq#,event,SECONDS_IN_WAIT,state 2 from v$session_wait where sid=80;
SID SEQ# EVENT SECONDS_IN_WAIT STATE ---------- ---------- -------------------------------------------------------------- 80 46479 background parameter adjustment 928 WAITING
这个调整的时间可能极其漫长,从v$lock视图中,我们还可以获得相关锁定信息:
SQL> select * from v$lock where sid=80;
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ---------- 0 1437 0
00000003CF3D6048 00000003CF3D6068 80 PE 44 0 4
锁定类型为PE,即Kernel Service system Parameters ENQUEUE,在修改系统参数时需要获取该锁定。
需要提醒的是,虽然Oracle9i中,Oracle提供了动态内存修改的功能,但是仍然建议在系统规划时做好设置,尽量避免运行时的动态调整。动态调整某些系统参数(如undo_retention 等)在繁忙的系统中可能触发bug而造成系统挂起。
3. Oracle10g自动共享内存管理
很多人可能注意到,Oracle9i的动态SGA调整的新特性虽然方便,但是仍然需要DBA去观察并修改这些设置,如果Oracle能够自动完成这个调整,那将是一个划时代的进步了.
很快,在Oracle10g中,这个梦想得以实现.
在Oracle10g之前,你可能面对过这样的情况,你的数据库在白天需要处理大量的OLTP任务,这些任务需要大量的Buffer Cache内存,而在夜间系统可能需要运行大量的并行批处理任务,这些任务又需要大量的Large Pool内存,为了让这样一个系统在有限的资源下高效率运行,可能你需要在各类峰值业务来临之前对数据库进行不断的调整。
那么在Oracle10g的自动共享内存管理(Automatic Shared Memory Management-ASMM)下,这些动作不再需要人工介入,当运行OLTP任务时,Buffer Cache会获取大部分内存以达到良好的I/O性能。当系统需要运行DSS批处理任务时,内存会自动转移给Large Pool,以便并行查询等可以获得更多的内存,更快的执行。
Oracle10g使用了一个新的初始化参数SGA_TARGET,通过指定这个参数,让Oracle自
·43·
书名书名书名书名书名书名书名书名书名书名书名书名书名书名
动管理SGA中以下大多数的内存分配。SGA_TARGET是个动态参数,但是该参数不能超过SGA_MAX_SIZE参数的设置,如果试图修改SGA_TARGET超越SGA_MAX_SIZE的限制,系统会给出错误信息:
SQL> show parameter sga_max
NAME TYPE VALUE ------------------------------------ ----------- ----- sga_max_size big integer 300M SQL> alter system set sga_target=400M; alter system set sga_target=400M *
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid ORA-00823: Specified value of sga_target greater than sga_max_size
并非所有SGA组件都可以自动调整,可以自动分配的内存包括 Buffer Cache、Shared Pool、 Java Pool、 Large Pool
启用自动共享内存管理,我们可以估算一个 SGA 的总大小,然后设置SGA_TARGET 参数为非零值, Oaracle将启用自动共享内存管理。自动共享内存管理需要STATISTICS_LEVEL参数设置为TYPICAL 或者 ALL.。可以通过Oracle10g的Database Control来启用或禁用自动共享内存管理:
为了更加直观,Oracle还在Database Control中提供了图形展现,提供建议数据:
·44·
第1章 章名章名章名章名章名
Oracle服务器根据系统运行的情况自动调整这些内存的大小,并记录在SPFILE中,数据库实例重新启动时,不会丢失之前的调整结果。
但是注意以下相关初始化参数还是需要手工配置的: 非标准BLOCK_SIZE的Cache、 Keep/Recycle Buffer Cache、Redo Log Buffer、Streem Pool
自动的共享内存管理引入了一个新的后台进程:MMAN(Memory Manager)。该进程用以动态调整内存组件。动态调整的依据来自系统不间断收集的内存建议。
从告警日志文件中,可以看到该进程启动顺序为3,进程号为4:
PMON started with pid=2, OS id=4464 PSP0 started with pid=3, OS id=4466 MMAN started with pid=4, OS id=4468 DBW0 started with pid=5, OS id=4470 LGWR started with pid=6, OS id=4472 CKPT started with pid=7, OS id=4474 SMON started with pid=8, OS id=4476 RECO started with pid=9, OS id=4478 CJQ0 started with pid=10, OS id=4480 MMON started with pid=11, OS id=4482
如果不想使用自动共享内存管理的新特性,Oracle也允许使用手工管理,只需要简单的将SGA_TARGET参数设置为0,Oracle就会回到手工管理的模式,当前的各内存组件值会被计入spfile,做为手工管理的初始值使用.
·45·