Oracle 19c数据库内存管理优化(内存管理方式调整及内存扩容)

目录

一、准确判断当前内存管理模式

1.1.整体判断规则

[1.2.在当前实例执行 SQL 检查](#1.2.在当前实例执行 SQL 检查)

1)当前实例参数

2)SPFILE中所有实例参数

3)SGA动态组件

4)PGA信息统计

1.3.操作系统层检查

1)基础原则

二、根据模式选择调整路径(流程概要)

[2.1.ASMM 模式(推荐)](#2.1.ASMM 模式(推荐))

[2.2.AMM 模式(RAC 不支持,建议迁移到 ASMM)](#2.2.AMM 模式(RAC 不支持,建议迁移到 ASMM))

2.3.手动管理模式

三、详细调整步骤(按模式)

[3.1.ASMM 模式调整 SGA](#3.1.ASMM 模式调整 SGA)

1)前置准备:备份SPFILE

[2)检查当前 SGA_MAX_SIZE](#2)检查当前 SGA_MAX_SIZE)

[3)添加虚拟机内存后修改 SGA_MAX_SIZE 并滚动重启](#3)添加虚拟机内存后修改 SGA_MAX_SIZE 并滚动重启)

[4)查看SGA正常后,动态调整 SGA_TARGET](#4)查看SGA正常后,动态调整 SGA_TARGET)

[5)按需调整 PGA(复现内存保护机制)](#5)按需调整 PGA(复现内存保护机制))

6)验证

[3.2.AMM 模式迁移到 ASMM 并调整 SGA(为什么推荐ASMM?)](#3.2.AMM 模式迁移到 ASMM 并调整 SGA(为什么推荐ASMM?))

原因:为什么极力推荐切换至ASMM?

3.2.1.前置操作

1)备份SPFILE

2)确认当前内存模式

3.2.2.迁移步骤

1)禁用AMM并设置ASMM参数

2)处理SPFILE中的残留参数(关键避坑)

3)使用新PFILE重启实例

4)重建SPFILE

[5)修改 OS 内核参数](#5)修改 OS 内核参数)

6)滚动重启实例

7)参数验证

[8)启用 HugePages(可选且极力推荐)](#8)启用 HugePages(可选且极力推荐))

[3.3.手动模式迁移到 ASMM](#3.3.手动模式迁移到 ASMM)

1)查询当前各组件大小

[2)设置 ASMM 参数](#2)设置 ASMM 参数)

[3)重置手动组件参数(让 ASMM 自动管理)](#3)重置手动组件参数(让 ASMM 自动管理))

[4)修改 OS 内核参数](#4)修改 OS 内核参数)

四、验证与注意事项

4.1.调整后验证

4.2.注意事项

4.3.总结表


**问题背景:**近期业务方反馈部分核心业务出现卡顿、响应变慢的情况。结合 AWR 报告分析,发现数据库实例的 SGA 配置偏小,Buffer Cache 命中率下降、物理读增多,共享池也出现一定的争用,导致 SQL 执行效率降低。为缓解业务卡慢问题,需要对当前内存管理模式进行梳理,并合理扩大 SGA 配置,提升数据库整体性能。本次主要是为了熟悉整体内存优化执行流程。

AWR截图:

**声明:**这里我以实验的方式来作为扩容流程验证!!!主要是验证扩容过程中需要注意的检查步骤及相关操作步骤!

一、准确判断当前内存管理模式

1.1.整体判断规则

检查项 AMM ASMM 手动管理
MEMORY_TARGET > 0 = 0 = 0
SGA_TARGET 通常为 0 或自动值 > 0 = 0
PGA_AGGREGATE_TARGET 通常为 0 或自动值 > 0 可能 > 0 或手动
/dev/shm 约等于 MEMORY_MAX_TARGET 可能较小 可能较小
HugePages 通常未使用 常用 可能使用
alert log Automatic Memory Management Automatic Shared Memory Management manual

如果 MEMORY_TARGET > 0 → AMM

如果 MEMORY_TARGET =0 且 SGA_TARGET > 0ASMM

如果 MEMORY_TARGET = 0 且 SGA_TARGET = 0 → 手动管理

**注意:**在 RAC 中,AMM 已不受支持。如果发现 MEMORY_TARGET > 0 时,应尽快迁移到 ASMM。

1.2.在当前实例执行 SQL 检查

sql 复制代码
PROMPT ===== 调整行宽和字段列宽 =====
SET LINESIZE 200
COL name FORMAT A25
COL value FORMAT A20
COL sid FORMAT A10


PROMPT ===== 当前实例参数 =====
COL name      FOR A22
COL value_raw FOR A12
COL value_gb  FOR 999.99
SELECT name,
       value AS value_raw,
       CASE
         WHEN REGEXP_LIKE(value, '^[0-9]+$')
         THEN ROUND(TO_NUMBER(value)/1024/1024/1024, 2)
       END AS value_gb
FROM v$parameter
WHERE name IN (
  'memory_target','memory_max_target',
  'sga_target','sga_max_size','pga_aggregate_target',
  'db_cache_size','shared_pool_size','large_pool_size',
  'java_pool_size','streams_pool_size','use_large_pages'
)
ORDER BY name;


PROMPT ===== SPFILE 中所有实例参数 =====
SELECT sid, name, value/1024/1024/1024 as value_GB
FROM v$spparameter
WHERE name IN (
  'memory_target','memory_max_target',
  'sga_target','sga_max_size','pga_aggregate_target',
  'db_cache_size','shared_pool_size','large_pool_size',
  'java_pool_size','streams_pool_size','use_large_pages'
)
ORDER BY name, sid;


PROMPT ===== SGA 动态组件 =====
SELECT component,
current_size/1024/1024/1024 AS cur_gb,
min_size/1024/1024/1024     AS min_gb,
max_size/1024/1024/1024     AS max_gb,
user_specified_size/1024/1024/1024 AS user_gb
FROM v$sga_dynamic_components
ORDER BY current_size DESC;



PROMPT ===== PGA 统计 =====
SELECT name, value/1024/1024/1024 AS gb
FROM v$pgastat
WHERE name IN (
'aggregate PGA target parameter',
'aggregate PGA auto target',
'total PGA allocated',
'maximum PGA allocated'
);

1)当前实例参数

关键解读:

参数 含义
memory_target 0 AMM 未启用
memory_max_target 0 AMM 上限为 0,确认 AMM 关闭
sga_target 3,808,428,032 (~3.55 GB) ASMM 已启用,SGA 目标大小
sga_max_size 3,808,428,032 (~3.55 GB) SGA 可增长到的上限,当前查询大小 与 sga_target 相等
pga_aggregate_target 1,266,679,808 (~1.18 GB) PGA 自动管理目标
db_cache_size 0 各子池由 ASMM 自动调节(0 表示交给 SGA_TARGET 统一分配)
use_large_pages TRUE 启用大页(HugePages),需 OS 侧配置到位,否则会退化

2)SPFILE中所有实例参数

关键解读: 其中VALUE_GB为空则表示参数大小没有显式写进 SPFILE中,反之,有大小的及已经写入到SPFILE中。

3)SGA动态组件

关键解读:

组件 CUR (GB) MIN (GB) MAX (GB) USER (GB) 说明
DEFAULT buffer cache 2.3125 2.3125 2.3125 0 主数据缓冲区
shared pool 1.046875 1.046875 1.046875 0 共享池
Shared IO Pool 0.125 0.125 0.125 0.125 显式配置
streams pool 0.03125 0.03125 0.03125 0 Streams 用
large pool 0.015625 0.015625 0.015625 0 RMAN/并行用
其余 15 个组件 0 0 0 0 未启用

合计 = 2.3125 + 1.046875 + 0.125 + 0.03125 + 0.015625 = 3.53125 GB ≈ 3.55 GB

✅ 与内存里的 sga_target = 3,808,428,032(3.55GB)吻合。SGA 已全部用满,没有余量给自动调整。我这里是测试环境,满足现实情况。

4)PGA信息统计

关键解读:峰值(maximum PGA allocated) 0.89 GB < 目标 1.18 GB → 从未触顶,说明 PGA 目前够用一般在生产环境中,SGA内存不足更为常见。

1.3.操作系统层检查

free -g

grep -E 'HugePages_Total|HugePages_Free|Hugepagesize' /proc/meminfo

df -h /dev/shm

sysctl kernel.shmmax kernel.shmall vm.nr_hugepages

1)基础原则

**单个共享内存段最大值:**kernel.shmmax 的值必须大于或等于单个数据库实例的 SGA_MAX_SIZE。如果设置过小,SGA会被拆分成多个共享内存段,增加管理开销并可能影响性能。

**系统共享内存总页数:**kernel.shmall 的值必须满足 ceil(shmmax / PAGE_SIZE),否则即使 shmmax 足够,系统也会因总配额不足而分配失败

计算公式:

示例:若SGA总大小为8GB,则:

**系统预留大页数量:**grep Hugepagesize /proc/meminfo确认

二、根据模式选择调整路径(流程概要)

2.1.ASMM 模式(推荐)

这是 RAC 的标准模式。调整 SGA 分两步:

检查 SGA_MAX_SIZE 是否足够大 。如果当前 SGA_MAX_SIZE 已经 ≥ 目标值(例如 300G),则只需动态调整 SGA_TARGET,无需重启;如果SGA_MAX_SIZE 小于目标值,必须先修改SGA_MAX_SIZE(静态参数),滚动重启实例,再动态调整 SGA_TARGET。

修改前务必确认 OS 内核参数kernel.shmmax、kernel.shmall、vm.nr_hugepages足够。

2.2.AMM 模式(RAC 不支持,建议迁移到 ASMM)

如果确认是 AMM,不应该直接调大MEMORY_TARGET,而因该先将 RAC 迁移到 ASMM:

  1. 备份 SPFILE。

  2. 查询当前实际 SGA 和 PGA 大小。

  3. 在 SPFILE 中为每个实例设置(建议一次验证通过后再执行):

    • MEMORY_TARGET=0

    • MEMORY_MAX_TARGET=0

    • SGA_MAX_SIZE=375G(按需)

    • SGA_TARGET=300G(目标值)

    • PGA_TARGET=300G(目标值)

  4. 修改 OS 内核参数。

  5. 滚动重启实例。

  6. 验证并启用 HugePages(可选)。

2.3.手动管理模式

建议先转换为 ASMM,下边会讲解为什么建议将AMM切换至ASMM。

三、详细调整步骤(按模式)

3.1.ASMM 模式调整 SGA

**假设目标:**SGA_TARGET=4G,SGA_MAX_SIZE=4G,PGA_AGGREGATE_TARGET=1.5G(1536M),实例名 rac01、rac02。

注意:Oracle 的参数解析器不支持小数单位,如 1.5G、0.5G 等。参数值必须是整数,单位可以是 K、M、G,但不能带小数点,否则会报如下错误:

ORA-32005: error while parsing size specification 1.5G

1)前置准备:备份SPFILE

这是最关键的一步。如果迁移后实例无法启动,可以使用备份文件快速恢复。

SQL> create pfile='/tmp/init_before_asmm.ora' from spfile;

务必记录下这个备份文件的路径

2)检查当前 SGA_MAX_SIZE

SQL> SHOW PARAMETER sga_max_size;

SQL> SHOW PARAMETER sga_target;

注意1:

如果 SGA_MAX_SIZE ≥ 4G,直接跳到步骤 4。

如果 SGA_MAX_SIZE < 4G,继续步骤 3。

3)添加虚拟机内存后修改 SGA_MAX_SIZE 并滚动重启

将原来的运行内存由6G,增至8G

修改SGA_MAX_SIZE

-- 节点1

SID:SELECT inst_id, instance_name, host_name FROM gv$instance;

SQL> ALTER SYSTEM SET sga_max_size = 4G SCOPE=SPFILE SID='p19c01';

-- 节点2(验证完节点1之后)

SQL> ALTER SYSTEM SET sga_max_size = 4G SCOPE=SPFILE SID='p19c02';

滚动重启:

先操作节点1进行先行验证

数据库名:

srvctl stop instance -d P19C0 -i p19c01

srvctl start instance -d P19C0 -i p19c01

sql 复制代码
[grid@p19c01 ~]$ srvctl stop instance -d P19C0 -i p19c01
[grid@p19c01 ~]$
[grid@p19c01 ~]$
[grid@p19c01 ~]$ ps -ef | grep oracle
root      6778     1  4 12:41 ?        00:00:43 /u01/app/19.3.0/grid/jdk/jre/bin/java -server -Xms32m -Xmx64m -Djava.awt.headless=true -Ddisable.checkForUpdate=true oracle.rat.tfa.TFAMain /u01/app/19.3.0/grid/tfa/p19c01/tfa_home
grid      8170     1  1 12:43 ?        00:00:16 /u01/app/19.3.0/grid/jdk/bin/java -server -Xms30M -Xmx512M -Djava.awt.headless=true -Ddisable.checkForUpdate=true -DTRACING.ENABLED=false -XX:ParallelGCThreads=1 -cp /u01/app/19.3.0/grid/jlib/cha.jar:/u01/app/19.3.0/grid/jlib/chaconfig.jar:/u01/app/19.3.0/grid/jlib/cha-diag-msg.jar:/u01/app/19.3.0/grid/jlib/clsce.jar:/u01/app/19.3.0/grid/jlib/srvm.jar:/u01/app/19.3.0/grid/jlib/srvmhas.jar:/u01/app/19.3.0/grid/jlib/srvmasm.jar:/u01/app/19.3.0/grid/jlib/netcfg.jar:/u01/app/19.3.0/grid/jdbc/lib/ojdbc8.jar:/u01/app/19.3.0/grid/ucp/lib/ucp.jar:/u01/app/19.3.0/grid/jlib/fte.jar:/u01/app/19.3.0/grid/jlib/jai_core.jar:/u01/app/19.3.0/grid/jlib/mlibwrapper_jai.jar:/u01/app/19.3.0/grid/jlib/vecmath.jar:/u01/app/19.3.0/grid/jlib/jai_codec.jar:/u01/app/19.3.0/grid/jlib/jh.jar oracle.cha.server.CHADDriver
grid      8650     1  0 12:44 ?        00:00:00 oracle+ASM1_ocr (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
grid      8655     1  0 12:44 ?        00:00:00 oracle+ASM1_asmb_+asm1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
grid      8696     1  0 12:44 ?        00:00:00 oracle+ASM1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
grid      8719     1  0 12:44 ?        00:00:00 oracle+ASM1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root     11990  8821  0 12:48 pts/0    00:00:00 su - oracle
oracle   11991 11990  0 12:48 pts/0    00:00:00 -bash
grid     18501 16378  0 12:57 pts/1    00:00:00 grep --color=auto oracle
[grid@p19c01 ~]$
[grid@p19c01 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  ONLINE       p19c01                   STABLE
               ONLINE  ONLINE       p19c02                   STABLE
ora.chad
               ONLINE  ONLINE       p19c01                   STABLE
               ONLINE  ONLINE       p19c02                   STABLE
ora.net1.network
               ONLINE  ONLINE       p19c01                   STABLE
               ONLINE  ONLINE       p19c02                   STABLE
ora.ons
               ONLINE  ONLINE       p19c01                   STABLE
               ONLINE  ONLINE       p19c02                   STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
      1        ONLINE  ONLINE       p19c01                   STABLE
      2        ONLINE  ONLINE       p19c02                   STABLE
      3        ONLINE  OFFLINE                               STABLE
ora.DATA.dg(ora.asmgroup)
      1        ONLINE  ONLINE       p19c01                   STABLE
      2        ONLINE  ONLINE       p19c02                   STABLE
      3        OFFLINE OFFLINE                               STABLE
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       p19c02                   STABLE
ora.OCR.dg(ora.asmgroup)
      1        ONLINE  ONLINE       p19c01                   STABLE
      2        ONLINE  ONLINE       p19c02                   STABLE
      3        OFFLINE OFFLINE                               STABLE
ora.asm(ora.asmgroup)
      1        ONLINE  ONLINE       p19c01                   Started,STABLE
      2        ONLINE  ONLINE       p19c02                   Started,STABLE
      3        OFFLINE OFFLINE                               STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
      1        ONLINE  ONLINE       p19c01                   STABLE
      2        ONLINE  ONLINE       p19c02                   STABLE
      3        OFFLINE OFFLINE                               STABLE
ora.cvu
      1        ONLINE  ONLINE       p19c02                   STABLE
ora.p19c0.db
      1        ONLINE  ONLINE       p19c02                   Open,HOME=/u01/app/o
                                                             racle/product/19.3.0
                                                             /dbhome_1,STABLE
      2        OFFLINE OFFLINE                               Instance Shutdown,ST
                                                             ABLE
ora.p19c01.vip
      1        ONLINE  ONLINE       p19c01                   STABLE
ora.p19c02.vip
      1        ONLINE  ONLINE       p19c02                   STABLE
ora.qosmserver
      1        ONLINE  ONLINE       p19c02                   STABLE
ora.scan1.vip
      1        ONLINE  ONLINE       p19c02                   STABLE
--------------------------------------------------------------------------------
[grid@p19c01 ~]$
[grid@p19c01 ~]$
[grid@p19c01 ~]$ srvctl start instance -d P19C0 -i p19c01
[grid@p19c01 ~]$
[grid@p19c01 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  ONLINE       p19c01                   STABLE
               ONLINE  ONLINE       p19c02                   STABLE
ora.chad
               ONLINE  ONLINE       p19c01                   STABLE
               ONLINE  ONLINE       p19c02                   STABLE
ora.net1.network
               ONLINE  ONLINE       p19c01                   STABLE
               ONLINE  ONLINE       p19c02                   STABLE
ora.ons
               ONLINE  ONLINE       p19c01                   STABLE
               ONLINE  ONLINE       p19c02                   STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
      1        ONLINE  ONLINE       p19c01                   STABLE
      2        ONLINE  ONLINE       p19c02                   STABLE
      3        ONLINE  OFFLINE                               STABLE
ora.DATA.dg(ora.asmgroup)
      1        ONLINE  ONLINE       p19c01                   STABLE
      2        ONLINE  ONLINE       p19c02                   STABLE
      3        OFFLINE OFFLINE                               STABLE
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       p19c02                   STABLE
ora.OCR.dg(ora.asmgroup)
      1        ONLINE  ONLINE       p19c01                   STABLE
      2        ONLINE  ONLINE       p19c02                   STABLE
      3        OFFLINE OFFLINE                               STABLE
ora.asm(ora.asmgroup)
      1        ONLINE  ONLINE       p19c01                   Started,STABLE
      2        ONLINE  ONLINE       p19c02                   Started,STABLE
      3        OFFLINE OFFLINE                               STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
      1        ONLINE  ONLINE       p19c01                   STABLE
      2        ONLINE  ONLINE       p19c02                   STABLE
      3        OFFLINE OFFLINE                               STABLE
ora.cvu
      1        ONLINE  ONLINE       p19c02                   STABLE
ora.p19c0.db
      1        ONLINE  ONLINE       p19c02                   Open,HOME=/u01/app/o
                                                             racle/product/19.3.0
                                                             /dbhome_1,STABLE
      2        ONLINE  ONLINE       p19c01                   Open,HOME=/u01/app/o
                                                             racle/product/19.3.0
                                                             /dbhome_1,STABLE
ora.p19c01.vip
      1        ONLINE  ONLINE       p19c01                   STABLE
ora.p19c02.vip
      1        ONLINE  ONLINE       p19c02                   STABLE
ora.qosmserver
      1        ONLINE  ONLINE       p19c02                   STABLE
ora.scan1.vip
      1        ONLINE  ONLINE       p19c02                   STABLE
--------------------------------------------------------------------------------
[grid@p19c01 ~]$

验证节点1正常后,可以操作节点2

srvctl stop instance -d <数据库名> -i p19c02

srvctl start instance -d <数据库名> -i p19c02

4)查看SGA正常后,动态调整 SGA_TARGET

查看SGA空间大小:

动态调整SGA_TARGET

-- 节点1

SQL> ALTER SYSTEM SET sga_target = 4G SCOPE=BOTH SID='p19c01';

-- 节点2

SQL> ALTER SYSTEM SET sga_target = 4G SCOPE=BOTH SID='p19c02';

5)按需调整 PGA(复现内存保护机制)

SQL> ALTER SYSTEM SET pga_aggregate_target = 1536M SCOPE=BOTH SID='p19c01';

出现报错

注意:

这是因为Oracle 19c 对 SGA 和 PGA 的总和有一个默认的安全限制,通常是物理内存的 70%、80%,Oracle 在实例启动时检查内存分配,发现 SGA + PGA 的总和超出了物理内存的安全阈值(80%左右)。如果超出了安全阈值,会触发数据内存保护机制,最明显的表现就是数据库卡在mount状态却无法open,这时候也可以去查看日志信息。

参考链接: pro-oracle: Oracle Database 19c -- ORA-00700: soft internal error, arguments: pga physmem limit

SQL> ALTER SYSTEM SET pga_aggregate_target = 1536M SCOPE=BOTH SID='p19c01';

6)验证

SQL> SHOW PARAMETER sga_target;

SQL> SHOW PARAMETER sga_max_size;

SQL> SELECT SUM(value)/1024/1024/1024 AS sga_gb FROM v$sga;

SQL> SELECT component, current_size/1024/1024/1024 AS gb FROM v$sga_dynamic_components ORDER BY current_size DESC;

SQL> SHOW PARAMETER sga_target;

3.2.AMM 模式迁移到 ASMM 并调整 SGA(为什么推荐ASMM?)

原因:为什么极力推荐切换至ASMM?

老版本中AMM由于底层操作系统不能有效支持HugePage,大内存服务器性能差,内存访问延迟很高,并且AMM的管理方式会存在跨SGA/PGA内存抢占 ,如果业务高峰期PGA暴涨,AMM会强行从SGA中抢占内存 →SGA内存区Shared Pool/Buffer Cache这时会突然缩小→容易触发大量硬解析,造成性能骤然下降的问题。

相反ASMM只负责SGA内存区域,天然与PGA进行隔离,且ASMM能完美的支持HugePage,内存边界清晰,波动可控,这也是为什么需要选择ASM的方式。

如果仍需使用AMM方式扩容,注意以下区别:

  • AMM(自动内存管理) :Oracle 通过 /dev/shm 来分配和管理共享内存,因此如果使用 AMM,/dev/shm的大小必须足够大,通常需要手动去进行调整(如在 /etc/fstab 中添加 tmp /dev/shm tmpfs defaults,size=8G),示例如下图:

修改完之后重新mount一下 /dev/shm后还需修改/etc/sysctl.conf文件,其中kernel.shmmax、kernel.shmall需要重新进行计算。

  • ASMM(自动共享内存管理) :Oracle 使用传统的 System V 共享内存HugePages完全不依赖/dev/shm。因此迁移到 ASMM 后,/dev/shm的大小对数据库不再关键。迁移前的重要准备,在开始操作前,请务必完成以下准备工作,以确保数据安全;

3.2.1.前置操作

1)备份SPFILE

这是最关键的一步。如果迁移后实例无法启动,可以使用备份文件快速恢复。

SQL> create pfile='/tmp/init_before_asmm.ora' from spfile;

务必记录下这个备份文件的路径

2)确认当前内存模式

检查当前参数,确认AMM正在运行。

SQL> show parameter memory_target;

SQL> show parameter sga_target;

例如:

如果memory_target非零,这里是0,显然已经开启了sga_target和pga_aggregate_target非零,则确认AMM未启用(19c默认安装时已将AMM方式进行弃用)。

3.2.2.迁移步骤

以下操作需要在所有RAC节点 上执行。建议使用 sid='*' 以确保参数修改应用到整个集群。

1)禁用AMM并设置ASMM参数

通过ALTER SYSTEM命令修改SPFILE。以下示例参数值(如SGA_TARGET=4G)仅为参考,请根据您的实际内存规划和业务需求进行调整。

-- 禁用AMM

SQL> ALTER SYSTEM SET memory_target=0 SCOPE=spfile SID='*';

SQL> ALTER SYSTEM SET memory_max_target=0 SCOPE=spfile SID='*';

-- 启用ASMM,并设置SGA和PGA的目标大小

SQL> ALTER SYSTEM SET sga_target=4G SCOPE=spfile SID='*';

SQL> ALTER SYSTEM SET sga_max_size=4G SCOPE=spfile SID='*';

SQL> ALTER SYSTEM SET pga_aggregate_target=1536M SCOPE=spfile SID='*';

-- (可选)为关键SGA组件设置最小值,以防止被过度压缩

SQL> ALTER SYSTEM SET shared_pool_size=4G SCOPE=spfile SID='*';

SQL> ALTER SYSTEM SET db_cache_size=8G SCOPE=spfile SID='*';

注意:sga_max_size跟上边一样,也应大于或等于sga_target,且所有节点的参数值应保持一致。

2)处理SPFILE中的残留参数(关键避坑)

执行完上述命令后,不要直接重启数据库。因为SPFILE中可能仍残留memory_max_target和memory_target参数,直接重启可能会遇到ORA-00843或ORA-00849错误。

正确的做法是:创建一个新的PFILE,并手动删除其中的AMM参数

-- 从当前SPFILE创建PFILE

SQL> create pfile='/tmp/init_asmm.ora' from spfile;

然后,使用文本编辑器打开/tmp/init_asmm.ora文件,删除其中所有包含memory_max_target和memory_target的行

3)使用新PFILE重启实例

使用清理后的PFILE文件重启数据库。

SQL> shutdown immediate;

SQL> startup pfile='/tmp/init_asmm.ora';

如果启动成功,说明ASMM配置已生效。

4)重建SPFILE

确认数据库使用新PFILE启动正常后,基于它重建SPFILE,并恢复使用SPFILE启动。

SQL> create spfile from pfile='/tmp/init_asmm.ora';

SQL> shutdown immediate;

SQL> startup;

最后,可以再次创建SPFILE的备份,并检查确认memory_target为0,sga_target大于0,即表示已成功迁移至ASMM。

5)修改 OS 内核参数

确保 kernel.shmmax ≥ SFA_MAX_SIZE,kernel.shmall足够,vm.nr_hugepages按需设置。

# 示例:

SGA_MAX_SIZE=375G

kernel.shmmax = 402653184000

kernel.shmall = 98304000

vm.nr_hugepages = 192000

执行生效:sysctl -p

查看:grep Huge /proc/meminfo

注意:

**脚本:**vm.nr_hugepages可以通过这个命令:find $ORACLE_HOME -name hugepages_settings.sh 2>/dev/null查看是否有执行脚本,但19c版本不存在。

**手动计算:**vm.nr_hugepages = (SGA_MAX_SIZE 字节数) / (2 * 1024 * 1024) + 余量。余量一般建议加 5% 左右,并向上取整。例如,如果 SGA_MAX_SIZE = 4GB = 4294967296 字节:

6)滚动重启实例

srvctl stop instance -d <数据库名> -i rac1

srvctl start instance -d <数据库名> -i rac1

验证节点1

srvctl stop instance -d <数据库名> -i rac2

srvctl start instance -d <数据库名> -i rac2

7)参数验证

SQL> SHOW PARAMETER memory_target; -- 应为 0

SQL> SHOW PARAMETER sga_target; -- 应为 4 G

SQL> SHOW PARAMETER sga_max_size; -- 应为 4 G

SQL> SHOW PARAMETER pga_aggregate_target; -- 应为 1.5 G(1536M)

SQL> SELECT SUM(value)/1024/1024/1024 AS sga_gb FROM v$sga;

8)启用 HugePages(可选且极力推荐)

SQL> ALTER SYSTEM SET use_large_pages = TRUE SCOPE=SPFILE SID='rac1';

SQL> ALTER SYSTEM SET use_large_pages = TRUE SCOPE=SPFILE SID='rac2';

SQL> show parameter use_large_pages

然后滚动重启,并检查grep Huge /proc/meminfo。

3.3.手动模式迁移到 ASMM

1)查询当前各组件大小

SELECT component, current_size/1024/1024/1024 AS gb FROM v$sga_dynamic_components;

2)设置 ASMM 参数

-- 节点1

SQL> ALTER SYSTEM SET sga_target = 4G SCOPE=SPFILE SID='rac1';

SQL> ALTER SYSTEM SET sga_max_size = 4G SCOPE=SPFILE SID='rac1';

SQL> ALTER SYSTEM SET pga_aggregate_target = 1536M SCOPE=SPFILE SID='rac1';

-- 节点2

SQL> ALTER SYSTEM SET sga_target = 4G SCOPE=SPFILE SID='rac2';

SQL> ALTER SYSTEM SET sga_max_size = 4G SCOPE=SPFILE SID='rac2';

SQL> ALTER SYSTEM SET pga_aggregate_target = 1536M SCOPE=SPFILE SID='rac2';

3)重置手动组件参数(让 ASMM 自动管理)

SQL> ALTER SYSTEM RESET db_cache_size SCOPE=SPFILE SID='rac1';

SQL> ALTER SYSTEM RESET shared_pool_size SCOPE=SPFILE SID='rac1';

SQL> ALTER SYSTEM RESET large_pool_size SCOPE=SPFILE SID='rac1';

SQL> ALTER SYSTEM RESET java_pool_size SCOPE=SPFILE SID='rac1';

SQL> ALTER SYSTEM RESET streams_pool_size SCOPE=SPFILE SID='rac1';

-- 节点2同理

4)修改 OS 内核参数

同上。

四、验证与注意事项

4.1.调整后验证

-- SGA 总大小

SQL> SELECT SUM(value)/1024/1024/1024 AS sga_gb FROM v$sga;

-- 各组件分配

SQL> SELECT component, current_size/1024/1024/1024 AS gb FROM v$sga_dynamic_components ORDER BY current_size DESC;

-- PGA 使用

SQL> SELECT name, value/1024/1024/1024 AS gb FROM v$pgastat

WHERE name IN ('aggregate PGA target parameter','total PGA allocated');

-- 参数确认

SQL> SHOW PARAMETER memory_target;

SQL> SHOW PARAMETER sga_target;

SQL> SHOW PARAMETER sga_max_size;

SQL> SHOW PARAMETER pga_aggregate_target;

OS 层:

free -g

grep Huge /proc/meminfo

ipcs -m

4.2.注意事项

RAC 中不要使用 AMM。如果当前是 AMM,优先迁移到 ASMM。

必须指定 SID。RAC 中实例级参数优先于全局参数,修改时明确指定 SID='rac01'、SID='rac02'。

逐节点滚动重启。不要同时重启两个节点,确保另一个节点能承担负载。

内核参数和数据库参数配合修改。kernel.shmmax、kernel.shmall、vm.nr_hugepages 必须提前调整。

SGA_MAX_SIZE是静态参数,修改后必须重启;SGA_TARGET 是动态参数,可在线调整。

备份 SPFILE。操作前执行 CREATE PFILE='/tmp/init_backup.ora' from spfile;。

4.3.总结表

模式 推荐动作
ASMM 检查 SGA_MAX_SIZE,不够则改大并滚动重启,然后动态调 SGA_TARGET
AMM 迁移到 ASMM:设 MEMORY_TARGET=0,设 SGA_TARGET、SGA_MAX_SIZE、PGA_AGGREGATE_TARGET,滚动重启
手动 迁移到 ASMM:设 SGA_TARGET、SGA_MAX_SIZE、PGA_AGGREGATE_TARGET ,重置手动组件参数,滚动重启
相关推荐
CQU_JIAKE1 小时前
9.10【A】
数据库
乐观的Terry2 小时前
Redis生产环境redis-conf配置教程
数据库·redis
SeaTunnel2 小时前
Redis 数据迁移不用写脚本:SeaTunnel 支持 String、Hash、Set、ZSet 四种数据类型
数据库·redis·哈希算法·数据迁移·seatunnel·数据同步
晊晌_h2 小时前
嵌入式从0到精通——SQLite3 数据库
数据库·sqlite·sqlite3
海浪仙人掌2 小时前
账龄分析怎么操作?账龄分析实施流程有哪些步骤?
数据库
楚枫默寒2 小时前
Oracle AWR 自动巡检报告
数据库·oracle
吉甫作诵2 小时前
Oracle 19c 常用运维命令大全
运维·数据库·oracle
宗介波妞2 小时前
主站与场站多业务链路通断测试实战指南(电力自动化联调)
网络·数据库
邪修king2 小时前
MySQL数据库(二):操作详解:从创建、查看到备份恢复
数据库·mysql