Oracle数据库内存管理与进程详解
立即解锁
发布时间: 2025-08-23 01:22:11 阅读量: 3 订阅数: 18 

### Oracle数据库内存管理与进程详解
#### 1. 内存管理概述
在管理SGA和PGA时,除非有充分理由(如运行旧版本的Oracle且无其他内存管理选项),否则不应使用过时的手动内存管理方法。在Linux环境中,大多数情况下应使用自动共享内存管理(ASMM)。
#### 2. 自动内存管理(AMM)
- **原理**:AMM是一种一站式的内存设置方式。DBA只需设置一个内存参数`MEMORY_TARGET`,它代表SGA和PGA组合分配应努力保持的总内存量。数据库会根据工作负载历史动态确定合适的SGA和PGA大小。随着数据库工作负载的变化,SGA和PGA的分配也会相应改变。例如,白天是重OLTP(在线事务处理),晚上是重批处理,白天的SGA可能比PGA大很多,晚上则相反。
- **注意事项**:如果在使用HugePages的Linux环境中运行Oracle数据库,使用AMM与Linux HugePages不兼容,需参考Oracle支持文档ID 749851.1。Linux HugePages是Oracle数据库的标准做法,可提高性能。
- **设置示例**:
```sql
SQL> alter system set memory_target = 756m scope=spfile;
SQL> alter system set sga_target = 300m scope=spfile;
SQL> alter system set pga_aggregate_target=300 scope=spfile;
SQL> startup force;
```
- **查看参数设置**:
```sql
SQL> create pfile='/tmp/pfile' from spfile;
SQL> !cat /tmp/pfile;
```
输出示例:
```plaintext
CDB.__db_cache_size=71303168
CDB.__inmemory_ext_roarea=0
CDB.__inmemory_ext_rwarea=0
CDB.__java_pool_size=0
CDB.__large_pool_size=4194304
CDB.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment
CDB.__pga_aggregate_target=478150656
CDB.__sga_target=314572800
CDB.__shared_io_pool_size=8388608
CDB.__shared_pool_size=213909504
CDB.__streams_pool_size=0
CDB.__unified_pga_pool_size=0
*.memory_target=792723456
*.pga_aggregate_target=314572800
*.sga_target=314572800
```
双下划线参数包含`__sga_target`和`__pga_aggregate_target`设置以及各种池,这些值基于spfile中的内存参数设置和观察到的服务器工作负载得出。Oracle会记住最后一次的最佳SGA/PGA设置,并在下次重启时使用。
#### 3. 自动共享内存管理(ASMM)
- **使用情况**:在DBA的经验中,这是管理SGA内存最常见的方法。
- **主要参数**:`SGA_TARGET`是调整总自动调优组件大小的主要参数,在数据库运行时可动态调整,最大到`SGA_MAX_SIZE`参数的设置值。默认情况下,`SGA_MAX_SIZE`等于`SGA_TARGET`,若要增加`SGA_TARGET`,需在启动数据库实例前将`SGA_MAX_SIZE`设置得更大。若当前使用`MEMORY_TARGET`,需将其设置为零,再将`SGA_TARGET`设置为非零值。
- **设置步骤**:
```sql
SQL> alter system set memory_target=0 scope=spfile;
SQL> alter system set sga_target = 1600m scope=spfile;
SQL> startup force;
SQL> show parameter sga_target
```
- **自动调整的内存组件**:如果设置了`SGA_TARGET`,以下内存组件将由Oracle自动调整大小:
- 缓冲区高速缓存(`DB_CACHE_SIZE`)
- 共享池(`SHARED_POOL_SIZE`)
- 大池(`LARGE_POOL_SIZE`)
- Java池(`JAVA_POOL_SIZE`)
- 流池(`STREAMS_POOL_SIZE`)
- 数据传输缓存(`DATA_TRANSFER_CACHE_SIZE`)
- **最小内存值设置**:如果将上述参数设置为非零值(同时设置了`SGA_TARGET`),这些值将为相应内存区域设置最小值。通常,当知道使用数据库的应用程序需要较大的最小值才能正常运行时,会设置这些非零值。
- **内存动态分配**:数据库会使用`SGA_TARGET`值减去其他手动调整大小的组件(如`DB_KEEP_CACHE_SIZE`、`DB_RECYCLE_CACHE_SIZE`等)的大小,用剩余的内存来调整默认缓冲区池、共享池、大池和Java池的大小。运行时,实例会根据需要在这四个内存区域之间动态分配和重新分配内存。当共享池内存不足时,实例可能会缩小缓冲区高速缓存的大小(以兆字节为单位,一个颗粒大小),并相应增加共享池的大小,而不是向用户返回`ORA - 04031`“无法分配N字节的共享内存”错误。
- **注意事项**:要使用ASMM,`ST
0
0
复制全文
相关推荐










