不能用普通操作系统命令(如 cp)备份 asm 中的数据文件,必须用 oracle 官方支持的工具链 —— rman、asmcmd、dbms_file_transfer 或 asm ftp,否则会报错 ora-15045 或读取到空/损坏内容,因为 asm 文件对 os 不可见。

cp)备份 ASM 中的数据文件,必须用 Oracle 官方支持的工具链 —— RMAN、ASMCMD、DBMS_FILE_TRANSFER 或 ASM FTP**。否则会报错 ORA-15045 或读取到空/损坏内容,因为 ASM 文件对 OS 不可见。
RMAN 备份 ASM 数据文件(最常用、最可靠)
这是生产环境首选方式,能同时备份数据文件、归档日志、控制文件,并生成可验证的备份集。
- ASM 文件天然支持 RMAN,无需额外配置;RMAN 通过 Oracle 实例访问 ASM,不走文件系统层
- 执行前确保数据库处于
ARCHIVELOG模式,否则只能做一致性冷备 - 典型全库备份命令(目标为 FRA 或指定磁盘组):
RMAN> backup as compressed backupset database plus archivelog delete input;
- 若需备份单个数据文件(例如迁移前抽样验证),用:
RMAN> backup datafile '+DATA/orcl/datafile/users.256.1123456789';
- 注意:
backup是逻辑备份集,不是裸文件拷贝;如需物理副本(比如给开发提取某表空间),应改用convert datafile或copy
ASMCMD cp 命令(仅限 11g+,适合快速物理拷贝)
asmdcmd cp 是唯一能在命令行直接“复制” ASM 文件到本地或另一 ASM 磁盘组的官方方式,但本质是调用 Oracle 内部 API,不是 OS cp。
- 必须以
grid或oracle用户运行,且该用户有 ASM 实例访问权限 - 源路径必须带完整 ASM 别名或全路径(如
+DATA/orcl/datafile/system.257.1123456789),不能只写+DATA - 目标路径如果是本地文件系统,需提前创建目录并确保权限(
chown oracle:oinstall) - 常见错误:
ASMCMD-08102: no connection to ASM→ 检查ORACLE_HOME和ORACLE_SID是否指向 ASM 实例(通常是 +ASM1) - 示例:
ASMCMD> cp +DATA/orcl/datafile/users.256.1123456789 /backup/users.dbf
DBMS_FILE_TRANSFER 包(跨实例传输,适合异构环境)
当需要把 ASM 文件从一个数据库实例传到另一个(比如主库 ASM → 备库文件系统),DBMS_FILE_TRANSFER 是唯一支持跨平台、跨存储的 PL/SQL 方式。
- 要求两端数据库都开启
ARCHIVELOG,且已建立数据库链接(DB_LINK) - 源端执行:
BEGIN DBMS_FILE_TRANSFER.COPY_FILE( source_directory_object => 'ASM_DIR', source_file_name => 'users.256.1123456789', destination_directory_object => 'REMOTE_DIR', destination_file_name => 'users.dbf'); END;
-
ASM_DIR必须是已创建的 directory 对象,指向 ASM 路径(如CREATE DIRECTORY ASM_DIR AS '+DATA/orcl/datafile/';) - 容易踩坑:directory 权限未授予
EXECUTE给调用用户,或REMOTE_DIR在远端不存在
为什么不用 dd / scp / rsync 直接操作 ASM 设备?
ASM 磁盘(如 /dev/oracleasm/disks/DISK1)是裸设备,没有文件系统结构。直接 dd 只能复制整个磁盘,无法定位单个数据文件,且会破坏 ASM 元数据(kfed 可读,但不可随意写)。
- 现象:
dd if=/dev/oracleasm/disks/DISK1 of=/tmp/disk1.img得到的是 1TB 的二进制镜像,根本无法分离出某个.dbf - 风险:误写磁盘头(
bs=1024 count=1)会导致整个磁盘组不可用,恢复依赖kfed备份 —— 但多数人没做过磁盘头备份 - 例外场景:只有在极端故障下(如 ASM 实例完全宕机),才考虑用
kfed read提取关键元数据,但这属于恢复范畴,不是备份
check logical;而 ASMCMD cp 或 DBMS_FILE_TRANSFER 是逐字节复制,天然一致,但无法跳过坏块**。所以高可用场景下,备份后务必执行 VALIDATE BACKUPSET 或 RESTORE ... VALIDATE。











