联系:手机/微信(+86 17813235971) QQ(107644445)
标题:RMAN SBT_TAPE备份通过小程序修改实现直接DISK通道还原
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
有朋友把oracle rman备份从cv带库里拷贝到文件系统,然后希望把他还原到数据库中.通过尝试发现直接带库的文件无法直接在文件系统中被rman调用还原
C:\Users\XFF>sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 星期三 9月 3 18:07:58 2025 Copyright (c) 1982, 2013, Oracle. All rights reserved. 已连接到空闲例程。 SQL> startup nomount pfile='d:/pfile.txt' ORACLE 例程已经启动。 Total System Global Area 4275781632 bytes Fixed Size 2288080 bytes Variable Size 939525680 bytes Database Buffers 3321888768 bytes Redo Buffers 12079104 bytes SQL> exit 从 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开 C:\Users\XFF> C:\Users\XFF> C:\Users\XFF> C:\Users\XFF>rman target / 恢复管理器: Release 11.2.0.4.0 - Production on 星期三 9月 3 18:08:38 2025 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 已连接到目标数据库: ORCL (未装载) RMAN> restore controlfile from 'H:\TEMP\Oracle_Restore\405\c-1737595250-20250822-00'; 启动 restore 于 03-9月 -25 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=28 设备类型=DISK 通道 ORA_DISK_1: 正在还原控制文件 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: restore 命令 (在 09/03/2025 18:08:54 上) 失败 ORA-19870: 还原备份片段 H:\TEMP\ORACLE_RESTORE\405\C-1737595250-20250822-00 时出错 ORA-19505: 无法识别文件"H:\TEMP\ORACLE_RESTORE\405\C-1737595250-20250822-00" ORA-27046: 文件大小不是逻辑块大小的倍数 OSD-04000: 逻辑块大小不匹配 (OS 512)
以前也写过相关的文章,由于tape的备份和disk通道备份的文件头本身格式都不一样,具体参考:RMAN SBT_TAPE备份无法被DISK通道识别
尝试使用dbms_backup_restore还原依旧失败
C:\Users\XFF>sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 星期三 9月 3 18:19:23 2025 Copyright (c) 1982, 2013, Oracle. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> DECLARE 2 devtype varchar2(256); 3 done boolean; 4 BEGIN 5 devtype:=sys.dbms_backup_restore.deviceAllocate (type=>'',ident=>'t1'); 6 sys.dbms_backup_restore.restoreSetDatafile; 7 sys.dbms_backup_restore.restoreControlfileTo(cfname=>'H:\CONTROL01.CTL'); 8 sys.dbms_backup_restore.restoreBackupPiece(done=>done, 9 handle=>'H:\TEMP\Oracle_Restore\405\c-1737595250-20250822-00', params=>null); 10 sys.dbms_backup_restore.deviceDeallocate; 11 END; 12 / DECLARE * 第 1 行出现错误: ORA-19624: 操作失败, 如果可能请重试 ORA-19870: 还原备份片段 H:\TEMP\ORACLE_RESTORE\405\C-1737595250-20250822-00 时出错 ORA-19505: 无法识别文件"H:\TEMP\ORACLE_RESTORE\405\C-1737595250-20250822-00" ORA-27046: 文件大小不是逻辑块大小的倍数 OSD-04000: 逻辑块大小不匹配 (OS 512) ORA-06512: 在 "SYS.X$DBMS_BACKUP_RESTORE", line 5940 ORA-06512: 在 line 8
对于这种情况,我尝试自己开发一个小程序,来模拟disk通道备份集,欺骗数据库来实现还原操作.
通过程序模拟出来的disk通道的文件,每个后缀加上了disk

再次通过尝试通过disk通道还原操作
C:\Users\XFF>rman target / 恢复管理器: Release 11.2.0.4.0 - Production on 星期三 9月 3 18:23:14 2025 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 已连接到目标数据库: ORCL (未装载) RMAN> restore controlfile from 'H:\TEMP\Oracle_Restore\405\c-1737595250-20250822-00.disk'; 启动 restore 于 03-9月 -25 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=28 设备类型=DISK 通道 ORA_DISK_1: 正在还原控制文件 通道 ORA_DISK_1: 还原完成, 用时: 00:00:01 输出文件名=H:\CONTROL01.CTL 完成 restore 于 03-9月 -25 RMAN> alter database mount; 数据库已装载 释放的通道: ORA_DISK_1 RMAN> catalog start with 'H:\TEMP\Oracle_Restore\405\*.disk'; 搜索与样式 H:\TEMP\Oracle_Restore\405\*.disk 匹配的所有文件 数据库未知文件的列表 ===================================== 文件名: H:\TEMP\ORACLE_RESTORE\405\322_ORCL_0141onds_1_1.disk 文件名: H:\TEMP\ORACLE_RESTORE\405\322_ORCL_0241onec_1_1.disk 文件名: H:\TEMP\ORACLE_RESTORE\405\322_ORCL_0441onev_1_1.disk 文件名: H:\TEMP\ORACLE_RESTORE\405\c-1737595250-20250822-00.disk 文件名: H:\TEMP\ORACLE_RESTORE\405\c-1737595250-20250822-01.disk 是否确实要将上述文件列入目录 (输入 YES 或 NO)? yes 正在编制文件目录... 目录编制完毕 已列入目录的文件的列表 ======================= 文件名: H:\TEMP\ORACLE_RESTORE\405\322_ORCL_0141onds_1_1.disk 文件名: H:\TEMP\ORACLE_RESTORE\405\322_ORCL_0241onec_1_1.disk 文件名: H:\TEMP\ORACLE_RESTORE\405\322_ORCL_0441onev_1_1.disk 文件名: H:\TEMP\ORACLE_RESTORE\405\c-1737595250-20250822-00.disk 文件名: H:\TEMP\ORACLE_RESTORE\405\c-1737595250-20250822-01.disk RMAN>
RMAN> report schema; RMAN-06139: 警告: 控制文件对于 REPORT SCHEMA 不是最新 db_unique_name 为 ORCL 的数据库的数据库方案报表 永久数据文件列表 =========================== 文件大小 (MB) 表空间 回退段数据文件名称 ---- -------- -------------------- ------- ------------------------ 1 0 SYSTEM *** /data/oracle/oradata/orcl/system01.dbf 2 0 SYSAUX *** /data/oracle/oradata/orcl/sysaux01.dbf 3 0 UNDOTBS1 *** /data/oracle/oradata/orcl/undotbs01.dbf 4 0 USERS *** /data/oracle/oradata/orcl/users01.dbf 5 0 EXAMPLE *** /data/oracle/oradata/orcl/example01.dbf 临时文件列表 ======================= 文件大小 (MB) 表空间 最大大小 (MB) 临时文件名称 ---- -------- -------------------- ----------- -------------------- 1 20 TEMP 32767 /data/oracle/oradata/orcl/temp01.dbf RMAN> run 2> { 3> set newname for datafile 1 to 'h:\system01.dbf'; 4> set newname for datafile 2 to 'h:\sysaux01.dbf'; 5> set newname for datafile 3 to 'h:\undotbs01.dbf'; 6> set newname for datafile 4 to 'h:\users01.dbf'; 7> set newname for datafile 5 to 'h:\example01.dbf'; 8> restore database; 9> switch datafile all; 10> } 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 启动 restore 于 03-9月 -25 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=28 设备类型=DISK 通道 ORA_DISK_1: 正在开始还原数据文件备份集 通道 ORA_DISK_1: 正在指定从备份集还原的数据文件 通道 ORA_DISK_1: 将数据文件 00001 还原到 h:\system01.dbf 通道 ORA_DISK_1: 将数据文件 00002 还原到 h:\sysaux01.dbf 通道 ORA_DISK_1: 将数据文件 00003 还原到 h:\undotbs01.dbf 通道 ORA_DISK_1: 将数据文件 00004 还原到 h:\users01.dbf 通道 ORA_DISK_1: 将数据文件 00005 还原到 h:\example01.dbf 通道 ORA_DISK_1: 正在读取备份片段 H:\TEMP\ORACLE_RESTORE\405\322_ORCL_0141ONDS_1_1.DISK 通道 ORA_DISK_1: 段句柄 = H:\TEMP\ORACLE_RESTORE\405\322_ORCL_0141ONDS_1_1.DISK 标记 = TAG20250822T124236 通道 ORA_DISK_1: 已还原备份片段 1 通道 ORA_DISK_1: 还原完成, 用时: 00:00:01 完成 restore 于 03-9月 -25 数据文件 1 已转换成数据文件副本 输入数据文件副本 RECID=7 STAMP=1210875892 文件名=H:\SYSTEM01.DBF 数据文件 2 已转换成数据文件副本 输入数据文件副本 RECID=8 STAMP=1210875892 文件名=H:\SYSAUX01.DBF 数据文件 3 已转换成数据文件副本 输入数据文件副本 RECID=9 STAMP=1210875892 文件名=H:\UNDOTBS01.DBF 数据文件 4 已转换成数据文件副本 输入数据文件副本 RECID=10 STAMP=1210875892 文件名=H:\USERS01.DBF 数据文件 5 已转换成数据文件副本 输入数据文件副本 RECID=11 STAMP=1210875892 文件名=H:\EXAMPLE01.DBF RMAN>
RMAN> run 2> { 3> set archivelog destination to 'h:/'; 4> restore archivelog all; 5> } 正在执行命令: SET ARCHIVELOG DESTINATION 启动 restore 于 03-9月 -25 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在开始将归档日志还原到用户指定的目标 归档日志目标=h:/ 通道 ORA_DISK_1: 正在还原归档日志 归档日志线程=1 序列=6 通道 ORA_DISK_1: 正在还原归档日志 归档日志线程=1 序列=7 通道 ORA_DISK_1: 正在读取备份片段 H:\TEMP\ORACLE_RESTORE\405\322_ORCL_0441ONEV_1_1.DISK 通道 ORA_DISK_1: 段句柄 = H:\TEMP\ORACLE_RESTORE\405\322_ORCL_0441ONEV_1_1.DISK 标记 = TAG20250822T124311 通道 ORA_DISK_1: 已还原备份片段 1 通道 ORA_DISK_1: 还原完成, 用时: 00:00:01 完成 restore 于 03-9月 -25
通过上述操作,证明写的小程序oracle rman 备份集从tape通道备份方式修改为直接走disk 通道还原完整没有问题.