Oracle RAC内存融合技术深度解析:PCM与非PCM资源的集群交响曲

目录

引言:资源管理的双重奏

一、资源管理基础:为什么需要分类?

[1.1 资源分类的必要性](#1.1 资源分类的必要性)

[1.2 资源分类概览](#1.2 资源分类概览)

二、PCM资源:缓存融合的核心

[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性能优化)

三、非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资源性能优化)

四、PCM与非PCM资源的交互

[4.1 事务场景中的协作](#4.1 事务场景中的协作)

[4.2 DDL操作中的复杂交互](#4.2 DDL操作中的复杂交互)

[4.3 诊断资源协作问题](#4.3 诊断资源协作问题)

五、高级调优:平衡PCM与非PCM资源

[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 网络分区处理)

七、新版Oracle中的增强

[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. 实例1请求

    • 向数据块的主节点(假设是实例3)请求共享锁

    • 从磁盘加载数据到本地缓存

    • 标记为SCUR状态

  2. 实例2请求

    • 向主节点(实例3)请求独占锁

    • 主节点通知实例1降级锁(S→N)

    • 实例1发送数据块给实例2

    • 实例1保留PI(Past Image)

    • 实例2获得独占锁,标记为XCUR状态

  3. 实例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;

资源协作流程

  1. 非PCM阶段

    • 获取库缓存锁(解析SQL)

    • 获取行缓存锁(验证表结构)

    • 获取TX事务锁

  2. PCM阶段

    • 获取数据块的PCM锁

    • 修改数据块

    • 创建UNDO块(也需要PCM管理)

  3. 提交阶段

    • 非PCM:TX锁转换

    • PCM:数据块状态更新

4.2 DDL操作中的复杂交互

sql 复制代码
-- 在线表重组
ALTER TABLE orders MOVE ONLINE;

此操作涉及:

  1. 非PCM资源

    • TM表锁

    • 库缓存锁(表定义)

    • 行缓存锁(字典信息)

  2. 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能够在保持数据一致性的同时,提供接近线性扩展的性能。

关键洞察:

  1. 分工明确:PCM管数据,非PCM管元数据

  2. 协同工作:事务处理需要两者紧密配合

  3. 优化平衡:需要同时关注两类资源的性能

  4. 持续演进:每个Oracle版本都在优化资源管理

掌握PCM与非PCM资源的区别与联系,是成为Oracle RAC专家的必经之路。只有当这两类资源和谐共处时,RAC集群才能演奏出最高效的数据处理交响曲。

注:本文基于Oracle 19c/21c编写,生产环境变更前请充分测试。部分内部视图和参数可能因版本而异。

相关推荐
Blossom.1182 小时前
把大模型当“编译器”用:一句自然语言直接生成SoC的Verilog
数据库·人工智能·python·sql·单片机·嵌入式硬件·fpga开发
s1hiyu2 小时前
使用Python控制Arduino或树莓派
jvm·数据库·python
twcc_come2 小时前
渗透第二次作业
数据库·oracle
AllData公司负责人3 小时前
【亲测好用】云原生数据平台能力演示
数据库·云原生·开源
VX:Fegn089510 小时前
计算机毕业设计|基于ssm + vue超市管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
chipsense10 小时前
电流传感器型号从数据库查询并排序输出到网页的方法
数据库·php·传感器·霍尔电流传感器
踢足球092910 小时前
寒假打卡:2026-01-28
数据库·oracle
麦聪聊数据10 小时前
智慧医疗数据互联互通:使用 QuickAPI 构建实时诊疗数据交换层
数据库·sql·安全
风吹落叶花飘荡10 小时前
2026年mysql数据库迁移(全流程)
数据库·mysql