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编写,生产环境变更前请充分测试。部分内部视图和参数可能因版本而异。

相关推荐
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神5 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU5 小时前
三大范式和E-R图
数据库