Oracle Managing Memory - AMM与ASMM

内存管理-AMM与ASMM

参见官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e25494/memory.htm#ADMIN00207

Oralce内存的自动管理- AMM与ASMM

AMM表示SGA,PGA等都会自动管理。
MMM表示SGA,PGA需要手动设置,但SGA又分为MSMM和ASMM。

自动内存管理(AMM),包含SGA,PGA。
自动共享内存管理(ASMM),包含SGA中的1 cache和4 pool。

注意以下几个关键字的参数的构成。
SGA_TARGET SGA_MAX_SIZE
MEMORY_TARGET MEMORY_MAX_SIZE
pga_aggregate_target
db_cache_size
shared_pool_size java_pool_size large_pool_size streams_pool_size

另外注意这几个参数
LOG_BUFFER
DB_KEEP_CACHE_SIZE DB_RECYCLE_CACHE_SIZE
DB_nK_CACHE_SIZE

ASMM指的是SGA中的1个cache,4和pool(db_cache_size,shared_pool_size java_pool_size large_pool_size streams_pool_size)的管理。
SGA中的下面3项不接受ASMM管理,即LOG_BUFFER,DB_KEEP_CACHE_SIZE DB_RECYCLE_CACHE_SIZE,DB_nK_CACHE_SIZE。

修改前内存参数配置为AMM
SQL> select * from v$sgainfo;
NAME                                  BYTES RES
-------------------------------- ---------- ---
Fixed SGA Size                      2228440 No
Redo Buffers                        3637248 No
Buffer Cache Size                 171966464 Yes
Shared Pool Size                  146800640 Yes
Large Pool Size                     4194304 Yes
Java Pool Size                      4194304 Yes
Streams Pool Size                         0 Yes
Shared IO Pool Size                       0 Yes
Granule Size                        4194304 No
Maximum SGA Size                  559517696 No
Startup overhead in Shared Pool    67108864 No
NAME                                  BYTES RES
-------------------------------- ---------- ---
Free SGA Memory Available         226492416

12 rows selected.

SQL> set linesize 200
SQL> set pagesize 100
SQL> show parameter sga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 536M
sga_target                           big integer 0
SQL> show parameter memory

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address             integer     0
memory_max_target                    big integer 536M
memory_target                        big integer 536M
shared_memory_address                integer     0
SQL> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 0
SQL> show parameter buffer    
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_keep                     string
buffer_pool_recycle                  string
db_block_buffers                     integer     0
log_buffer                           integer     3424256
use_indirect_data_buffers            boolean     FALSE
SQL> show parameter pool
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_keep                     string
buffer_pool_recycle                  string
global_context_pool_size             string
java_pool_size                       big integer 0
large_pool_size                      big integer 0
olap_page_pool_size                  big integer 0
shared_pool_reserved_size            big integer 7M
shared_pool_size                     big integer 0
streams_pool_size                    big integer 0
SQL> show parameter cache
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_lag              big integer 3000
client_result_cache_size             big integer 0
db_16k_cache_size                    big integer 0
db_2k_cache_size                     big integer 0
db_32k_cache_size                    big integer 0
db_4k_cache_size                     big integer 0
db_8k_cache_size                     big integer 0
db_cache_advice                      string      ON
db_cache_size                        big integer 0
db_flash_cache_file                  string
db_flash_cache_size                  big integer 0
db_keep_cache_size                   big integer 0
db_recycle_cache_size                big integer 0
object_cache_max_size_percent        integer     10
object_cache_optimal_size            integer     102400
result_cache_max_result              integer     5
result_cache_max_size                big integer 1376K
result_cache_mode                    string      MANUAL
result_cache_remote_expiration       integer     0
session_cached_cursors               integer     50
SQL> select * from v$sga_target_advice;
  SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS
---------- --------------- ------------ ------------------- -------------------
       160              .5           51              1.0536                8732
       240             .75           48                   1                8676
       320               1           48                   1                8676
       400            1.25           48                   1                8676
       480             1.5           48                   1                8676
       560            1.75           48                   1                8676
       640               2           48                   1                8676

7 rows selected.

AMM->MMM+ASMM参数修改(修改先memory_target的参数为0,再给sga_target设一个值,如果不设置,系统会把当前自动的sga值设置为sga_target)
SQL> select * from v$sga_target_advice;
  SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS
---------- --------------- ------------ ------------------- -------------------
       160              .5           73                1.45               13760
       240             .75           50                   1               10098
       320               1           50                   1               10084
       400            1.25           50                   1               10084
       480             1.5           50                   1               10084
       560            1.75           50                   1               10084
       640               2           50                   1               10084

7 rows selected.

SQL> alter system set memory_target=0;

System altered.

SQL> alter system set sga_target=320M scope=both;

System altered.

SQL> show parameter sga 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 536M
sga_target                           big integer 320M
SQL> show parameter memory
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address             integer     0
memory_max_target                    big integer 536M
memory_target                        big integer 0
shared_memory_address                integer     0
SQL> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 216M

SQL> shutdown immediate 
SQL> startup
ORACLE instance started.
Total System Global Area  334036992 bytes
Fixed Size                  2226272 bytes
Variable Size             155191200 bytes
Database Buffers          171966464 bytes
Redo Buffers                4653056 bytes
Database mounted.
Database opened.
SQL> show parameter sga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 320M
sga_target                           big integer 320M
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> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 216M


MMM+ASMM->AMM修改参数
SQL> show parameter sga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 320M
sga_target                           big integer 320M
SQL> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 216M
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> alter system set memory_target=536M scope=spfile;
SQL> alter system set sga_target=0;--如果不改为0,如果改为大于320M的值,启动时会memory_target报错,建议改为0。
SQL> shutdown immediate;
SQL> startup;

<think>嗯,用户这次问的是如何调小Oracle数据库虚拟机的大内存。看来用户可能遇到了资源分配问题,或者想优化虚拟机配置。从技术角度看,调整Oracle数据库内存涉及多个层面,需要谨慎操作。 用户特意提到"虚拟机",说明环境是虚拟化的,可能是VMware或VirtualBox这类平台。这很关键,因为虚拟化平台的内存管理和物理机不同,调整时既要考虑Oracle层面的参数,又要兼顾虚拟化层的设置。 首先想到的是Oracle的SGA和PGA这两个核心内存区。SGA是共享全局区,PGA是程序全局区,它们加起来通常占实例内存的80%左右。用户要调小内存,主要就是调整这两个区域。不过要注意,SGA最小不能小于sga_min_size参数的值。 虚拟化层面也不能忽视。如果直接在虚拟机设置里调小内存分配,可能导致操作系统触发OOM killer杀死Oracle进程。所以正确的顺序应该是:先调小Oracle实例参数,确认运行稳定后,再调整虚拟机配置。这个顺序很重要,否则直接砍虚拟机内存会很危险。 用户可能不知道调整内存需要重启实例,这点必须明确提醒。动态参数用alter system改,静态参数则要修改pfile或spfile后重启。另外建议用户调小前用create pfile备份参数文件,万一调崩了还能回滚。 安全方面要考虑调小后的连锁反应。比如buffer cache小了可能增加物理读,shared pool小了可能引发硬解析飙升。所以调整后必须检查等待事件和性能指标。可以建议用户用AWR报告做前后对比。 对了,虚拟化平台的内存回收机制也要注意。比如VMware的balloon driver和OracleAMM可能有冲突,最好保持ASMM手动管理。这点虽然技术性较强,但对稳定性很关键,应该告诉用户。 最后想到几个延伸方向:如果用户是RAC环境,调整方法会不同;如果用的是Oracle多租户架构,CDB和PDB的内存限制也要考虑。不过用户没提这些,暂时不需要展开。 </think> 调整Oracle数据库虚拟机内存需要**分两步操作**:先在Oracle实例层面调整内存参数,再在虚拟机层面降低内存分配。以下是详细步骤和注意事项: --- ### **一、Oracle实例层面调整** #### 1. **确认当前内存配置** ```sql -- 查询SGA和PGA配置 SHOW PARAMETER sga_target; SHOW PARAMETER pga_aggregate_target; SHOW PARAMETER memory_target; -- 若使用AMM(自动内存管理) ``` #### 2. **调小内存参数** - **手动管理(ASMM)**: ```sql ALTER SYSTEM SET sga_target = <新值> SCOPE=SPFILE; -- 单位MB ALTER SYSTEM SET pga_aggregate_target = <新值> SCOPE=SPFILE; ``` - **自动管理(AMM)**: ```sql ALTER SYSTEM SET memory_target = <新值> SCOPE=SPFILE; ALTER SYSTEM SET memory_max_target = <新值> SCOPE=SPFILE; ``` > 📌 **注意**: > - `SGA_MIN_SIZE` 是下限值,新值不可低于此限制。 > - 调整后需重启实例生效:`SHUTDOWN IMMEDIATE; STARTUP;` #### 3. **验证调整结果** ```sql SELECT * FROM v$sgainfo; SELECT * FROM v$pgastat; ``` --- ### **二、虚拟机层面调整** #### 1. **关闭Oracle实例和虚拟机** ```bash # 在虚拟机内操作 sqlplus / as sysdba SHUTDOWN IMMEDIATE; EXIT; shutdown -h now ``` #### 2. **在虚拟化平台减少内存分配** - **VMware vSphere**: 编辑虚拟机设置 → 内存 → 调整大小 → 保存。 - **Oracle VirtualBox**: `VBoxManage modifyvm <VM名称> --memory <新内存大小_MB>` - **Hyper-V**: PowerShell命令:`Set-VMMemory -VMName <名称> -StartupBytes <新内存_GB>GB` #### 3. **重启并检查** 1. 启动虚拟机。 2. 启动Oracle实例: ```sql STARTUP; SELECT name, value FROM v$parameter WHERE name LIKE '%target'; ``` 3. 检查告警日志: ```bash tail -f $ORACLE_BASE/diag/rdbms/<DB_NAME>/<INSTANCE_NAME>/trace/alert_*.log ``` --- ### **⛔ 关键注意事项** 1. **内存下限**: - SGA不能低于 `sga_min_size`(通常≥256MB)。 - PGA建议 ≥ 300MB,否则可能引发 `ORA-04031` 错误。 2. **性能影响**: - 减小Buffer Cache可能增加磁盘I/O,需监控 `wait events`。 - PGA过小可能导致排序/哈希操作溢出到磁盘。 3. **虚拟化层风险**: - 若虚拟机内存小于Oracle总需求,可能触发操作系统OOM Killer终止进程。 - 建议预留10%~20%内存余量。 --- ### **💡 优化建议** - **过渡步骤**: 分阶段逐步调小内存(如每次减25%),通过AWR报告对比性能变化。 - **使用AMM**: 若原为手动管理,可切到AMM简化调整: ```sql ALTER SYSTEM SET memory_target=3G SCOPE=SPFILE; ALTER SYSTEM SET sga_target=0 SCOPE=SPFILE; ALTER SYSTEM SET pga_aggregate_target=0 SCOPE=SPFILE; ``` - **监控工具**: 调整后使用 `vmstat`(系统内存)和 `v$memory_resize_ops`(Oracle内存操作)实时监控。 > 📚 **参考**:Oracle官方文档 [Database Administrator’s Guide - Memory Management](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-memory.html)[^1] --- ### **相关问题** 1. 如何在不重启Oracle的情况下动态调整内存? 2. 虚拟机内存调整后Oracle启动失败,如何排查? 3. 如何监控Oracle内存调整后的性能影响? 4. AMM(自动内存管理)ASMM(自动共享内存管理)有何区别? [^1]: Oracle Documentation, "Memory Architecture and Management", Oracle Database Concepts.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值