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

在这里插入图片描述
好的,我们来详细剖析一下 Oracle 19c 数据库中的 V$ARCHIVE 动态性能视图。

核心定位: V$ARCHIVE 是一个极其关键的实时监控视图,它提供了数据库当前正在发生的归档操作(Archiving)的状态信息。它反映了归档进程(ARCn)当前刚刚完成的归档活动,主要用于监控在线重做日志切换后归档进程的工作状态

作用

  1. 实时监控归档状态: 这是它最主要的作用。查看当前或最近一次日志切换后,归档进程是否正在工作、是否已完成归档、是否遇到错误或阻塞。
  2. 诊断归档问题: 当发现归档滞后、归档失败(如 STATUS='STOPPED'STATUS='ERROR')、归档目标空间不足等问题时,此视图是首要的排查点。STATUSERROR 字段提供了直接线索。
  3. 识别归档目标: 显示当前正在归档或尝试归档的目标位置 (DEST_ID)。
  4. 跟踪日志序列: 显示正在归档或刚刚归档完成的重做日志线程 (THREAD#) 和序列号 (SEQUENCE#)。
  5. 监控归档延迟: 结合日志切换时间,可以粗略判断归档是否及时完成。
  6. 发现阻塞点: BLOCKED 字段指示归档是否被阻塞(如 I/O 等待)。

使用场景

  1. 日常健康检查: DBA 定期运行查询检查 STATUS 是否为 SUCCEEDEDERROR 是否为 NULL,确保归档正常运行。
  2. 日志切换后: 执行 ALTER SYSTEM SWITCH LOGFILE; 后,立即查询此视图观察归档进程是否启动并成功归档新产生的日志。
  3. 收到归档相关告警时:ORA-00257 (archiver error) 或监控系统报告归档延迟。
  4. Data Guard / 备库环境: 监控主库归档到备库目标 (DEST_ID 指向备库) 的状态和延迟 (DELAY_MINS)。
  5. 性能问题排查: 当怀疑 I/O 或网络是瓶颈导致归档缓慢时,结合其他等待事件视图分析。
  6. 空间管理: 虽然不直接显示空间,但归档失败 (STATUS='ERROR') 常由目标磁盘满引起,提示需要清理或添加空间。

字段含义详解 (Oracle 19c)

V$ARCHIVE 视图的列相对较少,但每个都非常关键:

字段名数据类型描述重要性和常见值
DEST_IDNUMBER归档目标标识符。对应于初始化参数 LOG_ARCHIVE_DEST_<n> 中的 <n>。例如,DEST_ID=2 对应 LOG_ARCHIVE_DEST_2关键。确定归档操作发生在哪个目标上。常用值:1 (本地默认), 2, 3, … (配置的远程或本地目标)
THREAD#NUMBER重做线程号。在单实例数据库中通常为 1。在 RAC 环境中,表示该归档操作属于哪个实例的重做线程。关键 (尤其在 RAC)。标识归档操作针对哪个实例的日志。
SEQUENCE#NUMBER正在归档或刚刚归档完成的重做日志组的序列号。这个序列号在同一个重做线程内是唯一的、递增的。关键。标识具体的归档日志文件。
ARCHIVEDVARCHAR2(3)归档完成状态YES: 该 SEQUENCE# 的日志已成功归档DEST_ID 指定的目标。
NO: 该日志尚未归档到此目标。
FAILED: 归档失败 (Oracle 12c+)
STATUSVARCHAR2(10)归档进程 (ARCn) 的当前状态最关键字段!
INACTIVE: 当前没有活动需要归档的日志 (等待状态)。
ACTIVE: ARCn 进程正在工作,正在拷贝日志。
STOPPED: 归档进程因错误而停止 (需紧急处理!)。
INTERRUPTED: 归档操作被中断 (可能是暂时的)。
WAITING: ARCn 进程正在等待某个事件 (如网络、I/O)。
REGISTERED: 日志文件已注册待归档,但 ARCn 尚未开始处理 (RAC 环境常见)。
BUSY: ARCn 进程繁忙 (较旧版本可能使用)。
CLOSING: ARCn 进程正在关闭归档日志文件 (完成前的最后步骤)。
SUCCEEDED: 归档操作成功完成 (理想状态)。
FAILED: 归档操作失败 (Oracle 12c+, 比 STOPPED 更常见)。
ERRORVARCHAR2(2048)归档失败或停止的原因。如果 STATUSSTOPPEDFAILED,此字段会包含具体的错误信息 (如 ORA-XXXXX)。成功时为 NULL诊断关键。直接显示错误原因 (如 ORA-00257, ORA-19504, ORA-270xx, 网络错误等)。
BLOCKEDVARCHAR2(3)归档是否被阻塞YES: 归档操作当前被阻塞 (通常意味着它在等待资源,如 I/O 完成)。
NO: 未被阻塞。
DELAY_MINSNUMBER归档延迟时间 (分钟)。主要针对 STANDBY 类型的归档目标 (LOG_ARCHIVE_DEST_nSERVICE 属性指定了备库)。表示该归档日志在目标备库上应用的延迟时间。对于本地目标 (LOCATION),此值通常无意义或为 0。Data Guard 监控关键。衡量主备库之间的数据延迟。
CON_IDNUMBER容器 ID。在多租户环境 (CDB) 中,标识该行信息属于哪个 PDB (可插拔数据库)。对于非 CDB 或 CDB$ROOT,通常为 0 或 1。CDB 环境关键。区分不同 PDB 的归档状态信息。

相关视图

  1. **VARCHIVEDLOG:∗∗∗∗历史归档日志记录∗∗。记录所有∗∗已经成功归档∗∗的日志文件的详细信息(名称、大小、首次/下次时间、是否删除、是否应用到备库等)。‘VARCHIVED_LOG:** **历史归档日志记录**。记录所有**已经成功归档**的日志文件的详细信息(名称、大小、首次/下次时间、是否删除、是否应用到备库等)。`VARCHIVEDLOG:历史归档日志记录。记录所有已经成功归档的日志文件的详细信息(名称、大小、首次/下次时间、是否删除、是否应用到备库等)。VARCHIVE 关注“现在进行时”,V$ARCHIVED_LOG关注“过去完成时”。两者通过THREAD#SEQUENCE#` 关联。
  2. VLOG/VLOG / VLOG/VLOGFILE: 显示当前在线重做日志组及其成员文件的状态(状态、大小、组号、序列号、是否当前组、是否归档完成 ARCHIVED)。V$LOGARCHIVED 列表示该日志组是否所有配置目标都已完成归档,而 V$ARCHIVE 则细化到每个目标 (DEST_ID) 的状态。
  3. VARCHIVEDEST/VARCHIVE_DEST / VARCHIVEDEST/VARCHIVE_DEST_STATUS: 提供归档目标配置 (LOG_ARCHIVE_DEST_n) 的详细信息及其当前状态(状态、类型、位置、服务名、错误信息、同步状态、延迟、应用延迟等)。V$ARCHIVE.DEST_ID 对应这里的 DEST_IDV$ARCHIVE_DEST_STATUS 提供了更全面的目标状态信息,是监控归档目标健康状况的主要视图,常与 V$ARCHIVE 结合使用诊断问题。
  4. V$ARCHIVE_PROCESSES: 显示归档进程 (ARCn) 本身的状态(进程状态、当前/上一个日志序列号、上次使用的目标、进程号等)。监控 ARCn 进程是否存活、是否繁忙。
  5. VDATAGUARDSTATS/VDATAGUARD_STATS / VDATAGUARDSTATS/VSTANDBY_EVENT_HISTOGRAM: 在 Data Guard 环境中,提供更详细的备库应用统计信息和等待事件直方图,用于分析延迟原因。
  6. VSESSION/VSESSION / VSESSION/VSESSION_WAIT:V$ARCHIVE.BLOCKED='YES' 时,结合这些视图可以查看 ARCn 进程正在等待什么事件(如 db file sequential read, log file sync, LGWR wait on arch send, network 相关等待等)。

基表

V$ARCHIVE 视图的数据主要来源于内存中的动态性能结构。其底层基表通常是 X$KCCAR (Kernel Cache Component - Archive)。强烈不建议直接查询 X$ 表,因为它们是 Oracle 内核使用的、未文档化的、不稳定的结构。总是通过官方的 V$ 视图访问这些信息。

相关原理

  1. 日志切换 (Log Switch): 当当前在线重做日志组写满,或者 DBA 手动执行 ALTER SYSTEM SWITCH LOGFILE; 时,发生日志切换。LGWR 进程停止写入当前日志组,切换到下一个可用的日志组。
  2. 归档触发: 日志切换后,如果数据库处于 ARCHIVELOG 模式,那么刚刚写满(变为 INACTIVEACTIVE 但不再写入)的在线重做日志组需要被归档。
  3. 归档进程 (ARCn): 后台进程 ARC0, ARC1, … (数量由 LOG_ARCHIVE_MAX_PROCESSES 控制) 负责执行归档工作。ARCn 进程被唤醒,读取已填满的在线重做日志文件。
  4. 归档操作:
    • ARCn 根据配置的 LOG_ARCHIVE_DEST_n 参数,将日志文件内容复制到指定的归档目标位置(本地目录或远程备库服务)。
    • 在目标位置生成唯一的归档日志文件名(遵循 LOG_ARCHIVE_FORMAT)。
    • 更新控制文件(和可能的数据字典)中的归档记录。
  5. 状态更新: 在 ARCn 执行归档操作的过程中,其状态(如 ACTIVE, CLOSING)、遇到的错误、是否被阻塞、以及最终是否成功 (SUCCEEDED) 或失败 (FAILED/STOPPED) 等信息,被实时记录到内存结构中。
  6. V$ARCHIVE 反映: V$ARCHIVE 视图就是对这些内存结构(主要是 X$KCCAR)的实时映射查询。它显示了每个归档目标 (DEST_ID)、每个线程 (THREAD#)、每个日志序列号 (SEQUENCE#) 的最新归档尝试的状态。一旦一个日志序列号在所有配置目标上都成功归档 (ARCHIVED='YES'),并且新的日志切换发生,关于该序列号的信息通常会从 V$ARCHIVE 中消失,其成功记录则转移到 V$ARCHIVED_LOG 中。

常用查询 SQL

  1. 基础状态检查 (最常用):

    SELECT DEST_ID, THREAD#, SEQUENCE#, ARCHIVED, STATUS, ERROR, BLOCKED, DELAY_MINS
    FROM V$ARCHIVE
    ORDER BY DEST_ID, THREAD#;
    
    • 查看所有归档目标的当前/最新归档操作状态。
  2. 检查归档是否正常 (无错误, 无阻塞):

    SELECT DEST_ID, THREAD#, SEQUENCE#,
           CASE WHEN STATUS NOT IN ('SUCCEEDED', 'INACTIVE') OR ERROR IS NOT NULL OR BLOCKED = 'YES'
                THEN 'PROBLEM'
                ELSE 'OK'
           END AS HEALTH,
           STATUS, ERROR, BLOCKED
    FROM V$ARCHIVE;
    
    • 快速识别存在问题的目标/线程。
  3. 检查特定目标 (如备库 DEST_ID=2) 的延迟:

    SELECT DEST_ID, THREAD#, SEQUENCE#, DELAY_MINS
    FROM V$ARCHIVE
    WHERE DEST_ID = 2
    AND STATUS NOT IN ('SUCCEEDED', 'INACTIVE'); -- 通常关注非最终成功/非等待状态时的延迟
    
    • 监控 Data Guard 主备延迟。
  4. 检查归档失败的原因:

    SELECT DEST_ID, THREAD#, SEQUENCE#, STATUS, ERROR
    FROM V$ARCHIVE
    WHERE STATUS IN ('STOPPED', 'FAILED') OR ERROR IS NOT NULL;
    
    • 直接定位错误信息。
  5. 结合 V$ARCHIVED_LOG 查看归档历史与当前状态:

    SELECT a.DEST_ID, a.THREAD#, a.SEQUENCE#, a.ARCHIVED, a.STATUS, a.ERROR,
           l.NAME AS Archived_Log_Name, l.FIRST_TIME, l.NEXT_TIME, l.BLOCKS * l.BLOCK_SIZE / 1024 / 1024 AS Size_MB
    FROM V$ARCHIVE a
    LEFT JOIN V$ARCHIVED_LOG l
      ON a.THREAD# = l.THREAD# AND a.SEQUENCE# = l.SEQUENCE# AND a.DEST_ID = l.DEST_ID
    ORDER BY a.DEST_ID, a.THREAD#, a.SEQUENCE#;
    
    • 将当前归档状态与历史归档记录关联,查看文件名和大小。
  6. 检查归档进程是否被阻塞及等待事件:

    SELECT s.sid, s.serial#, s.username, s.program, s.event, s.seconds_in_wait, s.state,
           a.*
    FROM V$ARCHIVE a
    JOIN V$SESSION s ON s.process = a.process  -- 需要 V$ARCHIVE_PROCESSES 提供 PROCESS 字段 (Oracle 12c+)
    WHERE a.BLOCKED = 'YES';
    -- 注意: V$ARCHIVE 本身不直接包含 ARCn 的 SID/PID。通常通过 V$ARCHIVE_PROCESSES 关联。
    -- 更通用的方法是直接查 ARCn 进程的等待:
    SELECT s.sid, s.serial#, s.program, s.event, s.seconds_in_wait, s.state
    FROM V$SESSION s
    WHERE s.program LIKE '%ARC%';
    
    • 找出阻塞 ARCn 进程的会话或等待事件。

重要注意事项

  1. 实时性 & 短暂性: V$ARCHIVE 反映的是当前非常近期的活动。一旦一个日志序列号在所有目标上都成功归档,并且系统处理了新的日志切换,该序列号的信息通常会从 V$ARCHIVE 中消失。它的窗口期很短。
  2. RAC 环境: 在 Oracle RAC 中,每个实例都有自己的重做线程 (THREAD#)V$ARCHIVE 会显示所有实例所有目标的归档状态。务必关注 THREAD#
  3. STATUS='INACTIVE' 是常态: 这通常表示当前没有需要归档的日志,ARCn 处于空闲等待状态。这本身不是问题,除非你刚刚做了日志切换但很长时间状态还是 INACTIVE (那可能意味着 ARCn 没启动或配置错误)。
  4. STATUS='STOPPED' / 'FAILED' 是严重问题: 这表示归档进程因错误而停止工作。数据库会停止接受 DML 操作 (因为无法归档就无法重用日志),必须立即处理!检查 ERROR 字段。
  5. BLOCKED='YES' 表示性能瓶颈: 归档操作被挂起,通常因为 I/O 慢、网络慢或资源争用。需要结合等待事件分析。
  6. DELAY_MINS 的理解: 这个延迟通常指的是归档日志在备库上的应用延迟 (Apply Lag),而不是归档日志从主库传输到备库存储的延迟 (Transport Lag)。传输延迟通常通过 V$ARCHIVE_DEST_STATUSTRANSPORT_LAG 字段查看更准确。V$ARCHIVE.DELAY_MINS 主要对 STANDBY 类型目标有意义。
  7. V$ARCHIVED_LOG 的区别: 再次强调,V$ARCHIVE当前进行中/刚完成的状态;V$ARCHIVED_LOG历史成功归档的记录。两者互补。

总结

V$ARCHIVE 是 Oracle DBA 监控数据库归档操作健康状态和实时性能核心视图。通过关注 DEST_ID, THREAD#, SEQUENCE#, 尤其是 STATUS, ERROR, BLOCKEDDELAY_MINS 这些关键字段,DBA 可以快速判断归档是否正常运行,及时发现和诊断归档失败、延迟、阻塞等问题,确保数据库在高可用性 (如备份恢复、Data Guard) 场景下的稳定性和数据安全性。结合 V$ARCHIVE_DEST_STATUS, V$ARCHIVED_LOG 等视图,可以构建完整的归档监控和诊断体系。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值