联系:手机/微信(+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 通道还原完整没有问题.
