好的,我们来详细解析一下 Oracle 19C 数据库中一个较为底层的动态性能视图:V$SHADOW_DATAFILE。
请注意,这个视图与 V$SGA_TARGET_ADVICE 的普及度和使用频率完全不同,它更专注于数据库启动和恢复过程中的一个特定行为。
🗃️ V$SHADOW_DATAFILE 视图详解
1. 视图概述与作用
V$SHADOW_DATAFILE 视图的主要作用是在数据库启动(STARTUP)或文件在线(ONLINE)恢复过程中,显示被恢复的数据文件(Datafile)的临时副本(即“影子”数据文件)的信息。
核心原理:
当 Oracle 实例启动或需要恢复一个需要介质恢复的数据文件时,恢复进程(如 RECO)可能需要应用重做日志(Redo Log)中的更改。在这个过程中,为了保持数据文件原副本的完整性并避免在恢复中途发生错误导致文件损坏,恢复进程有时会创建一个临时的、原数据文件的副本,这个副本就是“影子数据文件”(Shadow Datafile)。
所有的恢复操作会先在这个临时副本上进行。只有当恢复成功完成后,这个临时副本才会被重命名为正式的数据文件,替换掉原有的文件。如果恢复失败,Oracle 可以丢弃这个临时副本,而原始数据文件保持不变,这提供了一个安全层。
简而言之,此视图用于监控数据库恢复过程中产生的临时文件的状态。 对于常规的数据库操作,这个视图通常是空的。
2. 字段含义详解
下表详细说明了 V$SHADOW_DATAFILE 视图中的各个字段:
| 字段名 (Column Name) | 数据类型 (Datatype) | 描述 (Description) |
|---|---|---|
| SHADOW_ID | NUMBER | 影子文件标识符。一个唯一的数字ID,用于标识此影子文件。 |
| FILE_ID | NUMBER | 原始数据文件的文件标识符。对应于 V$DATAFILE、DBA_DATA_FILES 中的 FILE_ID。表示当前正在被恢复的是哪个数据文件。 |
| CREATION_TIME | DATE | 影子文件的创建时间。 |
| CREATION_CHANGE | NUMBER | 创建影子文件时的系统变更号(SCN)。 |
| FILENAME | VARCHAR2(513) | 影子文件的完整操作系统路径和文件名。 |
| BYTES | NUMBER | 影子文件的大小(以字节为单位)。 |
| BLOCKS | NUMBER | 影子文件的大小(以Oracle块为单位)。 |
| STATUS | VARCHAR2(10) | 影子文件的当前状态。有效值包括: - ACTIVE: 恢复正在进行中,该影子文件正在被使用。 - INVALID: 文件无效或已损坏。 - MERGED: 恢复已成功完成,更改已“合并”到正式文件中,影子文件已被丢弃。 |
| ENABLED | VARCHAR2(10) | 文件的使用状态(通常为 ‘READ WRITE’)。 |
| CON_ID | NUMBER | 容器ID。在多租户环境(CDB)中,标识该影子文件所属的容器的ID。对于非CDB数据库或根容器(CDB$ROOT),此值为0。 |
💡 关键解读点:
- 在恢复期间,你可以通过此视图查看哪些文件(
FILE_ID)正在被恢复,以及恢复进程为其创建的临时文件(FILENAME)的位置和状态(STATUS)。 STATUS字段最为重要,ACTIVE表示恢复正在进行,MERGED表示恢复已成功完成且临时文件已被清理。
3. 使用场景
V$SHADOW_DATAFILE 的使用场景非常特定和高级:
- 监控长时间运行的恢复操作:当执行一个需要介质恢复的
RECOVER DATABASE或RECOVER DATAFILE命令时,DBA 可以查询此视图来确认恢复操作是否正在进行(STATUS='ACTIVE'),以及为哪些文件创建了影子副本。 - 诊断数据库启动失败问题:如果实例在启动时(mount或open阶段)因为恢复问题而挂起或失败,查询此视图可以帮助诊断是否在恢复过程创建影子文件时出现了问题(例如,磁盘空间不足导致无法创建影子文件)。
- 排查存储空间意外占用:在极少数情况下,如果恢复过程被异常中断(例如实例崩溃、服务器断电),影子文件可能没有被正常清理,从而残留在了操作系统上,占用磁盘空间。DBA 可以通过此视图的
FILENAME字段定位到这些残留文件,并在确认后安全删除它们。
注意:对于绝大多数日常运维,DBA 不会直接与此视图交互。它主要用于故障排除和深入理解恢复机制。
4. 底层原理与相关知识点
4.1 恢复过程与影子文件
当数据库需要进行介质恢复时(例如,从备份恢复文件后,或一个旧备份文件被意外替换了当前文件),核心步骤如下:
- 识别需求:SMON 进程或恢复进程识别到数据文件头中的检查点SCN远远小于控制文件中的检查点SCN,表明需要恢复。
- 创建影子文件:恢复进程在原始数据文件所在的相同目录或
DB_CREATE_FILE_DEST指定的位置(如果使用OMF)创建一个隐藏的临时文件(影子文件)。其文件名通常包含随机字符或特定的内部命名规则(如_SM_{SHADOW_ID}.DAT)。 - 应用重做:恢复进程从归档日志和在线重做日志中读取所需的更改记录(重做条目),并将这些更改应用到影子文件上,对其进行“前滚”。
- 完成恢复:一旦所有必要的重做都被应用,恢复即完成。
- 文件切换:恢复进程将影子文件重命名为正式的数据文件名,原子化地替换旧文件。如果设置了
DB_FLASHBACK_RETENTION_TARGET并且启用了闪回数据库,旧的数据文件可能会被保留以备闪回之用,否则会被删除。 - 清理:成功重命名后,影子文件在
V$SHADOW_DATAFILE中的记录状态更新为MERGED,并且该记录最终会被清除。
4.2 相关后台进程
- SMON (System Monitor):负责在实例启动时执行系统级别的恢复。
- RECO (Recoverer Process):在分布式数据库配置中,解决分布式事务的故障。
- Server Processes:在某些恢复场景下,前台服务器进程也会执行恢复任务。
5. 相关视图
| 视图名称 | 主要用途描述 |
|---|---|
| V$DATAFILE | 显示所有当前控制文件中识别的数据文件的状态和信息(如状态、检查点SCN)。 |
| V$DATAFILE_HEADER | 通过读取数据文件头来显示数据文件的信息。如果文件不存在或头块损坏,这里的信息可能与 V$DATAFILE 不同。这是判断文件是否需要恢复的关键视图。 |
| V$RECOVERY_FILE_STATUS | 显示每个需要介质恢复的数据文件的恢复状态。 |
| V$RECOVERY_LOG | 显示完成介质恢复所需的归档日志文件的信息。 |
| V$RECOVERY_PROGRESS | 提供当前恢复操作的进度信息。 |
| V$SESSION_LONGOPS | 显示运行时间超过6秒的长时间操作(包括备份恢复)的进度。查询 OPNAME 列如 ‘Media Recovery’ 的记录。 |
6. 基表信息
与所有 V$ 视图一样,V$SHADOW_DATAFILE 是基于底层 X$ 表 构建的。这些 X$ 表是 Oracle 内核中的内存结构,没有官方文档支持,其结构和命名可能随版本变化。
根据内部研究,V$SHADOW_DATAFILE 很可能基于名为 **XKCCSH∗∗或类似的XKCCSH** 或类似的 XKCCSH∗∗或类似的X 表。再次强调:
严禁在生产环境中直接查询 X$ 表。这些表是 Oracle 内部的、未公开的,直接查询可能存在风险且不受支持。所有诊断信息都应通过公开的 V$ 视图获取。
7. 常用查询 SQL
7.1 查看当前所有影子文件
此查询列出了数据库中所有当前存在的影子文件及其状态和对应的原始文件。
SELECT
shadow_id,
file_id AS original_file_id,
TO_CHAR(creation_time, 'YYYY-MM-DD HH24:MI:SS') AS created,
creation_change AS creation_scn,
filename AS shadow_file_path,
ROUND(bytes / 1024 / 1024, 2) AS size_mb,
status,
con_id
FROM
v$shadow_datafile
ORDER BY
creation_time;
7.2 关联原始数据文件名称
此查询将影子文件与其原始数据文件的名称关联起来,使信息更完整。
SELECT
s.shadow_id,
s.file_id AS original_file_id,
d.name AS original_datafile_name,
s.filename AS shadow_file_path,
s.status,
s.creation_time,
ROUND(s.bytes / 1024 / 1024, 2) AS shadow_size_mb
FROM
v$shadow_datafile s
LEFT JOIN
v$datafile d ON (s.file_id = d.file#)
ORDER BY
s.creation_time DESC;
7.3 按状态统计影子文件
此查询按状态分组统计影子文件,快速了解恢复概况。
SELECT
status,
COUNT(*) AS file_count,
SUM(bytes) AS total_bytes,
ROUND(SUM(bytes) / 1024 / 1024, 2) AS total_mb
FROM
v$shadow_datafile
GROUP BY
status;
8. 最佳实践与注意事项
- 不要手动删除
ACTIVE状态的文件:如果STATUS显示为ACTIVE,说明恢复进程正在使用该文件。手动删除或修改此文件会导致恢复失败甚至数据损坏。 - 清理残留文件:如果实例崩溃导致恢复中断,你可能会在操作系统上发现残留的影子文件(其记录在
V$SHADOW_DATAFILE中可能已不存在)。在确认数据库运行正常且不需要这些文件进行恢复后,可以手动从操作系统层面删除它们以释放空间。 - 监控文件系统空间:恢复过程,尤其是恢复大型数据文件时,会在短时间内需要双倍的存储空间(原始文件 + 影子文件)。务必确保数据文件所在目录有充足的空间,否则恢复会因无法创建影子文件而失败。
- 动态性能视图的生命周期:
V$SHADOW_DATAFILE中的信息存在于内存中,仅在实例运行期间有效。实例关闭后,该视图的内容会被清除。
总而言之,V$SHADOW_DATAFILE 是一个用于深入诊断数据库启动和恢复过程中特定行为的专业视图。虽然日常使用频率极低,但在处理复杂的恢复场景和故障排除时,理解它能提供关键 insights。
欢迎关注我的公众号《IT小Chen》

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



