CREATE PFILE='/home/oracle/pfile_backup.ora' FROM SPFILE;
Oracle内存组件(如SGA)依赖Linux内核参数,需提前修改/etc/sysctl.conf文件并生效:
# 共享内存最大尺寸(需大于SGA_MAX_SIZE)
kernel.shmmax = 4294967296 # 示例:4GB(单位:字节)
# 共享内存总页数(每页4KB,需满足SGA需求)
kernel.shmall = 1048576 # 示例:1048576页=4GB
# 共享内存段最大数量(默认4096,一般无需修改)
kernel.shmmni = 4096
# 信号量参数(用于进程同步)
kernel.sem = 250 32000 100 128
# 文件句柄数上限(避免连接过多报错)
fs.file-max = 65536
# 应用程序可用端口范围(避免端口耗尽)
net.ipv4.ip_local_port_range = 1024 65000
修改后执行sysctl -p使配置生效。
SGA(系统全局区)是Oracle实例的共享内存区域,包含缓冲区高速缓存、共享池、大型池等组件。调整方式分为手动管理和自动管理两种:
通过SGA_TARGET参数统一分配SGA总大小,Oracle自动调整各组件(如缓冲区缓存、共享池)的比例。
ALTER SYSTEM SET SGA_TARGET=4G SCOPE=SPFILE; -- 设置SGA总大小为4GB
ALTER SYSTEM SET SGA_MAX_SIZE=4G SCOPE=SPFILE; -- SGA最大不超过4GB
SHUTDOWN IMMEDIATE;
STARTUP;
若需精确控制SGA组件大小,需手动设置各组件参数(如DB_CACHE_SIZE、SHARED_POOL_SIZE),并禁用自动SGA管理:
ALTER SYSTEM SET MEMORY_TARGET=0 SCOPE=SPFILE;
ALTER SYSTEM SET SGA_TARGET=0 SCOPE=SPFILE;
ALTER SYSTEM SET DB_CACHE_SIZE=2G SCOPE=SPFILE; -- 缓冲区缓存(数据文件缓存)
ALTER SYSTEM SET SHARED_POOL_SIZE=1G SCOPE=SPFILE; -- 共享池(SQL/PLSQL缓存)
ALTER SYSTEM SET LARGE_POOL_SIZE=512M SCOPE=SPFILE; -- 大型池(并行查询、RMAN)
ALTER SYSTEM SET JAVA_POOL_SIZE=256M SCOPE=SPFILE; -- Java池(Java代码缓存)
PGA(程序全局区)是服务器进程的私有内存区域,用于排序、哈希连接等操作。调整方式分为自动PGA管理(推荐)和手动PGA管理:
通过PGA_AGGREGATE_TARGET参数设置PGA总大小,Oracle自动分配各会话的PGA内存。
WORKAREA_SIZE_POLICY为AUTO(默认值),示例:ALTER SYSTEM SET PGA_AGGREGATE_TARGET=1G SCOPE=SPFILE; -- PGA总大小为1GB
ALTER SYSTEM SET WORKAREA_SIZE_POLICY=AUTO SCOPE=SPFILE; -- 启用自动PGA管理
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=1G SCOPE=BOTH;
若需精确控制每个操作的PGA内存(如排序区、哈希区),需设置以下参数(不推荐,仅在特殊场景使用):
ALTER SYSTEM SET SORT_AREA_SIZE=100M SCOPE=SPFILE; -- 排序区大小
ALTER SYSTEM SET HASH_AREA_SIZE=200M SCOPE=SPFILE; -- 哈希区大小
ALTER SYSTEM SET WORKAREA_SIZE_POLICY=MANUAL SCOPE=SPFILE; -- 禁用自动PGA管理
Oracle支持三种内存管理方式:手动SGA+手动PGA、自动SGA+手动PGA、自动SGA+自动PGA(推荐)。切换时需调整以下参数:
ALTER SYSTEM SET MEMORY_TARGET=5G SCOPE=SPFILE; -- 总内存(SGA+PGA)
ALTER SYSTEM SET MEMORY_MAX_TARGET=5G SCOPE=SPFILE; -- 最大总内存
ALTER SYSTEM SET SGA_TARGET=4G SCOPE=SPFILE; -- SGA大小
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=1G SCOPE=SPFILE; -- PGA大小
调整后需通过以下视图监控内存使用情况,进一步优化参数:
SELECT * FROM V$SGAINFO;
SELECT * FROM V$SGASTAT WHERE POOL='shared pool';
SELECT * FROM V$PGASTAT; -- PGA统计信息
SELECT * FROM V$PGA_TARGET_ADVICE; -- PGA目标建议
SELECT * FROM V$PROCESS_MEMORY; -- 进程内存使用
SELECT 1 - (PHY_VALUE / CUR_VALUE) AS HIT_RATIO
FROM V$SYSSTAT
WHERE NAME IN ('db block gets', 'consistent gets', 'physical reads');