- 浏览: 4403499 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (634)
- Oracle日常管理 (142)
- Oracle体系架构 (45)
- Oracle Tuning (52)
- Oracle故障诊断 (35)
- RAC/DG/OGG (64)
- Oracle11g New Features (48)
- DataWarehouse (15)
- SQL, PL/SQL (14)
- DB2日常管理 (9)
- Weblogic (11)
- Shell (19)
- AIX (12)
- Linux/Unix高可用性 (11)
- Linux/Unix日常管理 (66)
- Linux桌面应用 (37)
- Windows (2)
- 生活和工作 (13)
- 私人记事 (0)
- Python (9)
- CBO (15)
- Cognos (2)
- ORACLE 12c New Feature (2)
- PL/SQL (2)
- SQL (1)
- C++ (2)
- Hadoop大数据 (5)
- 机器学习 (3)
- 非技术 (1)
最新评论
-
di1984HIT:
xuexilee!!!
Oracle 11g R2 RAC高可用连接特性 – SCAN详解 -
aneyes123:
谢谢非常有用那
PL/SQL的存储过程和函数(原创) -
jcjcjc:
写的很详细
Oracle中Hint深入理解(原创) -
di1984HIT:
学习了,学习了
Linux NTP配置详解 (Network Time Protocol) -
avalonzst:
大写的赞..
AIX内存概述(原创)
从Oracle 10g开始,Oracle提供了自动SGA的管理(简称ASMM,即Automatic Shared Memory
Management)新特性。所谓ASMM,就是指我们不再需要手工设置shared pool、buffer
pool等若干内存池的大小,而是为SGA设置一个总的大小尺寸即可。Oracle
10g数据库会根据系统负载的变化,自动调整各个组件的大小,从而使得内存始终能够流向最需要它的地方。
比如,假设某个系统,白天属于OLTP应用,因此会需要较多的buffer
cache。而该系统在晚上属于DSS应用。对于DSS应用,很多的SQL语句由于都是进行全表扫描,因此都会采取并行方式完成。我们知道,并行时需要靠
若干的从属进程完成工作,而从属进程会从large pool中进行分配。于是,晚上会需要较多的large
pool。如果我们启用了ASMM,则数据库会根据负载的变化而自动的对内存大小进行调整,就不需要DBA进行手工调整了。
Oracle 10g提供了一个新的初始化参数:sga_target来启动ASMM,该参数定义了整个SGA的总容量。同时,初始化参数statistics_level必须设置为typical或all才能启动ASMM,否则如果设置为basic,则关闭ASMM。
ASMM只能自动调整5个内存池的大小,它们是:shared pool、buffer cache、large pool、java
pool和stream
pool。我们不再需要设置shared_pool_size、db_cache_size、large_pool_size、
java_pool_size、streams_pool_size这五个初始化参数。而其他的内存池,比如log buffer、keep
buffer cache等仍然需要DBA手工进行调整。
举例来说,假设我们将sga_target设置为500MB,表示SGA总容量为500MB。但是如果我们需要配置100MB的keep
buffer
cache,则必须手工设置参数db_keep_cache_size为100MB。同时如果设置参数log_buffer为3MB,那么shared
pool、buffer cache等可以调整的5个部分的总容量就是397MB(500-100-3=397)。
Oracle 10g还提供了另一个初始化参数sga_max_size。sga_target的值不能超过sga_max_size的值,修改sga_max_size时,必须重启实例才能生效,而sga_target则可以在线修改,立即生效,无须重启实例。
为了实现ASMM,Oracle新引入了一个名为MMAN(Memory
Manager)的后台进程。每隔很短的一段时间,MMAN进程就会启动,然后去询问一下Oracle提供的各个内存组件顾问,比如有buffer
cache顾问,也有shared
pool顾问,由这些顾问根据当前的负载情况,将这5个可以自动调整的内存池的、建议的大小尺寸,返回给MMAN。于是,MMAN进程就会根据该返回的
值,来设置各个内存池。同时,如果我们使用了spfile,还会将这些顾问得出的建议值写入spfile里。这样,下次启动实例时,就可以直接把顾问得出
的建议值拿来作为启动内存池的依据了。
如果我们启用了ASMM,同时又手工设置了可以自动调整大小的内存池的尺寸,比如设置了参数shared_pool_size为一个非0值的时候,
会怎么样?对于Oracle
10g来说,我们为自动调整大小的内存组件设置了值,则会以我们设置的值作为自动调整的最小值。也就是说,假设sga_target为4GB,而我们将
shared_pool_size设置为600MB,则MMAN在进行自动调整时,永远不会将shared pool设置为600MB以下。
实际上,为了使用ASMM,Oracle为这5个可自动调整的组件又提供了5个控制它们大小尺寸的参数,以“__”(两个下画线开头)。我们把当前的spfile导出到pfile里。
SQL> create pfile='/u01/init.ora' from spfile;
SQL> !vi /u01/init.ora
|
打开该pfile以后,我们会发现文件的前5行,会显示如下的内容(具体值可能不一样):
ora10g.__db_cache_size=134217728
ora10g.__java_pool_size=4194304
ora10g.__large_pool_size=4194304
ora10g.__shared_pool_size=62914560
ora10g.__streams_pool_size=0
|
可以看到,这5个初始化参数都以“__”开头,后面的部分与我们手工设置内存池大小的参数相同。比如__db_cache_size与
db_cache_size对应等。这种以“_”开头的参数我们叫做隐藏参数。所谓隐藏参数,就是没有官方文档对其含义进行说明的参数。这种参数会根据版
本的不同而发生改变。这5个隐藏参数(比如__shared_pool_size)由MMAN进程负责修改,而与之相对应的其他参数(比如
shared_pool_size)则由DBA进行设定。因此,当我们启动数据库时,数据库内核会在初始化参数__shared_pool_size与
shared_pool_size之间进行比较。如果shared_pool_size没有设定,或设定为0,或设定的值比
__shared_pool_size小,则以MMAN自动调整的值来设置内存池的尺寸。否则,以DBA设定的值来设置内存池的尺寸。
如果我们在数据库运行过程中,修改了某个可自动调整的内存池的大小,这时会怎么样?如果我们设置的值比MMAN自动调整出来的值要大,则该内存池立
即调整为设定的值的大小,同时我们所设定的值作为MMAN新的、自动调整的最小值;反之,如果设置的值比MMAN自动调整出来的值要小,则该内存池的大小
不会变化,而我们所设置的值则只作为自动调整的最小值存在。比如,当前MMAN自动调整出来的shared
pool大小为150MB,也就是__shared_pool_size为150MB,同时shared_pool_size为60MB。这时,如果我们
将参数shared_pool_size从60MB设置为100MB的话,则shared
pool的大小仍然为150MB,但是新设置的100MB将作为自动调整时的下限;如果我们将参数shared_pool_size从60MB设置为
200MB,则shared pool立即扩张,从150MB扩张到200MB,同时200MB也将作为自动调整的新的下限。
我们来验证一下。视图v$sga_dynamic_components里记录了能够动态调整的各个内存池的大小。
SQL> SELECT component, current_size/1024/1024 size_mb
2 FROM v$sga_dynamic_components where component='
shared pool';
COMPONENT SIZE_MB
------------------------------------ ------------
shared pool 80
|
当前MMAN自动调整出来的shared pool大小为80MB。
SQL> alter system set shared_pool_size=70M;
SQL> SELECT component, current_size/1024/1024 size_mb
2 FROM v$sga_dynamic_components where component='
shared pool';
COMPONENT SIZE_MB
------------------------------------ ------------
shared pool 80
|
我们将shared_pool_size设定为70MB,小于自动调整出来的值。可以看到,shared pool没有缩小,仍然是80MB。我们再将其从80MB扩大到100MB。
SQL> alter system set shared_pool_size=100M;
SQL> SELECT component, current_size/1024/1024 size_mb
2 FROM v$sga_dynamic_components where component='
shared pool';
COMPONENT SIZE_MB
------------------------------------ ------------
shared pool 100
|
显然,只要我们设定的值比自动调整出来的值大,就会立即生效。
同时,如果当前我们启用了ASMM,同时并没有为这5个可以自动调整的内存池参数指定具体的值。当数据库在ASMM状态下运行一段时间以后,我们再禁用ASMM,会发生什么?我们来看下面的试验。
SQL> select name,value from v$parameter
2 where name in('shared_pool_size','db_cache_size','
java_pool_size','large_pool_size',' streams_pool_size');
NAME VALUE
-------------------- --------------
shared_pool_size 96468992
large_pool_size 0
java_pool_size 0
streams_pool_size 0
db_cache_size 0
|
可以看到,除了shared pool为DBA指定以外(因为shared_pool_size大于0),其他的内存池都由ASMM指定。
SQL> select component, current_size FROM v$sga_dynamic_
components 2 where component like '%pool' or component=
'DEFAULT buffer cache';
COMPONENT SIZE_MB
---------------------------------- -----------
shared pool 138412032
large pool 4194304
java pool 4194304
streams pool 0
DEFAULT buffer cache 373293056
|
我们看到,ASMM根据当前的负载情况,为这5个内存池指定了大小。
SQL> alter system set sga_target=0;
SQL> select name,value from v$parameter
2 where name in('shared_pool_size','db_cache_size','
java_pool_size','large_pool_size',' streams_pool_size');
NAME VALUE
-------------------- --------------
shared_pool_size 138412032
large_pool_size 4194304
java_pool_size 4194304
streams_pool_size 0
db_cache_size 373293056
|
当我们将sga_target设置为0,从而禁用ASMM时,会发现,Oracle会自动将当前内存池的大小赋给对应的初始化参数 (shared_pool_size、db_cache_size等)。同时我们也可以注意到,shared_pool_size的值也不再是DBA当时 指定的96468992,而是被ASMM自动调整出来的138412032所覆盖。
参考至:《教你成为10g OCP》韩思捷著
如有错误,欢迎指正
邮箱:czmcj@163.com
发表评论
-
Oracle 锁与锁争用
2015-05-08 02:13 4177大多数的锁都是行级 ... -
Oracle SQL Parsing
2014-07-30 22:24 1944Stages of SQL Processing Fig ... -
Oracle 11g中的direct path read(原创)
2014-06-16 23:01 5779在11g中,全表扫描可能使用direct path rea ... -
深入解析direct path read
2014-06-16 22:35 2593传统读取数据的 ... -
ORA-01555和延迟块清除
2014-06-16 21:13 205801555, 00000, "snapshot t ... -
Oracle(block clean out)的块清除
2014-06-16 21:09 1283Oracle(block clean out)的块清除Cl ... -
SCN之fast cleanout
2014-06-07 16:13 1744SQL> select dbms_rowid.row ... -
SCN之delayed block cleanout
2014-06-07 16:09 1190Block的cache header部分 ... -
Oracle rman change tracking CTWR(原创)
2014-04-25 11:10 2972block change tracking介绍Block c ... -
SSM自动段空间管理 简介
2014-03-27 19:46 1358因为ASSM的官方文档很少,经过多次的查证之后,终于弄明白了 ... -
undo表空间相关(原创)
2014-03-25 21:48 2108DML语句与undo ... -
Bitmap Index vs B-tree Index(原创)
2014-03-08 21:09 1528Introduction Conventional wi ... -
bitmap索引的深入研究
2014-03-08 14:59 1461位图(bitmap)索引是另外一种索引类型,它的组织形式与 ... -
Oracle 10g/11g Latch机制的变化
2013-01-09 18:57 1538Oracle 10g/11g Latch机制 ... -
ASM内部原理(原创)
2012-12-24 21:55 9939ASM的SGA组成 ASM实例 ... -
ASM的元数据(原创)
2012-12-18 21:16 3067概述 ASM Filesystem是建立在ASM D ... -
Oracle数据块深入分析总结
2012-04-23 12:51 7907最近在研究块的内部结构,把文档简单整理了一下,和大家分享一下。 ... -
深入理解重建索引(原创)
2012-04-10 16:58 20794什么时候需要重建索引 ... -
Oracle中B-TREE索引的深入理解(原创)
2012-04-09 20:59 15930索引概述 索引与表一样,也属于段(segment)的 ... -
深入理解Oracle中的latch(原创)
2012-04-04 18:17 11161串行化 概述 串行化 - 数据库系统本 ...
相关推荐
一个 Oracle 例程的系统全局区域 (SGA) 包含几个内存区域(包括缓冲高速缓存、共享池、Java 池、大型池和重做日志缓冲)。这些池在操作系统的内存空间中占据了固定的内存数;它们的大小由 DBA 在初始化参数文件中...
### Oracle自动内存管理ASMM详解 #### 一、引言 随着Oracle数据库技术的发展,内存管理变得越来越自动化和智能化。其中,“Oracle自动内存管理(Automatic Shared Memory Management, ASMM)”是一个重要的里程碑...
4. **内存管理的变迁**:Oracle内存管理经历了从早期的静态分配到动态调整,再到自动共享内存管理(ASMM)和自动内存管理(AMM)的演变。AMM使得数据库能够自动管理SGA和PGA,简化了管理员的工作。 5. **Shared ...
### Oracle自动内存管理详解 #### 一、Oracle自动内存管理简介 Oracle自动内存管理(Automatic Memory Management, AMM)是Oracle数据库的一项高级特性,旨在帮助DBA更好地管理和优化数据库实例的内存分配。通过...
Oracle数据库中的自动共享内存管理(Automatic Shared Memory Management,简称ASMM)自10g版本推出以来,一直是数据库管理员(DBA)关注的焦点之一。ASMM旨在通过自动化的方式管理和调整共享内存区域(SGA),从而...
冯春培作为一位经验丰富的Oracle专家,他的这篇文章清晰而深入地介绍了Oracle内存管理的关键方面,特别是系统全局区(SGA)和进程全局区(PGA)的配置与优化。 #### 二、Oracle内存架构概览 ##### 2.1 SGA与PGA的区别 ...
Oracle还提供了内存管理工具和策略,例如自动内存管理,它允许DBA设置总体的SGA大小,然后让Oracle自动调整各个组件的大小。另外,pga_aggregate_target参数可以用来控制PGA的总大小,而内存计算公式和策略会自动...
本文将详细介绍如何通过合理设置SGA(共享全局区)来有效降低Oracle 10g在Windows XP系统中的内存占用,并确保日常学习与工作的正常进行。 #### 一、Oracle内存结构简介 Oracle数据库的内存结构主要由SGA和PGA两...
关键在于合理配置SGA和PGA的相关参数,以及充分利用Oracle提供的自动化内存管理功能。此外,针对特定场景选择合适的内存预加载策略也非常重要。通过细致地监控和调优,可以确保Oracle 10g在各种负载条件下都能保持...
静态内存管理是在Oracle启动时预先配置好SGA的大小,随着实例启动和关闭,SGA会被自动分配和释放。而动态内存管理允许在数据库运行期间根据工作负载实时调整SGA的大小。Oracle 9i开始支持动态SGA,DBA不再需要精确...
Oracle从10g版本开始引入自动内存管理,允许DBA通过设置SGA_TARGET和PGA_AGGREGATE_TARGET参数,让Oracle自动调整SGA和PGA的大小,简化内存管理。 2. Memory Advisor Oracle的Memory Advisor提供内存调优建议,...
【操作系统与Oracle内存管理比较】 本文探讨了操作系统与Oracle数据库在内存管理上的异同,作者王润中通过对比分析,揭示了两者在内存利用和进程管理上的策略。 1. 操作系统的内存管理 操作系统的内存管理主要...
2. **Automatic Shared Memory Management (ASMM)**: 自动共享内存管理,Oracle 11g及以后版本引入的特性,自动调整SGA(System Global Area)组件的大小。 3. **Automatic Memory Management (AMM)**: 自动内存...
除了上述通过自动机制管理的内存外,还有一些内存区域需要手动进行调整,例如: - **Log Buffer**:用于存储重做日志条目。 - **DB Keep Cache Size**:保持经常访问的数据库块在缓存中。 - **DB Recycle Cache ...
2. **自动内存管理**:Oracle 10g及以后版本引入了AMM(Automatic Memory Management),可以自动分配和调整SGA和PGA的大小。通过设置`MEMORY_TARGET`和`MEMORY_MAX_TARGET`参数,Oracle会根据工作负载自动调整内存...
首先,SGA是Oracle数据库运行时共享内存的主要区域,它包含了多个组件。其中,Buffer Cache存储了从磁盘读取的数据块,以减少I/O操作,提高数据访问速度。Redo Log Buffer用于暂存事务的更改信息,确保数据一致性。...
3. **自动共享内存管理(ASMM)**: 自动调整SGA中的各个组件大小。 4. **自动PGA内存管理(APMM)**: 动态调整PGA大小。 #### 四、示例分析 以下是一个启动Oracle数据库后的内存使用情况示例: ```sql SQL> startup ...
- **Automatic Memory Management (AMM)**: 自动内存管理允许Oracle自动调整SGA大小,简化内存配置。 - **Memory Target and Memory Max Target**: 这两个参数控制SGA的总大小,可以动态调整以适应工作负载的变化...
1. 使用自动内存管理:Oracle 10g及以后版本引入了自动内存管理,DBA可以设置一个总的内存预算,让Oracle自动分配SGA和PGA。 2. 分析工作负载:通过监控工具如AWR(Automatic Workload Repository)和ASH(Active ...
如果出现没有对应后台进程的SGA,表明Oracle不正常crash,但共享内存段没有释放,这时要用ipcrm命令来清除共享内存,或者重启机器。 在Windows系统中,只有一个oracle.exe进程,以及系统分配给oracle.exe的私有内存...