在Oracle RAC集群中,ACFS文件系统经常被用来存放数据库数据文件、归档日志、跟踪文件或应用共享文件。与传统单机文件系统不同,ACFS构建在ASM磁盘组的ADVM卷上,快照功能直接依赖卷级的写时复制机制。这意味着快照创建的并不是完整副本,而是一个保存原始数据块引用关系的元数据集合。RAC环境下所有节点共享同一套ASM存储和ACFS元数据,因此快照理论上在集群范围内都可见,但实际使用中会受到Oracle Clusterware资源状态和本地缓存刷新的影响。

下面先理解ACFS快照的实现机制,以及它在RAC环境中的可见性和限制。只有把这些底层行为搞清楚,后续创建和恢复操作才会少走弯路。需要注意的是,快照在ACFS中始终是只读对象,不能直接挂载成可写文件系统;恢复动作本质上是把只读快照中的文件复制回生产目录。对数据库文件做恢复前,必须考虑数据文件与归档日志的一致性。
ACFS快照的实现机制与RAC限制
ACFS快照基于Oracle ADVM卷的写时复制机制实现。当第一次创建快照时,系统并不会立即复制所有数据块,而是记录当前文件系统元数据状态,并建立快照映射表。后续生产文件发生写入时,ACFS会先把即将被覆盖的旧数据块拷贝到快照区,再允许新数据写入。这种方式使快照创建速度很快,也节省了大量磁盘空间,但代价是快照会随着生产端写入量的增加而逐渐消耗卷空间。如果快照空间与生产文件系统共用同一个ADVM卷,空间耗尽会同时影响在线文件和快照,因此需要提前规划卷大小或定期清理过期快照。
在RAC集群环境中,ACFS文件系统通常注册在Oracle Clusterware中,由GI的ora.acfs资源统一管理。快照元数据保存在ADVM卷上,所有节点通过集群文件系统锁和全局缓存访问同一份元数据。理论上在任意节点创建快照后,其他节点都能通过 .ACFS/snaps 目录看到该快照。不过实际部署中,如果执行快照命令的节点GI服务异常、ACFS资源未完全上线,或节点间存在较大的写入缓存延迟,可能出现短暂不可见。建议在承载主要I/O的节点或ACFS资源属主节点执行快照创建,创建后用 acfsutil snap info 在至少两个节点上确认快照名称和创建时间一致。
此外,Oracle数据库RAC节点如果以ACFS作为数据文件目录,快照不会自动保证数据库一致性。因为数据文件可能分布在多个节点上被不同DBWR进程写入,快照记录的是某个时间点上的文件系统块状态,而不是数据库的SCN一致状态。因此对数据库文件做快照前,需要同时执行 BEGIN BACKUP 或使用RMAN的副本保护策略,否则恢复出来的文件可能需要介质恢复。对于只存放归档日志或跟踪文件的ACFS,快照则可以直接使用,没有数据库一致性顾虑。
在RAC集群中创建ACFS快照的操作步骤
创建快照前,先确认ACFS文件系统在当前节点已挂载,并且Grid Infrastructure相关资源在线。可以通过 df -h /u01/app/oracle/acfsdata 查看挂载状态,通过 srvctl status filesystem 或 crsctl stat res -t 查看资源状态。然后使用 /sbin/acfsutil info fs /u01/app/oracle/acfsdata 检查文件系统是否启用了快照功能。输出中如果包含 snap 相关信息,说明支持;如果提示不支持,需要先调整ADVM卷或文件系统属性。
确认无误后,在选定的节点上执行快照创建命令。例如要在 /u01/app/oracle/acfsdata 上创建一个名为 snap_before_upgrade 的快照,可以执行以下命令:
# 检查ACFS文件系统信息 /sbin/acfsutil info fs /u01/app/oracle/acfsdata # 创建快照,快照名不能包含空格和特殊字符 /sbin/acfsutil snap create snap_before_upgrade /u01/app/oracle/acfsdata # 查看快照列表 /sbin/acfsutil snap info /u01/app/oracle/acfsdata
命令执行成功后,可以在挂载点根目录的 .ACFS/snaps/snap_before_upgrade 下看到快照内容。这个目录在Linux中使用 ls -l 时需要显式输入点号开头的隐藏目录名。例如:
ls -l /u01/app/oracle/acfsdata/.ACFS/snaps/snap_before_upgrade
在RAC其他节点上,也可以尝试访问同一路径。如果某个节点看不到快照,先检查该节点的ACFS文件系统是否处于挂载状态,然后尝试手动触发ACFS元数据刷新,例如在该节点执行 ls /u01/app/oracle/acfsdata/.ACFS/snaps 查看目录。一般情况下,超过几秒后集群内的所有节点都能读到快照。如果仍然不可见,需要检查OCR中的文件系统注册信息以及节点间CSS通信是否正常。删除过期快照时使用 /sbin/acfsutil snap delete snap_before_upgrade /u01/app/oracle/acfsdata 即可,删除前必须确认没有恢复任务仍在读取该快照。
快照恢复与数据库一致性处理
ACFS快照是只读视图,恢复文件的过程本质是从 .ACFS/snaps 目录复制旧版本文件覆盖当前文件。对于体积较小的跟踪文件、配置文件或日志,可以先备份当前文件,再直接执行 cp 或 rsync。例如,假设需要恢复 /u01/app/oracle/acfsdata/config/app.conf,可以先把它改名,再从快照中拷贝回来:
# 备份当前文件
mv /u01/app/oracle/acfsdata/config/app.conf \
/u01/app/oracle/acfsdata/config/app.conf.bad_$(date +%Y%m%d)
# 从快照恢复
cp -a /u01/app/oracle/acfsdata/.ACFS/snaps/snap_before_upgrade/config/app.conf \
/u01/app/oracle/acfsdata/config/app.conf
# 确认恢复后的属主和权限
ls -l /u01/app/oracle/acfsdata/config/app.conf
如果恢复的是数据库数据文件、控制文件或在线重做日志,绝对不能直接复制完就打开数据库。因为这些文件在快照创建时可能处于不一致状态,甚至是被多个节点同时写入的状态。对数据文件做快照前,应先使用RMAN执行相关表空间的备份,或者在SQL*Plus中执行 ALTER TABLESPACE users BEGIN BACKUP,完成快照后再执行 END BACKUP。恢复时,也需要把从快照复制回来的数据文件当作旧版本,随后通过归档日志做前滚或使用RMAN执行不完全恢复。在线重做日志和当前控制文件通常不建议使用文件系统快照恢复,因为它们的恢复语义更复杂。
对于没有数据库写入的应用共享文件,恢复时还要注意文件属主、权限和ACL。cp -a 能够保留大部分权限,但如果目标文件新增了扩展属性或ACL,建议使用 getfacl 和 setfacl 配合校验。恢复完成后,应当让所有访问该ACFS的节点重新读取文件,避免NFS或本地缓存导致旧内容残留。虽然ACFS是集群文件系统,但Oracle数据库实例的buffer cache和操作系统page cache都需要时间收敛,可以在恢复后重启应用或执行文件系统缓存刷新。
常见故障排查与运维建议
RAC环境使用ACFS快照时,最常见的故障是快照创建失败,错误信息中包含 space exhausted 或 volume full。这通常不是因为生产数据量大,而是ADVM卷剩余空间不足以容纳写时复制产生的旧数据块。可以通过 /sbin/acfsutil info fs /mountpoint 查看快照使用量和卷容量,必要时先清理不需要的快照。如果快照必须保留,需要扩展底层ADVM卷,再扩展ACFS文件系统,操作前要确认ASM磁盘组有足够的剩余空间。
另一类问题是快照创建成功但在其他节点不可见。排查时按以下顺序检查:先确认节点间GI通信是否正常,使用 crsctl check cluster -all 查看所有节点;再确认ACFS文件系统是否在该节点已挂载;然后查看 .ACFS/snaps 目录的实际内容;最后检查该节点是否有遗留的ACFS元数据缓存,必要时在业务低峰期重新挂载文件系统。注意重新挂载需要先停止依赖该文件系统的数据库或应用,否则可能导致I/O错误。
运维方面,建议给ACFS快照建立命名规范和保留周期。例如按环境用途日期格式命名,使用脚本定期创建每日快照并删除超过7天的旧快照。快照不适合代替数据库备份,但可以作为升级、打补丁和批量变更前的快速回退点。对于数据库文件所在的ACFS,优先使用RMAN备份结合恢复目录;快照只用于非数据库文件或已经处于备份模式的数据文件保护。这样可以避免误用快照导致的数据不一致问题。
Oracle RACACFS文件系统快照修改时间:2026-10-04 13:44:13