本文档风哥主要介绍Oracle数据库PDB内存管理相关知识,包括PDB内存管理的概念、方法、要求、规划、配置、验证等内容,由风哥教程参考Oracle官方文档Multitenant内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 PDB内存管理的概念
Oracle数据库PDB内存管理是指在多租户容器数据库(CDB)中管理PDB的内存使用,包括SGA、PGA等内存组件。PDB内存管理可以实现内存的合理分配,提高数据库性能和稳定性。PDB内存管理包括内存分配、内存监控、内存调优等操作。更多视频教程www.fgedu.net.cn
- 支持内存的合理分配
- 支持内存的动态调整
- 支持内存的监控和报告
- 支持内存的优先级管理
- 提高数据库性能和稳定性
1.2 PDB内存管理的方法
Oracle数据库PDB内存管理的方法:
- SGA管理:管理系统全局区(SGA)
- PGA管理:管理程序全局区(PGA)
- 内存分配:为PDB分配内存
- 内存监控:监控内存使用情况
- 内存调优:优化内存配置
1.3 PDB内存管理的要求
Oracle数据库PDB内存管理的要求:
- CDB架构:必须在CDB架构中进行内存管理
- 系统资源:足够的CPU、内存和磁盘空间
- 权限:需要SYSDBA权限
- 兼容性:Oracle数据库版本必须支持PDB内存管理
- 配置:需要配置适当的参数和选项
Part02-生产环境规划与建议
2.1 PDB内存管理规划
Oracle数据库PDB内存管理规划要点:
1. 分析业务需求
2. 评估系统资源
3. 设计内存管理方案
4. 规划内存管理架构
5. 规划内存分配
6. 规划内存监控
7. 规划内存调优
8. 测试和验证
# 适用场景
– 多租户数据库
– 内存需求不同的应用
– 需要内存隔离的系统
– 需要内存优先级的系统
– 需要内存监控的系统
# 不适用场景
– 单租户数据库
– 内存需求简单的系统
– 低内存需求系统
2.2 PDB内存管理设计
Oracle数据库PDB内存管理设计建议:
– 基于业务需求设计
– 基于资源需求设计
– 最小化内存争用
– 最大化内存利用率
– 合理配置参数
# PDB内存管理设计策略
– 合理规划内存管理架构
– 配置适当的内存分配
– 配置适当的内存监控
– 配置适当的内存调优
– 配置适当的内存告警
# 设计步骤
1. 分析业务需求
2. 评估系统资源
3. 设计内存管理方案
4. 规划内存管理架构
5. 测试内存管理效果
6. 调整配置
2.3 PDB内存管理最佳实践
Oracle数据库PDB内存管理最佳实践:
- 规划内存管理架构:根据业务需求规划内存管理架构,最小化内存争用
- 配置内存分配:为PDB配置合理的内存分配
- 监控内存使用:监控内存使用情况,及时发现和处理问题
- 动态调整内存:根据业务需求动态调整内存分配
- 设置内存告警:设置内存告警,及时发现内存争用
- 定期review:定期review内存管理配置,优化内存分配
Part03-生产环境项目实施方案
3.1 PDB内存管理实施
3.1.1 配置SGA管理
SQL> SELECT con_id, name, open_mode FROM v$pdbs ORDER BY con_id;
CON_ID NAME OPEN_MODE
—— ——— ———-
2 PDB$SEED READ ONLY
3 SALESPDB READ WRITE
4 HRPDB READ WRITE
5 APP_ROOT READ WRITE
6 APP_PDB1 READ WRITE
# 切换到PDB
SQL> ALTER SESSION SET CONTAINER = fgfgfgsalespdb;
Session altered.
# 查看SGA参数
SQL> SHOW PARAMETER sga_target;
NAME TYPE VALUE
———————————— ———– ——————————
sga_target big integer 0
SQL> SHOW PARAMETER sga_max_size;
NAME TYPE VALUE
———————————— ———– ——————————
sga_max_size big integer 0
# 查看SGA使用情况
SQL> SELECT name, bytes/1024/1024 AS size_mb
FROM v$sgainfo
WHERE name IN (‘Total SGA Size’, ‘Free SGA Memory Available’);
NAME SIZE_MB
—————————— ———-
Total SGA Size 1024.00
Free SGA Memory Available 256.00
# 配置SGA
SQL> ALTER SYSTEM SET SGA_TARGET = 800M SCOPE = BOTH;
System altered.
SQL> ALTER SYSTEM SET SGA_MAX_SIZE = 1G SCOPE = BOTH;
System altered.
# 查看SGA参数
SQL> SHOW PARAMETER sga_target;
NAME TYPE VALUE
———————————— ———– ——————————
sga_target big integer 800M
SQL> SHOW PARAMETER sga_max_size;
NAME TYPE VALUE
———————————— ———– ——————————
sga_max_size big integer 1G
# 验证SGA配置成功
3.1.2 配置PGA管理
SQL> ALTER SESSION SET CONTAINER = fgfgfgsalespdb;
Session altered.
# 查看PGA参数
SQL> SHOW PARAMETER pga_aggregate_target;
NAME TYPE VALUE
———————————— ———– ——————————
pga_aggregate_target big integer 0
SQL> SHOW PARAMETER workarea_size_policy;
NAME TYPE VALUE
———————————— ———– ——————————
workarea_size_policy string AUTO
# 查看PGA使用情况
SQL> SELECT name, value/1024/1024 AS size_mb
FROM v$pgastat
WHERE name IN (‘total PGA memory allocated’, ‘total freeable PGA memory’, ‘total PGA inuse’);
NAME SIZE_MB
—————————— ———-
total PGA memory allocated 256.00
total freeable PGA memory 64.00
total PGA inuse 192.00
# 配置PGA
SQL> ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 200M SCOPE = BOTH;
System altered.
# 查看PGA参数
SQL> SHOW PARAMETER pga_aggregate_target;
NAME TYPE VALUE
———————————— ———– ——————————
pga_aggregate_target big integer 200M
# 验证PGA配置成功
3.2 PDB内存管理配置
3.2.1 配置内存目标管理
SQL> ALTER SESSION SET CONTAINER = fgfgfgsalespdb;
Session altered.
# 查看内存目标参数
SQL> SHOW PARAMETER memory_target;
NAME TYPE VALUE
———————————— ———– ——————————
memory_target big integer 0
SQL> SHOW PARAMETER memory_max_target;
NAME TYPE VALUE
———————————— ———– ——————————
memory_max_target big integer 0
# 查看内存使用情况
SQL> SELECT name, bytes/1024/1024 AS size_mb
FROM v$sgainfo
WHERE name = ‘Total SGA Size’;
NAME SIZE_MB
—————————— ———-
Total SGA Size 800.00
SQL> SELECT name, value/1024/1024 AS size_mb
FROM v$pgastat
WHERE name = ‘total PGA memory allocated’;
NAME SIZE_MB
—————————— ———-
total PGA memory allocated 200.00
# 配置内存目标
SQL> ALTER SYSTEM SET MEMORY_TARGET = 1G SCOPE = BOTH;
System altered.
SQL> ALTER SYSTEM SET MEMORY_MAX_TARGET = 2G SCOPE = BOTH;
System altered.
# 查看内存目标参数
SQL> SHOW PARAMETER memory_target;
NAME TYPE VALUE
———————————— ———– ——————————
memory_target big integer 1G
SQL> SHOW PARAMETER memory_max_target;
NAME TYPE VALUE
———————————— ———– ——————————
memory_max_target big integer 2G
# 验证内存目标配置成功
3.2.2 配置内存组件管理
SQL> ALTER SESSION SET CONTAINER = fgfgfgsalespdb;
Session altered.
# 查看SGA组件
SQL> SELECT pool, bytes/1024/1024 AS size_mb
FROM v$sgastat
WHERE pool IS NOT NULL
GROUP BY pool
ORDER BY pool;
POOL SIZE_MB
——————————– ———-
buffer_cache 512.00
java_pool 0.00
large_pool 64.00
shared_pool 224.00
streams_pool 0.00
# 配置SGA组件
SQL> ALTER SYSTEM SET DB_CACHE_SIZE = 512M SCOPE = BOTH;
System altered.
SQL> ALTER SYSTEM SET SHARED_POOL_SIZE = 224M SCOPE = BOTH;
System altered.
SQL> ALTER SYSTEM SET LARGE_POOL_SIZE = 64M SCOPE = BOTH;
System altered.
# 查看SGA组件参数
SQL> SHOW PARAMETER db_cache_size;
NAME TYPE VALUE
———————————— ———– ——————————
db_cache_size big integer 512M
SQL> SHOW PARAMETER shared_pool_size;
NAME TYPE VALUE
———————————— ———– ——————————
shared_pool_size big integer 224M
SQL> SHOW PARAMETER large_pool_size;
NAME TYPE VALUE
———————————— ———– ——————————
large_pool_size big integer 64M
# 验证SGA组件配置成功
3.3 PDB内存管理验证
3.3.1 验证PDB内存管理状态
SQL> ALTER SESSION SET CONTAINER = cdb$root;
Session altered.
# 查看PDB内存使用情况
SQL> SELECT con_id, name, open_mode, total_size, free_space
FROM v$pdbs
ORDER BY con_id;
CON_ID NAME OPEN_MODE TOTAL_SIZE FREE_SPACE
—— ——— ———- ———- ———–
2 PDB$SEED READ ONLY 1048576 524288
3 SALESPDB READ WRITE 1048576 524288
4 HRPDB READ WRITE 1048576 524288
5 APP_ROOT READ WRITE 1048576 524288
6 APP_PDB1 READ WRITE 1048576 524288
# 查看PDB内存参数
SQL> SELECT pdb_id, name,
memory_target,
memory_max_target,
sga_target,
pga_aggregate_target
FROM dba_pdbs
ORDER BY pdb_id;
PDB_ID NAME MEMORY_TARGET MEMORY_MAX_TARGET SGA_TARGET PGA_AGGREGATE_TARGET
—— ——— ————- —————– ———– ———————
3 SALESPDB 1G 2G 800M 200M
4 HRPDB 0 0 0 0
5 APP_ROOT 0 0 0 0
6 APP_PDB1 0 0 0 0
# 验证PDB内存管理状态
3.3.2 验证PDB内存管理功能
SQL> ALTER SESSION SET CONTAINER = fgfgfgsalespdb;
Session altered.
# 查看SGA使用情况
SQL> SELECT name, bytes/1024/1024 AS size_mb
FROM v$sgainfo
WHERE name IN (‘Total SGA Size’, ‘Free SGA Memory Available’);
NAME SIZE_MB
—————————— ———-
Total SGA Size 800.00
Free SGA Memory Available 200.00
# 查看PGA使用情况
SQL> SELECT name, value/1024/1024 AS size_mb
FROM v$pgastat
WHERE name IN (‘total PGA memory allocated’, ‘total freeable PGA memory’, ‘total PGA inuse’);
NAME SIZE_MB
—————————— ———-
total PGA memory allocated 200.00
total freeable PGA memory 50.00
total PGA inuse 150.00
# 查看内存命中率
SQL> SELECT name, value
FROM v$sysstat
WHERE name IN (‘session logical reads’, ‘physical reads’, ‘physical reads direct’);
NAME VALUE
—————————— ———-
session logical reads 123456789
physical reads 123456
physical reads direct 67890
# 计算内存命中率
SQL> SELECT
round((1 – (physical_reads / session_logical_reads)) * 100, 2) AS buffer_cache_hit_ratio
FROM (
SELECT
sum(decode(name, ‘session logical reads’, value, 0)) AS session_logical_reads,
sum(decode(name, ‘physical reads’, value, 0)) AS physical_reads
FROM v$sysstat
WHERE name IN (‘session logical reads’, ‘physical reads’)
);
BUFFER_CACHE_HIT_RATIO
———————
99.90
# 验证PDB内存管理功能成功
Part04-生产案例与实战讲解
4.1 PDB内存管理案例
在某企业的生产环境中,需要为PDB配置内存管理。
– 数据库版本:Oracle 19c
– 系统规模:中等规模,日交易量100万
– 需求:为PDB配置内存管理
# 实施方案
1. 查看PDB
SQL> SELECT con_id, name, open_mode FROM v$pdbs ORDER BY con_id;
CON_ID NAME OPEN_MODE
—— ——— ———-
2 PDB$SEED READ ONLY
3 SALESPDB READ WRITE
4 HRPDB READ WRITE
5 APP_ROOT READ WRITE
6 APP_PDB1 READ WRITE
2. 切换到PDB
SQL> ALTER SESSION SET CONTAINER = fgfgfgsalespdb;
Session altered.
3. 配置SGA
SQL> ALTER SYSTEM SET SGA_TARGET = 800M SCOPE = BOTH;
System altered.
4. 配置PGA
SQL> ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 200M SCOPE = BOTH;
System altered.
5. 验证内存配置
SQL> SHOW PARAMETER sga_target;
NAME TYPE VALUE
———————————— ———– ——————————
sga_target big integer 800M
SQL> SHOW PARAMETER pga_aggregate_target;
NAME TYPE VALUE
———————————— ———– ——————————
pga_aggregate_target big integer 200M
# 实施效果
– 成功配置PDB内存管理
– 内存使用合理
– 内存争用减少
– 数据库性能提高
4.2 PDB内存管理优化案例
在某金融机构的生产环境中,需要优化PDB内存管理,提高内存利用率。
– 数据库版本:Oracle 19c
– 系统规模:大规模,日交易量1000万
– 问题:PDB内存管理需要优化
# 优化方案
1. 查看内存使用情况
SQL> ALTER SESSION SET CONTAINER = fgfgfgsalespdb;
Session altered.
SQL> SELECT name, bytes/1024/1024 AS size_mb
FROM v$sgainfo
WHERE name IN (‘Total SGA Size’, ‘Free SGA Memory Available’);
NAME SIZE_MB
—————————— ———-
Total SGA Size 512.00
Free SGA Memory Available 100.00
2. 查看内存命中率
SQL> SELECT
round((1 – (physical_reads / session_logical_reads)) * 100, 2) AS buffer_cache_hit_ratio
FROM (
SELECT
sum(decode(name, ‘session logical reads’, value, 0)) AS session_logical_reads,
sum(decode(name, ‘physical reads’, value, 0)) AS physical_reads
FROM v$sysstat
WHERE name IN (‘session logical reads’, ‘physical reads’)
);
BUFFER_CACHE_HIT_RATIO
———————
95.50
3. 优化内存配置
SQL> ALTER SYSTEM SET SGA_TARGET = 1G SCOPE = BOTH;
System altered.
SQL> ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 300M SCOPE = BOTH;
System altered.
4. 验证优化效果
SQL> SHOW PARAMETER sga_target;
NAME TYPE VALUE
———————————— ———– ——————————
sga_target big integer 1G
SQL> SHOW PARAMETER pga_aggregate_target;
NAME TYPE VALUE
———————————— ———– ——————————
pga_aggregate_target big integer 300M
5. 查看内存命中率
SQL> SELECT
round((1 – (physical_reads / session_logical_reads)) * 100, 2) AS buffer_cache_hit_ratio
FROM (
SELECT
sum(decode(name, ‘session logical reads’, value, 0)) AS session_logical_reads,
sum(decode(name, ‘physical reads’, value, 0)) AS physical_reads
FROM v$sysstat
WHERE name IN (‘session logical reads’, ‘physical reads’)
);
BUFFER_CACHE_HIT_RATIO
———————
99.80
# 优化效果
– 内存配置优化
– 内存命中率提高
– 数据库性能提高
– 内存争用减少
4.3 PDB内存管理问题处理
在某电商网站的生产环境中,PDB内存管理出现问题,需要处理。
– 内存配置不合理
– 系统负载增加
– 内存争用严重
# 分析步骤
1. 查看系统资源
$ free -h
total used free shared buff/cache available
Mem: 15G 10G 2G 500M 3G 4G
Swap: 15G 5G 10G
2. 查看内存使用情况
SQL> ALTER SESSION SET CONTAINER = fgfgfgsalespdb;
Session altered.
SQL> SELECT name, bytes/1024/1024 AS size_mb
FROM v$sgainfo
WHERE name IN (‘Total SGA Size’, ‘Free SGA Memory Available’);
NAME SIZE_MB
—————————— ———-
Total SGA Size 512.00
Free SGA Memory Available 5.00
3. 查看内存命中率
SQL> SELECT
round((1 – (physical_reads / session_logical_reads)) * 100, 2) AS buffer_cache_hit_ratio
FROM (
SELECT
sum(decode(name, ‘session logical reads’, value, 0)) AS session_logical_reads,
sum(decode(name, ‘physical reads’, value, 0)) AS physical_reads
FROM v$sysstat
WHERE name IN (‘session logical reads’, ‘physical reads’)
);
BUFFER_CACHE_HIT_RATIO
———————
85.50
# 问题原因
– 内存配置不合理
– 内存争用严重
# 解决方案
1. 优化内存配置
SQL> ALTER SYSTEM SET SGA_TARGET = 1G SCOPE = BOTH;
System altered.
SQL> ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 300M SCOPE = BOTH;
System altered.
2. 验证内存配置
SQL> SHOW PARAMETER sga_target;
NAME TYPE VALUE
———————————— ———– ——————————
sga_target big integer 1G
SQL> SHOW PARAMETER pga_aggregate_target;
NAME TYPE VALUE
———————————— ———– ——————————
pga_aggregate_target big integer 300M
3. 查看内存命中率
SQL> SELECT
round((1 – (physical_reads / session_logical_reads)) * 100, 2) AS buffer_cache_hit_ratio
FROM (
SELECT
sum(decode(name, ‘session logical reads’, value, 0)) AS session_logical_reads,
sum(decode(name, ‘physical reads’, value, 0)) AS physical_reads
FROM v$sysstat
WHERE name IN (‘session logical reads’, ‘physical reads’)
);
BUFFER_CACHE_HIT_RATIO
———————
99.50
# 解决效果
– 内存配置合理
– 数据库性能恢复正常
– 系统负载降低
– 内存争用减少
Part05-风哥经验总结与分享
5.1 PDB内存管理经验
Oracle数据库PDB内存管理经验:
- 规划内存管理架构:根据业务需求规划内存管理架构,最小化内存争用
- 配置内存分配:为PDB配置合理的内存分配
- 监控内存使用:监控内存使用情况,及时发现和处理问题
- 动态调整内存:根据业务需求动态调整内存分配
- 设置内存告警:设置内存告警,及时发现内存争用
- 定期review:定期review内存管理配置,优化内存分配
5.2 PDB内存管理检查清单
– [ ] 检查系统资源
– [ ] 检查CDB架构
– [ ] 检查PDB内存需求
– [ ] 检查SGA资源
– [ ] 检查PGA资源
– [ ] 检查内存命中率
– [ ] 规划内存管理架构
– [ ] 配置SGA
– [ ] 配置PGA
– [ ] 验证内存管理功能
# PDB内存管理问题处理流程
1. 检查系统资源
2. 检查CDB架构
3. 检查PDB内存需求
4. 规划内存管理架构
5. 配置SGA
6. 配置PGA
7. 验证内存管理功能
8. 处理内存管理问题
9. 优化配置
10. 监控内存使用情况
5.3 PDB内存管理工具
Oracle数据库PDB内存管理常用工具:
- SQL*Plus:SQL命令行工具,用于执行SQL命令
- Oracle Enterprise Manager:图形化管理工具,用于监控和管理数据库
- AWR报告:自动工作负载存储库报告,用于分析性能
- ASH报告:活动会话历史报告,用于分析会话活动
- SQL Developer:SQL开发工具,用于开发和调试SQL
- DBCA:数据库配置助手,用于创建和管理数据库
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
