目录
[1.1 资源分类的必要性](#1.1 资源分类的必要性)
[1.2 资源分类概览](#1.2 资源分类概览)
[2.1 什么是PCM资源?](#2.1 什么是PCM资源?)
[2.2 PCM资源的管理机制](#2.2 PCM资源的管理机制)
[2.2.1 主节点(Master Node)分配](#2.2.1 主节点(Master Node)分配)
[2.3 PCM资源的工作流程](#2.3 PCM资源的工作流程)
[2.4 PCM性能优化](#2.4 PCM性能优化)
[3.1 什么是非PCM资源?](#3.1 什么是非PCM资源?)
[3.2 非PCM资源的分类](#3.2 非PCM资源的分类)
[3.2.1 字典缓存资源(Dictionary Cache Resources)](#3.2.1 字典缓存资源(Dictionary Cache Resources))
[3.2.2 库缓存资源(Library Cache Resources)](#3.2.2 库缓存资源(Library Cache Resources))
[3.2.3 事务资源(Transaction Resources)](#3.2.3 事务资源(Transaction Resources))
[3.2.4 队列资源(Enqueue Resources)](#3.2.4 队列资源(Enqueue Resources))
[3.3 非PCM资源的管理机制](#3.3 非PCM资源的管理机制)
[3.3.1 集中式管理与分布式管理](#3.3.1 集中式管理与分布式管理)
[3.3.2 锁转换流程](#3.3.2 锁转换流程)
[3.4 非PCM资源性能优化](#3.4 非PCM资源性能优化)
[4.1 事务场景中的协作](#4.1 事务场景中的协作)
[4.2 DDL操作中的复杂交互](#4.2 DDL操作中的复杂交互)
[4.3 诊断资源协作问题](#4.3 诊断资源协作问题)
[5.1 识别瓶颈类型](#5.1 识别瓶颈类型)
[5.2 PCM资源优化策略](#5.2 PCM资源优化策略)
[5.2.1 减少PCM传输](#5.2.1 减少PCM传输)
[5.2.2 优化私有互连](#5.2.2 优化私有互连)
[5.3 非PCM资源优化策略](#5.3 非PCM资源优化策略)
[5.3.1 库缓存优化](#5.3.1 库缓存优化)
[5.3.2 行缓存优化](#5.3.2 行缓存优化)
[5.4 混合工作负载调优](#5.4 混合工作负载调优)
[6.1 实例故障恢复](#6.1 实例故障恢复)
[6.2 网络分区处理](#6.2 网络分区处理)
[7.1 Oracle 19c的改进](#7.1 Oracle 19c的改进)
[7.2 Oracle 21c的革新](#7.2 Oracle 21c的革新)
[8.1 设计阶段考虑](#8.1 设计阶段考虑)
[8.2 监控体系建立](#8.2 监控体系建立)
[8.3 应急预案](#8.3 应急预案)
引言:资源管理的双重奏
在Oracle RAC的宏伟架构中,内存融合技术(Cache Fusion)的优雅运作依赖于对两类资源的精细管理:PCM资源 和非PCM资源。理解这两者的区别与交互,是掌握RAC内部工作机制的关键。就像交响乐团中弦乐与管乐的分工协作,PCM和非PCM资源共同奏响了数据库集群的高性能乐章。

oracle rac架构图
一、资源管理基础:为什么需要分类?
1.1 资源分类的必要性
Oracle RAC面对的资源访问模式复杂多样:
-
数据块访问(高频、小粒度)
-
库缓存对象访问(中频、中等粒度)
-
数据字典访问(低频、但关键)
-
事务锁管理(高频、小粒度)
单一的资源管理机制无法满足所有场景,因此Oracle设计了双重资源管理体系。
sql
-- 查看资源类型分布
SELECT resource_type, COUNT(*) AS resource_count
FROM gv$resource
GROUP BY resource_type
ORDER BY resource_count DESC;
1.2 资源分类概览
| 资源类型 | 管理机制 | 主要用途 | 示例 |
|---|---|---|---|
| PCM资源 | 缓存融合机制 | 数据块访问 | 表数据块、索引块 |
| 非PCM资源 | 全局队列服务 | 字典/元数据 | 数据字典、库缓存、事务锁 |
二、PCM资源:缓存融合的核心
2.1 什么是PCM资源?
PCM(Parallel Cache Management)资源是缓存融合技术直接管理的对象,主要包括数据文件中的数据块。这些资源的特点是:
-
访问频率高
-
需要严格的缓存一致性
-
支持并行访问
-
有明确的所有权关系
sql
-- PCM资源的内部表示:数据块地址(DBA)
SELECT dbms_utility.data_block_address_file(123456) AS file_id,
dbms_utility.data_block_address_block(123456) AS block_id
FROM dual;
2.2 PCM资源的管理机制
2.2.1 主节点(Master Node)分配
每个PCM资源都有一个主节点,使用哈希算法确定:
资源主节点 = HASH(DBA) % 节点数
这种分布确保了负载均衡:
sql
-- 查看数据块的主节点分布
SELECT
inst_id AS master_node,
COUNT(*) AS block_count,
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) AS percentage
FROM gv$gcspfmaster_info
GROUP BY inst_id
ORDER BY master_node;
2.3 PCM资源的工作流程
场景:两个实例访问同一数据块
sql
sql
-- 实例1:查询数据
SELECT * FROM orders WHERE order_id = 100;
-- 实例2:更新数据
UPDATE orders SET status = 'SHIPPED' WHERE order_id = 100;
PCM资源协调流程:
-
实例1请求:
-
向数据块的主节点(假设是实例3)请求共享锁
-
从磁盘加载数据到本地缓存
-
标记为SCUR状态
-
-
实例2请求:
-
向主节点(实例3)请求独占锁
-
主节点通知实例1降级锁(S→N)
-
实例1发送数据块给实例2
-
实例1保留PI(Past Image)
-
实例2获得独占锁,标记为XCUR状态
-
-
实例2提交:
-
写入重做日志
-
数据块变为脏块
-
锁保持直到被其他实例请求
-
2.4 PCM性能优化
sql
-- 监控PCM资源争用
SELECT
inst_id,
event,
total_waits,
time_waited_micro / 1000000 AS time_waited_secs,
average_wait_micro / 1000 AS avg_wait_ms
FROM gv$system_event
WHERE event IN (
'gc cr block 2-way',
'gc cr block 3-way',
'gc buffer busy',
'gc current block 2-way',
'gc current block 3-way'
)
ORDER BY time_waited_micro DESC;
-- PCM相关的重要参数
SHOW PARAMETER gc_; -- 查看所有GC相关参数
三、非PCM资源:集群协调的黏合剂
3.1 什么是非PCM资源?
非PCM资源是全局队列服务(GES)管理的对象,不涉及实际数据块的缓存一致性,但对集群协调至关重要:
sql
-- 非PCM资源的主要类型
SELECT DISTINCT resource_type
FROM gv$resource
WHERE resource_type NOT LIKE '%data%'
ORDER BY resource_type;
3.2 非PCM资源的分类
3.2.1 字典缓存资源(Dictionary Cache Resources)
sql
-- 管理数据字典信息同步
-- 例如:表定义、列信息、权限等
SELECT * FROM v$rowcache WHERE cache_name LIKE 'dc%';
3.2.2 库缓存资源(Library Cache Resources)
sql
-- 管理SQL、PL/SQL对象的同步
-- 例如:游标、存储过程、触发器等
SELECT namespace, gets, gethits, pins, pinhits, reloads
FROM v$librarycache
WHERE namespace IN ('SQL AREA', 'TABLE/PROCEDURE', 'BODY', 'TRIGGER');
3.2.3 事务资源(Transaction Resources)
sql
-- 管理分布式事务和锁
SELECT * FROM gv$transaction;
3.2.4 队列资源(Enqueue Resources)
sql
-- 管理各种队列锁
-- TX:事务锁
-- TM:表锁
-- UL:用户定义锁
SELECT type, id1, id2, lmode, request, ctime, block
FROM gv$lock
WHERE type NOT IN ('AE', 'MR')
ORDER BY type, id1, id2;
3.3 非PCM资源的管理机制
3.3.1 集中式管理与分布式管理
非PCM资源采用混合管理策略:
sql
-- 部分资源使用主节点模式
-- 部分资源使用完全分布式模式
-- 查看资源主节点信息
SELECT resource_name, master_node, on_convert_q, on_granted_q
FROM gv$ges_resource
WHERE resource_name LIKE '%%[A-Z]%' -- 非PCM资源通常包含字母
AND ROWNUM <= 5;
3.3.2 锁转换流程
非PCM资源的锁转换更为复杂:
实例1请求库缓存锁(SQL对象):
1. 向GES请求NULL→S锁
2. GES检查冲突:
- 如果没有冲突,立即授予
- 如果有冲突,加入等待队列
3. 实例1编译SQL
实例2需要修改同一对象(如DDL):
1. 请求NULL→X锁
2. GES要求实例1释放S锁
3. 实例1刷新相关游标
4. 实例2获得X锁,执行DDL
3.4 非PCM资源性能优化
sql
-- 监控非PCM资源争用
SELECT
event,
total_waits,
time_waited_micro / 1000000 AS time_waited_secs
FROM v$system_event
WHERE event IN (
'library cache lock',
'library cache pin',
'row cache lock',
'enq: TX - index contention',
'enq: TM - contention'
)
ORDER BY time_waited_micro DESC;
-- 关键参数优化
ALTER SYSTEM SET "_library_cache_advice" = TRUE; -- 启用库缓存建议
ALTER SYSTEM SET "_row_cache_cursors" = 200; -- 优化行缓存游标
四、PCM与非PCM资源的交互
4.1 事务场景中的协作
考虑一个完整的DML操作:
sql
-- 实例1执行:
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10;
资源协作流程:
-
非PCM阶段:
-
获取库缓存锁(解析SQL)
-
获取行缓存锁(验证表结构)
-
获取TX事务锁
-
-
PCM阶段:
-
获取数据块的PCM锁
-
修改数据块
-
创建UNDO块(也需要PCM管理)
-
-
提交阶段:
-
非PCM:TX锁转换
-
PCM:数据块状态更新
-
4.2 DDL操作中的复杂交互
sql
-- 在线表重组
ALTER TABLE orders MOVE ONLINE;
此操作涉及:
-
非PCM资源:
-
TM表锁
-
库缓存锁(表定义)
-
行缓存锁(字典信息)
-
-
PCM资源:
-
原表数据块访问
-
新表数据块分配
-
UNDO块管理
-
4.3 诊断资源协作问题
sql
-- 综合诊断脚本
WITH pcm_waits AS (
SELECT 'PCM' AS resource_type,
SUM(time_waited_micro) AS total_wait_time
FROM gv$system_event
WHERE event LIKE 'gc%'
),
non_pcm_waits AS (
SELECT 'Non-PCM' AS resource_type,
SUM(time_waited_micro) AS total_wait_time
FROM gv$system_event
WHERE event IN ('library cache%', 'row cache%', 'enq:%')
AND event NOT LIKE 'gc%'
)
SELECT * FROM pcm_waits
UNION ALL
SELECT * FROM non_pcm_waits;
五、高级调优:平衡PCM与非PCM资源
5.1 识别瓶颈类型
sql
-- 资源等待分析仪表板
SELECT
inst_id,
CASE
WHEN event LIKE 'gc%' THEN 'PCM Waits'
WHEN event LIKE 'library cache%' THEN 'Library Cache'
WHEN event LIKE 'row cache%' THEN 'Dictionary Cache'
WHEN event LIKE 'enq:%' THEN 'Enqueue'
ELSE 'Other'
END AS wait_category,
COUNT(*) AS wait_count,
SUM(time_waited_micro) / 1000000 AS total_wait_secs,
ROUND(SUM(time_waited_micro) * 100.0 /
SUM(SUM(time_waited_micro)) OVER(PARTITION BY inst_id), 2) AS pct_of_total
FROM gv$system_event
WHERE wait_class <> 'Idle'
GROUP BY inst_id,
CASE
WHEN event LIKE 'gc%' THEN 'PCM Waits'
WHEN event LIKE 'library cache%' THEN 'Library Cache'
WHEN event LIKE 'row cache%' THEN 'Dictionary Cache'
WHEN event LIKE 'enq:%' THEN 'Enqueue'
ELSE 'Other'
END
ORDER BY inst_id, total_wait_secs DESC;
5.2 PCM资源优化策略
5.2.1 减少PCM传输
sql
-- 应用分区(减少跨实例访问)
-- 基于客户ID分区
CREATE TABLE orders (
order_id NUMBER,
customer_id NUMBER,
order_date DATE
)
PARTITION BY HASH(customer_id)
PARTITIONS 8;
-- 实例亲和性
-- 使用服务定向连接
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'SALES_SVC',
network_name => 'sales.example.com'
);
END;
/
5.2.2 优化私有互连
sql
-- 监控网络性能
SELECT name, network_name, ip_address, mtu
FROM gv$cluster_interconnects;
-- 关键参数调整
ALTER SYSTEM SET "_gc_affinity_time" = 300; -- 亲和性时间窗口
ALTER SYSTEM SET "_gc_affinity_limit" = 100; -- 亲和性限制
5.3 非PCM资源优化策略
5.3.1 库缓存优化
sql
-- 减少硬解析
ALTER SYSTEM SET cursor_sharing = FORCE; -- 谨慎使用
ALTER SYSTEM SET session_cached_cursors = 200;
-- 监控无效化
SELECT namespace, invalidations
FROM v$librarycache
ORDER BY invalidations DESC;
5.3.2 行缓存优化
sql
-- 增加行缓存大小
ALTER SYSTEM SET shared_pool_size = 2G;
ALTER SYSTEM SET "_row_cache_cursors" = 300;
-- 监控行缓存命中率
SELECT
cache_name,
gets,
getmisses,
ROUND((1 - (getmisses / NULLIF(gets, 0))) * 100, 2) AS hit_ratio
FROM v$rowcache
ORDER BY gets DESC;
5.4 混合工作负载调优
sql
-- 自适应调优策略
-- Oracle 19c引入的自适应特性
SELECT name, value, isdefault, description
FROM v$parameter
WHERE name LIKE '%adaptive%'
AND name LIKE '%gc%';
-- 混合工作负载资源分配
ALTER SYSTEM SET "_gc_policy_minimum" = 1000; -- 最小保持时间
ALTER SYSTEM SET "_gc_policy_time" = 300; -- 策略评估间隔
六、故障场景下的资源管理
6.1 实例故障恢复
sql
-- PCM资源恢复
-- PI(Past Image)机制确保数据不丢失
SELECT inst_id, pi_blocks_received, pi_blocks_written
FROM gv$instance_cache_transfer;
-- 非PCM资源恢复
-- GES重新映射资源所有权
SELECT resource_name, master_node, new_master_node
FROM gv$ges_remastering
WHERE remaster_cnt > 0;
6.2 网络分区处理
sql
-- 脑裂防护
-- 投票磁盘机制
SELECT * FROM v$cluster_quorum_disk;
-- 资源重新映射日志
SELECT event_timestamp, event_type, resource_name, from_node, to_node
FROM gv$ges_resource_history
ORDER BY event_timestamp DESC
FETCH FIRST 20 ROWS ONLY;
七、新版Oracle中的增强
7.1 Oracle 19c的改进
sql
-- 自动资源重新映射
SELECT * FROM v$resource_limit WHERE resource_name LIKE '%gc%';
-- 智能资源放置
SELECT policy_name, enabled, objective
FROM dba_autotask_policy
WHERE task_name = 'Resource Manager';
7.2 Oracle 21c的革新
sql
-- 持久化内存支持
-- PCM资源可以直接存储在PMEM中
ALTER SYSTEM SET pmem_fileroot = '/pmem/oradata';
-- 增强的资源亲和性
SELECT * FROM v$resource_affinity;
-- AI驱动的资源预测
SELECT prediction_type, predicted_value, confidence
FROM v$resource_prediction;
八、最佳实践总结
8.1 设计阶段考虑
8.1.1 数据分布设计:
sql
-- 基于业务逻辑分区
-- 将相关数据放在同一实例
CREATE TABLE orders (...)
PARTITION BY REFERENCE (customer_fk);
8.1.2 服务设计:
sql
-- 服务与模块关联
EXEC DBMS_APPLICATION_INFO.SET_MODULE('ORDER_PROCESSING', NULL);
8.2 监控体系建立
sql
-- 完整的监控仪表板
CREATE OR REPLACE VIEW rac_health_dashboard AS
SELECT
systimestamp AS check_time,
(SELECT SUM(value) FROM v$sysstat WHERE name = 'gc cr blocks received') AS cr_blocks,
(SELECT SUM(value) FROM v$sysstat WHERE name = 'gc current blocks received') AS cur_blocks,
(SELECT COUNT(*) FROM v$lock WHERE block > 0) AS blocking_locks,
(SELECT SUM(reloads) FROM v$librarycache) AS library_reloads,
(SELECT SUM(getmisses) FROM v$rowcache WHERE cache_name LIKE 'dc%') AS dict_misses
FROM dual;
8.3 应急预案
sql
-- 应急诊断脚本集
-- 保存为rac_diagnostics.sql
SET PAGESIZE 1000
SET LINESIZE 200
COLUMN event FORMAT A30
COLUMN wait_class FORMAT A20
-- 1. 当前等待事件
SELECT * FROM v$session_wait WHERE wait_time = 0;
-- 2. PCM资源统计
SELECT * FROM v$sysstat WHERE name LIKE 'gc%';
-- 3. 非PCM资源统计
SELECT * FROM v$sysstat WHERE name LIKE '%cache%';
-- 4. 集群状态
SELECT * FROM v$cluster_interconnects;
结论:和谐的资源交响曲
Oracle RAC通过精细区分PCM资源和非PCM资源,实现了高效的集群资源管理。PCM资源专注于数据块的缓存一致性,而非PCM资源处理元数据和协调信息。两者的完美协作,使得RAC能够在保持数据一致性的同时,提供接近线性扩展的性能。
关键洞察:
-
分工明确:PCM管数据,非PCM管元数据
-
协同工作:事务处理需要两者紧密配合
-
优化平衡:需要同时关注两类资源的性能
-
持续演进:每个Oracle版本都在优化资源管理
掌握PCM与非PCM资源的区别与联系,是成为Oracle RAC专家的必经之路。只有当这两类资源和谐共处时,RAC集群才能演奏出最高效的数据处理交响曲。
注:本文基于Oracle 19c/21c编写,生产环境变更前请充分测试。部分内部视图和参数可能因版本而异。