在Ubuntu上运行Oracle数据库前,需先优化操作系统内存相关设置,减少内存管理开销,提升数据库性能:
sysctl vm.nr_hugepages=<value>设置大页数量(建议为物理内存的1/4~1/2,具体根据Oracle SGA大小调整),并在Oracle参数中设置use_large_pages='TRUE'启用。/etc/default/grub,在GRUB_CMDLINE_LINUX中添加transparent_hugepage=never,更新GRUB后重启系统。vm.swappiness=0或10(数值越小,越倾向于使用物理内存)。ORA-4030错误。Oracle内存管理分为三个层级,从高到低自动化程度递增:
MEMORY_TARGET(总内存上限)和MEMORY_MAX_TARGET(最大允许总内存),Oracle会自动在SGA与PGA之间分配内存。适用于需要快速部署的场景。SGA_TARGET(SGA总大小)和PGA_AGGREGATE_TARGET(PGA总大小),Oracle会自动分配SGA中的共享池、缓冲池等组件。适用于需要平衡SGA与PGA性能的场景。DB_CACHE_SIZE、SHARED_POOL_SIZE)和PGA(如SORT_AREA_SIZE)的各个组件,适用于需要精细调优的高级场景。-- 备份参数文件
CREATE PFILE='/home/oracle/pfile.ora' FROM SPFILE;
-- 关闭自动内存管理(若需使用ASMM)
ALTER SYSTEM SET MEMORY_TARGET=0M SCOPE=SPFILE;
-- 设置SGA总大小(9GB)及最大大小(9GB)
ALTER SYSTEM SET SGA_MAX_SIZE=9G SCOPE=SPFILE;
ALTER SYSTEM SET SGA_TARGET=9G SCOPE=SPFILE;
-- 手动设置SGA组件最小值(可选,增强稳定性)
ALTER SYSTEM SET DB_CACHE_SIZE=2G SCOPE=SPFILE; -- 缓冲池(约22% SGA)
ALTER SYSTEM SET SHARED_POOL_SIZE=1G SCOPE=SPFILE; -- 共享池(约11% SGA)
ALTER SYSTEM SET JAVA_POOL_SIZE=128M SCOPE=SPFILE; -- Java池(可选)
-- 设置PGA总大小(1GB)
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=1G SCOPE=SPFILE;
修改后需重启数据库使参数生效。
-- 查看SGA_TARGET与PGA_AGGREGATE_TARGET设置
SHOW PARAMETER TARGET;
-- 查看SGA各组件内存使用情况
SELECT * FROM V$SGAINFO;
-- 查看PGA使用情况
SELECT * FROM V$PGASTAT;
-- 查看缓冲池命中率(命中率应大于90%)
SELECT
1 - (PHY_VALUE / (CUR_VALUE + CONS_VALUE)) AS HIT_RATIO
FROM
V$SYSSTAT
WHERE
NAME IN ('physical reads', 'db block gets', 'consistent gets');
-- 查看热点块(找出频繁访问的对象)
SELECT
OWNER, OBJECT_NAME
FROM
DBA_OBJECTS
WHERE
DATA_OBJECT_ID IN (
SELECT OBJ
FROM (
SELECT OBJ, TCH
FROM X$BH
ORDER BY TCH DESC
)
WHERE ROWNUM < 11
);
DB_CACHE_SIZE(SGA组件),或使用DB_KEEP_CACHE_SIZE(保留池)缓存热点数据。SHARED_POOL_SIZE,或设置CURSOR_SHARING='FORCE'(减少SQL硬解析)。PGA_AGGREGATE_TARGET,或优化SQL(减少排序、哈希操作)。