
好的,我们来详细剖析一下 Oracle 19c 数据库中的 V$ARCHIVE 动态性能视图。
核心定位: V$ARCHIVE 是一个极其关键的实时监控视图,它提供了数据库当前正在发生的归档操作(Archiving)的状态信息。它反映了归档进程(ARCn)当前或刚刚完成的归档活动,主要用于监控在线重做日志切换后归档进程的工作状态。
作用
- 实时监控归档状态: 这是它最主要的作用。查看当前或最近一次日志切换后,归档进程是否正在工作、是否已完成归档、是否遇到错误或阻塞。
- 诊断归档问题: 当发现归档滞后、归档失败(如
STATUS='STOPPED'或STATUS='ERROR')、归档目标空间不足等问题时,此视图是首要的排查点。STATUS和ERROR字段提供了直接线索。 - 识别归档目标: 显示当前正在归档或尝试归档的目标位置 (
DEST_ID)。 - 跟踪日志序列: 显示正在归档或刚刚归档完成的重做日志线程 (
THREAD#) 和序列号 (SEQUENCE#)。 - 监控归档延迟: 结合日志切换时间,可以粗略判断归档是否及时完成。
- 发现阻塞点:
BLOCKED字段指示归档是否被阻塞(如 I/O 等待)。
使用场景
- 日常健康检查: DBA 定期运行查询检查
STATUS是否为SUCCEEDED,ERROR是否为 NULL,确保归档正常运行。 - 日志切换后: 执行
ALTER SYSTEM SWITCH LOGFILE;后,立即查询此视图观察归档进程是否启动并成功归档新产生的日志。 - 收到归档相关告警时: 如
ORA-00257(archiver error) 或监控系统报告归档延迟。 - Data Guard / 备库环境: 监控主库归档到备库目标 (
DEST_ID指向备库) 的状态和延迟 (DELAY_MINS)。 - 性能问题排查: 当怀疑 I/O 或网络是瓶颈导致归档缓慢时,结合其他等待事件视图分析。
- 空间管理: 虽然不直接显示空间,但归档失败 (
STATUS='ERROR') 常由目标磁盘满引起,提示需要清理或添加空间。
字段含义详解 (Oracle 19c)
V$ARCHIVE 视图的列相对较少,但每个都非常关键:
| 字段名 | 数据类型 | 描述 | 重要性和常见值 |
|---|---|---|---|
| DEST_ID | NUMBER | 归档目标标识符。对应于初始化参数 LOG_ARCHIVE_DEST_<n> 中的 <n>。例如,DEST_ID=2 对应 LOG_ARCHIVE_DEST_2。 | 关键。确定归档操作发生在哪个目标上。常用值:1 (本地默认), 2, 3, … (配置的远程或本地目标) |
| THREAD# | NUMBER | 重做线程号。在单实例数据库中通常为 1。在 RAC 环境中,表示该归档操作属于哪个实例的重做线程。 | 关键 (尤其在 RAC)。标识归档操作针对哪个实例的日志。 |
| SEQUENCE# | NUMBER | 正在归档或刚刚归档完成的重做日志组的序列号。这个序列号在同一个重做线程内是唯一的、递增的。 | 关键。标识具体的归档日志文件。 |
| ARCHIVED | VARCHAR2(3) | 归档完成状态。 | YES: 该 SEQUENCE# 的日志已成功归档到 DEST_ID 指定的目标。NO: 该日志尚未归档到此目标。FAILED: 归档失败 (Oracle 12c+) |
| STATUS | VARCHAR2(10) | 归档进程 (ARCn) 的当前状态。 | 最关键字段!INACTIVE: 当前没有活动需要归档的日志 (等待状态)。ACTIVE: ARCn 进程正在工作,正在拷贝日志。STOPPED: 归档进程因错误而停止 (需紧急处理!)。INTERRUPTED: 归档操作被中断 (可能是暂时的)。WAITING: ARCn 进程正在等待某个事件 (如网络、I/O)。REGISTERED: 日志文件已注册待归档,但 ARCn 尚未开始处理 (RAC 环境常见)。BUSY: ARCn 进程繁忙 (较旧版本可能使用)。CLOSING: ARCn 进程正在关闭归档日志文件 (完成前的最后步骤)。SUCCEEDED: 归档操作成功完成 (理想状态)。FAILED: 归档操作失败 (Oracle 12c+, 比 STOPPED 更常见)。 |
| ERROR | VARCHAR2(2048) | 归档失败或停止的原因。如果 STATUS 是 STOPPED 或 FAILED,此字段会包含具体的错误信息 (如 ORA-XXXXX)。成功时为 NULL。 | 诊断关键。直接显示错误原因 (如 ORA-00257, ORA-19504, ORA-270xx, 网络错误等)。 |
| BLOCKED | VARCHAR2(3) | 归档是否被阻塞。 | YES: 归档操作当前被阻塞 (通常意味着它在等待资源,如 I/O 完成)。NO: 未被阻塞。 |
| DELAY_MINS | NUMBER | 归档延迟时间 (分钟)。主要针对 STANDBY 类型的归档目标 (LOG_ARCHIVE_DEST_n 的 SERVICE 属性指定了备库)。表示该归档日志在目标备库上应用的延迟时间。对于本地目标 (LOCATION),此值通常无意义或为 0。 | Data Guard 监控关键。衡量主备库之间的数据延迟。 |
| CON_ID | NUMBER | 容器 ID。在多租户环境 (CDB) 中,标识该行信息属于哪个 PDB (可插拔数据库)。对于非 CDB 或 CDB$ROOT,通常为 0 或 1。 | CDB 环境关键。区分不同 PDB 的归档状态信息。 |
相关视图
- **VARCHIVEDLOG:∗∗∗∗历史归档日志记录∗∗。记录所有∗∗已经成功归档∗∗的日志文件的详细信息(名称、大小、首次/下次时间、是否删除、是否应用到备库等)。‘VARCHIVED_LOG:** **历史归档日志记录**。记录所有**已经成功归档**的日志文件的详细信息(名称、大小、首次/下次时间、是否删除、是否应用到备库等)。`VARCHIVEDLOG:∗∗∗∗历史归档日志记录∗∗。记录所有∗∗已经成功归档∗∗的日志文件的详细信息(名称、大小、首次/下次时间、是否删除、是否应用到备库等)。‘VARCHIVE
关注“现在进行时”,V$ARCHIVED_LOG关注“过去完成时”。两者通过THREAD#和SEQUENCE#` 关联。 - VLOG/VLOG / VLOG/VLOGFILE: 显示当前在线重做日志组及其成员文件的状态(状态、大小、组号、序列号、是否当前组、是否归档完成
ARCHIVED)。V$LOG的ARCHIVED列表示该日志组是否所有配置目标都已完成归档,而V$ARCHIVE则细化到每个目标 (DEST_ID) 的状态。 - VARCHIVEDEST/VARCHIVE_DEST / VARCHIVEDEST/VARCHIVE_DEST_STATUS: 提供归档目标配置 (
LOG_ARCHIVE_DEST_n) 的详细信息及其当前状态(状态、类型、位置、服务名、错误信息、同步状态、延迟、应用延迟等)。V$ARCHIVE.DEST_ID对应这里的DEST_ID。V$ARCHIVE_DEST_STATUS提供了更全面的目标状态信息,是监控归档目标健康状况的主要视图,常与V$ARCHIVE结合使用诊断问题。 - V$ARCHIVE_PROCESSES: 显示归档进程 (ARCn) 本身的状态(进程状态、当前/上一个日志序列号、上次使用的目标、进程号等)。监控 ARCn 进程是否存活、是否繁忙。
- VDATAGUARDSTATS/VDATAGUARD_STATS / VDATAGUARDSTATS/VSTANDBY_EVENT_HISTOGRAM: 在 Data Guard 环境中,提供更详细的备库应用统计信息和等待事件直方图,用于分析延迟原因。
- 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$ 视图访问这些信息。
相关原理
- 日志切换 (Log Switch): 当当前在线重做日志组写满,或者 DBA 手动执行
ALTER SYSTEM SWITCH LOGFILE;时,发生日志切换。LGWR 进程停止写入当前日志组,切换到下一个可用的日志组。 - 归档触发: 日志切换后,如果数据库处于 ARCHIVELOG 模式,那么刚刚写满(变为
INACTIVE或ACTIVE但不再写入)的在线重做日志组需要被归档。 - 归档进程 (ARCn): 后台进程 ARC0, ARC1, … (数量由
LOG_ARCHIVE_MAX_PROCESSES控制) 负责执行归档工作。ARCn 进程被唤醒,读取已填满的在线重做日志文件。 - 归档操作:
- ARCn 根据配置的
LOG_ARCHIVE_DEST_n参数,将日志文件内容复制到指定的归档目标位置(本地目录或远程备库服务)。 - 在目标位置生成唯一的归档日志文件名(遵循
LOG_ARCHIVE_FORMAT)。 - 更新控制文件(和可能的数据字典)中的归档记录。
- ARCn 根据配置的
- 状态更新: 在 ARCn 执行归档操作的过程中,其状态(如
ACTIVE,CLOSING)、遇到的错误、是否被阻塞、以及最终是否成功 (SUCCEEDED) 或失败 (FAILED/STOPPED) 等信息,被实时记录到内存结构中。 V$ARCHIVE反映:V$ARCHIVE视图就是对这些内存结构(主要是X$KCCAR)的实时映射查询。它显示了每个归档目标 (DEST_ID)、每个线程 (THREAD#)、每个日志序列号 (SEQUENCE#) 的最新归档尝试的状态。一旦一个日志序列号在所有配置目标上都成功归档 (ARCHIVED='YES'),并且新的日志切换发生,关于该序列号的信息通常会从V$ARCHIVE中消失,其成功记录则转移到V$ARCHIVED_LOG中。
常用查询 SQL
-
基础状态检查 (最常用):
SELECT DEST_ID, THREAD#, SEQUENCE#, ARCHIVED, STATUS, ERROR, BLOCKED, DELAY_MINS FROM V$ARCHIVE ORDER BY DEST_ID, THREAD#;- 查看所有归档目标的当前/最新归档操作状态。
-
检查归档是否正常 (无错误, 无阻塞):
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;- 快速识别存在问题的目标/线程。
-
检查特定目标 (如备库 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 主备延迟。
-
检查归档失败的原因:
SELECT DEST_ID, THREAD#, SEQUENCE#, STATUS, ERROR FROM V$ARCHIVE WHERE STATUS IN ('STOPPED', 'FAILED') OR ERROR IS NOT NULL;- 直接定位错误信息。
-
结合 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#;- 将当前归档状态与历史归档记录关联,查看文件名和大小。
-
检查归档进程是否被阻塞及等待事件:
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 进程的会话或等待事件。
重要注意事项
- 实时性 & 短暂性:
V$ARCHIVE反映的是当前或非常近期的活动。一旦一个日志序列号在所有目标上都成功归档,并且系统处理了新的日志切换,该序列号的信息通常会从V$ARCHIVE中消失。它的窗口期很短。 - RAC 环境: 在 Oracle RAC 中,每个实例都有自己的重做线程 (
THREAD#)。V$ARCHIVE会显示所有实例所有目标的归档状态。务必关注THREAD#。 STATUS='INACTIVE'是常态: 这通常表示当前没有需要归档的日志,ARCn 处于空闲等待状态。这本身不是问题,除非你刚刚做了日志切换但很长时间状态还是INACTIVE(那可能意味着 ARCn 没启动或配置错误)。STATUS='STOPPED'/'FAILED'是严重问题: 这表示归档进程因错误而停止工作。数据库会停止接受 DML 操作 (因为无法归档就无法重用日志),必须立即处理!检查ERROR字段。BLOCKED='YES'表示性能瓶颈: 归档操作被挂起,通常因为 I/O 慢、网络慢或资源争用。需要结合等待事件分析。DELAY_MINS的理解: 这个延迟通常指的是归档日志在备库上的应用延迟 (Apply Lag),而不是归档日志从主库传输到备库存储的延迟 (Transport Lag)。传输延迟通常通过V$ARCHIVE_DEST_STATUS的TRANSPORT_LAG字段查看更准确。V$ARCHIVE.DELAY_MINS主要对STANDBY类型目标有意义。- 与
V$ARCHIVED_LOG的区别: 再次强调,V$ARCHIVE看当前进行中/刚完成的状态;V$ARCHIVED_LOG看历史成功归档的记录。两者互补。
总结
V$ARCHIVE 是 Oracle DBA 监控数据库归档操作健康状态和实时性能的核心视图。通过关注 DEST_ID, THREAD#, SEQUENCE#, 尤其是 STATUS, ERROR, BLOCKED 和 DELAY_MINS 这些关键字段,DBA 可以快速判断归档是否正常运行,及时发现和诊断归档失败、延迟、阻塞等问题,确保数据库在高可用性 (如备份恢复、Data Guard) 场景下的稳定性和数据安全性。结合 V$ARCHIVE_DEST_STATUS, V$ARCHIVED_LOG 等视图,可以构建完整的归档监控和诊断体系。
欢迎关注我的公众号《IT小Chen》
7109

被折叠的 条评论
为什么被折叠?



