面试宝典:介绍下Oracle数据库动态性能视图V$ASH_INFO

在这里插入图片描述

Oracle 19c V$ASH_INFO 动态性能视图深度解析

核心定位与作用

V$ASH_INFO 是 Active Session History (ASH) 的元数据控制中心,提供 ASH 基础设施的关键配置和状态信息。它是 Oracle 数据库性能诊断的"仪表盘",帮助 DBA 理解 ASH 数据的采集范围、有效性和技术参数。

核心作用

  1. ASH 可用性验证:确认 ASH 功能是否启用
  2. 数据范围确定:识别内存中 ASH 数据的时间跨度
  3. 采样监控:跟踪采样状态和刷新机制
  4. 容量规划:评估 ASH 缓冲区使用情况
  5. 诊断准备:确保性能问题在 ASH 覆盖范围内
  6. 配置验证:检查 ASH 相关参数设置

📌 关键价值:当数据库出现性能问题时,V$ASH_INFO 能立即确认是否有可用的 ASH 数据用于诊断


核心使用场景

  1. 性能问题诊断前:确认 ASH 是否覆盖问题时间段
  2. AWR 报告生成:验证 ASH 数据完整性
  3. 高负载期监控:评估 ASH 缓冲区是否足够
  4. 数据库健康检查:例行验证 ASH 功能状态
  5. 容量规划:决定是否需要增加 ASH 缓冲区
  6. 迁移/升级验证:确保 ASH 在新环境正常工作
  7. RAC 环境:跨实例比较 ASH 配置一致性

字段含义详解 (Oracle 19c)

字段名数据类型描述关键值/意义
INST_IDNUMBER实例 ID (RAC 环境)单实例始终为 1
FLUSH_STATUSVARCHAR2(6)ASH 刷新到磁盘的状态ENABLED: 已启用
DISABLED: 未启用 (AWR 禁用时)
SAMPLE_TIME_OLDESTDATE内存中最旧的 ASH 样本时间可用于诊断的最早时间点
SAMPLE_TIME_NEWESTDATE内存中最新的 ASH 样本时间当前采集的最新样本
TOTAL_BUFFER_SIZENUMBERASH 环形缓冲区总大小 (样本数)_ash_size 参数控制
USED_BUFFER_SIZENUMBER已使用的缓冲区大小 (样本数)接近 TOTAL 值表示缓冲区即将满
FLUSH_ELAPSEDNUMBER上次刷新耗时(秒)衡量刷新性能
FLUSH_SIZENUMBER上次刷新的样本数每次刷新到 AWR 的数据量
LAST_FLUSH_TIMEDATE上次刷新完成时间最近一次磁盘写入时间戳
CON_IDNUMBER容器 ID (CDB/PDB)0: CDB$ROOT
1+: PDB
VERSIONNUMBERASH 版本号内部版本标识
ASH_SCHEMA_VERSIONNUMBERASH 模式版本数据结构版本
SOURCE_COMP_IDVARCHAR2(64)ASH 源组件SYS (系统级)
SAMPLE_INTERVALNUMBER采样间隔(毫秒)默认 1000 (1秒)
MAX_BUFFER_SIZENUMBER最大缓冲区大小理论最大值
MIN_BUFFER_SIZENUMBER最小缓冲区大小理论最小值
SHARED_POOL_RESERVEDNUMBER共享池中 ASH 保留空间ASH 在共享池中的分配情况

相关视图

  1. V$ACTIVE_SESSION_HISTORY:实时 ASH 数据
  2. DBA_HIST_ACTIVE_SESS_HISTORY:持久化的历史 ASH 数据
  3. V$ASH_BUFFER_INFO:详细的缓冲区分配信息
  4. V$SYSAUX_OCCUPANTS:ASH 在 SYSAUX 表空间的使用
  5. GV$ASH_INFO:RAC 全局视图
  6. V$SESSION:当前活动会话
  7. V$SQL:关联 SQL 执行信息

基表与数据来源

底层结构

  • X$KJBL (ASH 缓冲区链表)
  • X$KNASHC (ASH 控制结构)
  • X$KEWASH (ASH 工作区信息)

数据生成原理

管理ASH
刷新
MMON进程
ASH缓冲区
AWR表
V$ASH_INFO可见

核心工作原理

1. ASH 数据生命周期
活动会话
每秒采样
写入SGA环形缓冲区
缓冲区满?
覆盖最旧数据
保留新数据
MMON定期刷新到AWR
2. 环形缓冲区管理
数据覆盖方向
新样本
填满
SAMPLE_TIME_OLDEST
SAMPLE_TIME_NEWEST
缓冲区
3. 刷新机制
MMONSGAAWRV$ASH_INFO每60分钟/缓冲区80%满刷新数据到DBA_HIST_ACTIVE_SESS_HISTORY更新LAST_FLUSH_TIMEMMONSGAAWRV$ASH_INFO

重要注意事项

  1. 数据时效性

    • 内存中 ASH 通常保留 1-2 小时
    • 磁盘中 ASH 保留由 AWR_RETENTION 控制 (默认 8 天)
  2. 启用条件

    -- 检查诊断包许可
    SELECT * FROM DBA_FEATURE_USAGE_STAT 
    WHERE NAME LIKE 'Active%';
    
  3. 缓冲区大小公式

    -- 计算实际内存占用 (MB)
    SELECT (total_buffer_size * 200) / 1024 / 1024 AS buffer_mb
    FROM v$ash_info;
    

    (每个样本约 200 字节)

  4. RAC 特性

    • 每个实例有自己的 ASH 缓冲区
    • 全局查询需用 GV$ASH_INFO
  5. PDB 限制

    • CDB 级别视图包含所有 PDB 数据
    • PDB 内查询仅显示自身数据

常用监控与诊断 SQL

1. ASH 可用性检查
SELECT inst_id,
       flush_status,
       sample_time_oldest,
       sample_time_newest,
       ROUND((sample_time_newest - sample_time_oldest) * 24 * 60, 1) coverage_min
FROM v$ash_info;
2. 缓冲区使用分析
SELECT total_buffer_size,
       used_buffer_size,
       ROUND(used_buffer_size/total_buffer_size*100, 1) pct_used,
       ROUND((total_buffer_size - used_buffer_size) * 
             EXTRACT(HOUR FROM (sample_time_newest - sample_time_oldest)) / 60 / used_buffer_size, 1) 
             AS est_remaining_min
FROM v$ash_info;
3. 刷新性能监控
SELECT last_flush_time,
       flush_size,
       flush_elapsed,
       ROUND(flush_size / NULLIF(flush_elapsed, 0)) samples_per_sec
FROM v$ash_info;
4. 跨 RAC 实例比较
SELECT inst_id,
       sample_time_oldest,
       sample_time_newest,
       used_buffer_size,
       total_buffer_size
FROM gv$ash_info
ORDER BY inst_id;
5. ASH 覆盖问题时间
-- 检查问题时间是否在 ASH 范围内
SELECT CASE WHEN TO_DATE('2023-08-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS') 
                 BETWEEN sample_time_oldest AND sample_time_newest
            THEN 'COVERED' 
            ELSE 'NOT COVERED' END coverage_status
FROM v$ash_info;
6. ASH 配置审计
SELECT 'Sample Interval: '||sample_interval||' ms' AS config,
       'Buffer: '||used_buffer_size||'/'||total_buffer_size||' samples' AS buffer_info,
       'Retention: '||ROUND((sample_time_newest - sample_time_oldest)*24*60)||' min' AS mem_retention
FROM v$ash_info;

最佳实践

1. 自动化 ASH 健康检查
BEGIN
  FOR ash IN (SELECT * FROM v$ash_info) 
  LOOP
    IF ash.flush_status = 'DISABLED' THEN
      dbms_output.put_line('ASH flushing disabled - enable AWR');
    ELSIF ash.used_buffer_size/ash.total_buffer_size > 0.9 THEN
      dbms_output.put_line('ASH buffer >90% full - consider increasing _ash_size');
    ELSIF (ash.sample_time_newest - ash.sample_time_oldest) < 1/24 THEN
      dbms_output.put_line('ASH coverage <1 hour - may be insufficient for diagnostics');
    END IF;
  END LOOP;
END;
/
2. ASH 缓冲区大小调整
-- 检查当前值
SELECT x.ksppinm, y.ksppstvl 
FROM x$ksppi x, x$ksppsv y 
WHERE x.indx = y.indx 
AND x.ksppinm = '_ash_size';

-- 调整缓冲区大小 (需重启)
ALTER SYSTEM SET "_ash_size"=16777216 SCOPE=spfile; -- 16MB
3. 历史覆盖分析
CREATE TABLE ash_coverage_history AS
SELECT SYSDATE snap_time, i.*,
       (sample_time_newest - sample_time_oldest)*24*60 coverage_min
FROM v$ash_info i WHERE 1=0;

-- 每小时快照
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'ASH_COVERAGE_MONITOR',
    job_type => 'PLSQL_BLOCK',
    job_action => 'INSERT INTO ash_coverage_history 
                   SELECT SYSDATE, i.*, 
                          (i.sample_time_newest - i.sample_time_oldest)*24*60 
                   FROM v$ash_info i',
    repeat_interval => 'FREQ=HOURLY',
    enabled => TRUE);
END;
/
4. 问题时间点验证函数
CREATE FUNCTION is_ash_covered(p_time DATE) RETURN VARCHAR2 IS
  v_oldest DATE;
  v_newest DATE;
BEGIN
  SELECT sample_time_oldest, sample_time_newest 
  INTO v_oldest, v_newest
  FROM v$ash_info;
  
  RETURN CASE WHEN p_time BETWEEN v_oldest AND v_newest 
              THEN 'YES' ELSE 'NO' END;
END;
/

-- 使用示例
SELECT is_ash_covered(SYSDATE - 1/24) AS covered_1hr_ago FROM dual;

故障排除指南

DISABLED
ENABLED
NO
YES
ASH不可用
FLUSH_STATUS
检查AWR是否启用
检查采样时间
启用AWR
ALTER SYSTEM SET AWR_SNAPSHOT_ENABLED=TRUE
有最新样本?
检查MMON进程
验证用户权限
检查警报日志
查看MMON错误
授予SELECT_CATALOG_ROLE
缓冲区过小
计算需求
增加_ash_size
重启数据库
刷新慢
检查flush_elapsed
优化AWR表空间IO

通过有效利用 V$ASH_INFO,DBA 可以:

  1. 确保性能诊断数据的可用性
  2. 预防性监控 ASH 基础设施
  3. 优化 ASH 相关配置
  4. 快速验证问题时间点的数据覆盖
  5. 为容量规划提供数据支持

建议将此视图集成到日常数据库健康检查脚本中,特别是在关键业务系统性能保障方案中。

欢迎关注我的公众号《IT小Chen

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值