[20170616]recover copy of datafile 6.txt

Oracle RMAN 数据文件恢复

[20170616]no copy of datafile 6 found to recover.txt

--//最近几天一直被这个问题纠缠,我虽然不知道问题在哪来,还是找到简单的解决方法,做1个记录:
--//链接:http://www.itpub.net/thread-2088843-1-1.html

1.环境:
SYS@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

RMAN> show  CONTROLFILE AUTOBACKUP ;
RMAN configuration parameters for database with db_unique_name BOOK are:
CONFIGURE CONTROLFILE AUTOBACKUP OFF;

RMAN> report schema ;
Report of database schema for database with db_unique_name BOOK
List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    760      SYSTEM               ***     /mnt/ramdisk/book/system01.dbf
2    940      SYSAUX               ***     /mnt/ramdisk/book/sysaux01.dbf
3    865      UNDOTBS1             ***     /mnt/ramdisk/book/undotbs01.dbf
4    146      USERS                ***     /mnt/ramdisk/book/users01.dbf
5    346      EXAMPLE              ***     /mnt/ramdisk/book/example01.dbf
6    40       TEA                  ***     /mnt/ramdisk/book/tea01.dbf

List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    414      TEMP                 32767       /mnt/ramdisk/book/temp01.dbf

--//我的目的很简单是否可以给1个copy的数据文件做增量scn.

2.测试:
RMAN> list backup ;
specification does not match any backup in the repository

RMAN> list copy of database ;
specification does not match any datafile copy in the repository
--//测试前我把以前的全部备份删除.

RMAN> backup as copy  datafile 6 format '/home/oracle/backup/tea01.dbf';
Starting backup at 2017-06-16 17:18:26
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
channel ORA_DISK_1: starting datafile copy
input datafile file number=00006 name=/mnt/ramdisk/book/tea01.dbf
output file name=/home/oracle/backup/tea01.dbf tag=TAG20170616T171826 RECID=52 STAMP=946833506
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 2017-06-16 17:18:27

RMAN> list copy of datafile 6;
List of Datafile Copies
=======================
Key     File S Completion Time     Ckp SCN    Ckp Time
------- ---- - ------------------- ---------- -------------------
52      6    A 2017-06-16 17:18:26 13277281436 2017-06-16 17:18:26
        Name: /home/oracle/backup/tea01.dbf
        Tag: TAG20170616T171826
--//备份记录的Ckp SCN=13277281436.如果我执行如下
RMAN> recover copy of datafile 6 ;
Starting recover at 2017-06-16 17:19:31
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
no copy of datafile 6 found to recover
Finished recover at 2017-06-16 17:19:31

--//可以发现没有应用.必须做一个关于这个数据文件的增量备份.

RMAN> backup incremental from scn 13277281500 datafile 6 format '/home/oracle/backup/%U';
Starting backup at 2017-06-16 17:21:11
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
RMAN-06755: WARNING: datafile 6: incremental-start SCN is too recent; using checkpoint SCN 13277281436 instead
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00006 name=/mnt/ramdisk/book/tea01.dbf
channel ORA_DISK_1: starting piece 1 at 2017-06-16 17:21:11
channel ORA_DISK_2: starting full datafile backup set
channel ORA_DISK_2: specifying datafile(s) in backup set
channel ORA_DISK_1: finished piece 1 at 2017-06-16 17:21:12
piece handle=/home/oracle/backup/jes6v287_1_1 tag=TAG20170616T172111 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
including current control file in backup set
channel ORA_DISK_2: starting piece 1 at 2017-06-16 17:21:12
channel ORA_DISK_2: finished piece 1 at 2017-06-16 17:21:13
piece handle=/home/oracle/backup/jfs6v287_1_1 tag=TAG20170616T172111 comment=NONE
channel ORA_DISK_2: backup set complete, elapsed time: 00:00:01
Finished backup at 2017-06-16 17:21:13

--//说明一下,正常应该执行 from scn 13277281436,我选择从13277281500,备份程序自动纠正我的错误,选择正确的scn=13277281436
--//RMAN-06755: WARNING: datafile 6: incremental-start SCN is too recent; using checkpoint SCN 13277281436 instead.

--//接着增量恢复:
RMAN> recover copy of datafile 6 ;
Starting recover at 2017-06-16 17:22:48
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
no copy of datafile 6 found to recover
Finished recover at 2017-06-16 17:22:48

--//提示no copy of datafile 6 found to recover,很明显rman什么事情都没有做.

3.分析:
--//实际上我做了rman的跟踪:

$ rman target / debug recover,sql level=10 trace=tracefile.trc
DBGSQL:     TARGET>
DECLARE
   allCopies   BOOLEAN;
BEGIN
   dbms_rcvman.resetthisBackupAge;

   IF ( :allCopies > 0)
   THEN
      allCopies := TRUE;
   ELSE
      allCopies := FALSE;
   END IF;

   :rc :=
      dbms_rcvman.computeRecoveryActions
      (
         fno               => :fno
        ,crescn            => :crescn
        ,df_rlgscn         => :rlgscn
        ,df_rlgtime        => :rlgtime
        ,df_ckpscn         => :ckpscn
        ,offlscn           => :offlscn
        ,onlscn            => :onlscn
        ,onltime           => :onltime
        ,cleanscn          => :cleanscn
        ,clean2scn         => :clean2scn
        ,clean2time        => :clean2time
        ,allowfuzzy        => FALSE
        ,partial_rcv       => FALSE
        ,cf_scn            => :cfscn
        ,cf_cretime        => :cfcretime
        ,cf_offrrid        => :cfoffrrid
        ,allCopies         => allCopies
        ,df_cretime        => :cretime
        ,rmanCmd           => :rmanCmd
        ,foreignDbid       => :foreignDbid
        ,pluggedRonly      => :pluggedRonly
        ,pluginSCN         => :pluginSCN
        ,pluginRlgSCN      => :pluginRlgSCN
        ,pluginRlgTime     => :pluginRlgTime
        ,creation_thread   => :creation_thread
        ,creation_size     => :creation_size
      );

   IF ( :maxact > 0)
   THEN
      dbms_rcvman.trimRecoveryActions
      (
         maxActions      => :maxact
        ,containerMask   =>   dbms_rcvman.proxyCopy_con_t
                            + dbms_rcvman.imageCopy_con_t
                            + dbms_rcvman.backupSet_con_t
        ,actionMask      => dbms_rcvman.full_act_t
      );
   END IF;
END;

DBGSQL:        sqlcode = 0
DBGSQL:         B :rc = 1
DBGSQL:         B :allCopies = 0
DBGSQL:         B :fno = 6
DBGSQL:         B :crescn = 13276257767
DBGSQL:         B :rlgscn = NULL
DBGSQL:         B :rlgtime = NULL
DBGSQL:         B :ckpscn = NULL
DBGSQL:         B :offlscn = 0
DBGSQL:         B :onlscn = 0
DBGSQL:         B :onltime = "1988-01-01 00:01:01"
DBGSQL:         B :cleanscn = 0
DBGSQL:         B :clean2scn = 0
DBGSQL:         B :clean2time = "1988-01-01 00:00:00"
DBGSQL:         B :cfscn = 13277242031
DBGSQL:         B :cfcretime = "2015-11-24 09:11:10"
DBGSQL:         B :cfoffrrid = 0
DBGSQL:         B :cretime = "2017-02-13 15:09:58"
DBGSQL:         B :rmanCmd = 2
DBGSQL:         B :maxact = 0
DBGSQL:         B :foreignDbid = 0
DBGSQL:         B :pluggedRonly = 0
DBGSQL:         B :pluginSCN = 0
DBGSQL:         B :pluginRlgSCN = 0
DBGSQL:         B :pluginRlgTime = NULL
DBGSQL:         B :creation_thread = 1
DBGSQL:         B :creation_size = 5120
RMAN-05017: no copy of datafile 6 found to recover
RMAN-03091: Finished recover at 2017-06-15 16:53:13

--//target那行语句太长,我在toad下做了格式化处理.语句我也没看,明显增量备份没有记录.

RMAN> list backup ;
specification does not match any backup in the repository

--//从这里也说明问题,不知道为什么增量备份在控制文件中没有记录.catalog看看结果如何?
$ ls -l /home/oracle/backup/j*
-rw-r----- 1 oracle oinstall    40960 2017-06-16 17:21:11 /home/oracle/backup/jes6v287_1_1
-rw-r----- 1 oracle oinstall 11042816 2017-06-16 17:21:12 /home/oracle/backup/jfs6v287_1_1

RMAN> catalog backuppiece  '/home/oracle/backup/jes6v287_1_1';
using target database control file instead of recovery catalog
cataloged backup piece
backup piece handle=/home/oracle/backup/jes6v287_1_1 RECID=253 STAMP=946834214

RMAN> catalog backuppiece  '/home/oracle/backup/jfs6v287_1_1';
cataloged backup piece
backup piece handle=/home/oracle/backup/jfs6v287_1_1 RECID=254 STAMP=946834225

RMAN> list backup ;
List of Backup Sets
===================
BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
252     Incr    32.00K     DISK        00:00:00     2017-06-16 17:21:11
        BP Key: 253   Status: AVAILABLE  Compressed: NO  Tag: TAG20170616T172111
        Piece Name: /home/oracle/backup/jes6v287_1_1
  List of Datafiles in backup set 252
  File LV Type Ckp SCN    Ckp Time            Name
  ---- -- ---- ---------- ------------------- ----
  6       Incr 13277281639 2017-06-16 17:21:11 /mnt/ramdisk/book/tea01.dbf

BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
253     Incr    10.52M     DISK        00:00:00     2017-06-16 17:21:11
        BP Key: 254   Status: AVAILABLE  Compressed: NO  Tag: TAG20170616T172111
        Piece Name: /home/oracle/backup/jfs6v287_1_1
  Control File Included: Ckp SCN: 13277281639   Ckp time: 2017-06-16 17:21:11

--//很明显做增量时还做了控制文件的备份.

RMAN> recover copy of datafile 6 until scn 13277281500;
Starting recover at 2017-06-16 17:32:49
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=101 device type=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: SID=123 device type=DISK
allocated channel: ORA_DISK_3
channel ORA_DISK_3: SID=134 device type=DISK
no copy of datafile 6 found to recover
Finished recover at 2017-06-16 17:32:50

--//执行没报错,但是还是no copy of datafile 6 found to recover,去掉until scn 13277281500;参数看看.
--//我本来的想法就是通过这样的方式恢复到特定的scn,看来不行.这也是我最初的目的..

RMAN> recover copy of datafile 6 ;
Starting recover at 2017-06-16 17:34:26
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile copies to recover
recovering datafile copy file number=00006 name=/home/oracle/backup/tea01.dbf
channel ORA_DISK_1: reading from backup piece /home/oracle/backup/jes6v287_1_1
channel ORA_DISK_1: piece handle=/home/oracle/backup/jes6v287_1_1 tag=TAG20170616T172111
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished recover at 2017-06-16 17:34:28

--//OK,成功!!

RMAN> list copy of datafile 6;
List of Datafile Copies
=======================

Key     File S Completion Time     Ckp SCN    Ckp Time
------- ---- - ------------------- ---------- -------------------
53      6    A 2017-06-16 17:34:27 13277281639 2017-06-16 17:21:11
        Name: /home/oracle/backup/tea01.dbf
        Tag: TAG20170616T171826

--//我现在备份的数据文件scn=13277281639,也与前面做的增量一致.

4.总结:
--//感觉这个是bug,我在11.2.0.3也做了类似测试,没有问题.
--//不知道有什么好方法恢复到特定的scn,必须要通过辅助实例吗?这是我测试的目的....

<think>好的,我现在需要回答用户关于RMAN恢复中`SWITCH DATAFILE ALL;`命令的作用的问题。首先,我需要确认自己对RMAN的基本了解,特别是数据文件恢复相关的命令。 用户之前询问过如何查看备份集中的数据文件,现在转向恢复过程中的具体命令。我需要明确`SWITCH DATAFILE ALL;`的用途和应用场景。根据我的知识,RMAN中的`SWITCH`命令通常与`CATALOG`命令相关,用于更新控制文件或恢复目录中的数据文件位置信息。 接下来,我需要回忆`SWITCH DATAFILE`的具体语法和功能。可能的情况是,当数据文件的路径发生变化时,比如恢复到了不同的存储位置,RMAN需要知道新位置才能正确恢复。这时候`SWITCH`命令用来告诉RMAN数据文件的新路径。 用户提到的是`SWITCH DATAFILE ALL;`,这里的`ALL`可能是指所有数据文件。也就是说,这个命令可能用于批量更新所有数据文件的位置,而不是逐个指定。这通常在整体迁移或更改存储结构时使用。 需要进一步确认该命令的具体行为。例如,当执行`SWITCH DATAFILE ALL;`时,RMAN是否会自动检测新的数据文件路径,还是需要结合其他命令如`CATALOG`来注册新位置。可能的情况是,`SWITCH`通常与`TO`子句一起使用,指定新的路径,但`ALL`参数可能需要更多的上下文。 另外,考虑到在恢复过程中,特别是在使用备份集进行恢复时,如果数据文件的存储位置与备份时不同,RMAN可能无法找到文件,这时需要使用`SWITCH`命令来更新元数据,指向新的位置。例如,在异机恢复或目录结构变化时,这个命令非常有用。 还需要注意`SWITCH`和`SET NEWNAME`的区别。`SET NEWNAME`是在恢复过程中临时指定新路径,而`SWITCH`则是永久更新控制文件中的记录。因此,`SWITCH DATAFILE ALL;`可能在恢复完成后使用,以确保控制文件记录最新的数据文件位置。 可能存在的情况是,`SWITCH DATAFILE ALL;`将检查所有数据文件,并将它们的路径更新为当前实际的路径。这在数据文件被移动到新位置后,需要更新控制文件中的信息时使用。例如,在数据文件迁移后,执行该命令可以让RMAN识别新的路径,避免后续的恢复或备份操作出错。 需要验证是否存在该命令的确切语法,可能用户指的是`SWITCH DATAFILE ALL TO COPY;`,用于将数据文件切换到备份副本的位置,或者类似的命令结构。但根据用户提供的命令,是`SWITCH DATAFILE ALL;`,可能需要查阅RMAN文档确认。 如果`SWITCH DATAFILE ALL;`单独使用,可能的作用是扫描所有数据文件的当前路径,并更新控制文件中的记录,类似于刷新元数据。这在手动移动数据文件后非常有用,无需逐个指定每个文件的新路径。 还需要考虑该命令在恢复过程中的使用时机,比如在`RESTORE`和`RECOVER`之间,或者在恢复完成后执行。正确的顺序可能是先`RESTORE`,然后`SWITCH`更新路径,再`RECOVER`应用日志。 最后,应该提醒用户注意在执行该命令前确保数据文件已经正确移动到新位置,并且RMAN有权限访问这些路径,否则可能导致恢复失败。同时,建议在测试环境中验证命令效果,避免生产环境中的意外问题。</think>在RMAN恢复中,`SWITCH DATAFILE ALL;` 是一个关键命令,主要用于 **更新控制文件中数据文件的路径信息**。以下是其核心作用和使用场景的详细说明: --- ### **核心作用** 1. **路径重定向** 当数据文件的物理存储路径发生变更时(例如:磁盘迁移、目录结构调整等),此命令会 **批量更新控制文件中的路径记录**,确保RMAN后续操作(如恢复、验证)能正确识别文件位置。 2. **与备份副本关联** 若使用 `BACKUP AS COPY` 创建了数据文件的镜像副本(Image Copy),执行 `SWITCH DATAFILE ALL;` 会将数据库的数据文件指向这些副本,直接基于副本进行恢复或运行。 3. **元数据同步** 在手动移动数据文件后(不通过RMAN操作),需通过此命令 **同步控制文件中的元数据**,避免路径不一致导致恢复失败。 --- ### **典型使用场景** #### 场景1:数据文件路径变更后恢复 ```sql RMAN> STARTUP MOUNT; RMAN> RESTORE DATABASE; -- 恢复数据文件到原路径 RMAN> SWITCH DATAFILE ALL; -- 若恢复后路径变更,更新控制文件路径 RMAN> RECOVER DATABASE; -- 应用归档日志 RMAN> ALTER DATABASE OPEN; ``` #### 场景2:直接切换到备份副本 ```sql RMAN> BACKUP AS COPY DATABASE; -- 创建镜像副本 RMAN> SWITCH DATAFILE ALL TO COPY; -- 切换所有数据文件到副本 RMAN> RECOVER DATABASE; -- 基于副本恢复 RMAN> ALTER DATABASE OPEN; ``` #### 场景3:异机恢复时路径不同 ```sql RMAN> RESTORE DATABASE TO '/new/path/%U'; -- 恢复到新路径 RMAN> SWITCH DATAFILE ALL TO '/new/path/%U'; -- 更新控制文件中的路径 RMAN> RECOVER DATABASE; ``` --- ### **注意事项** 1. **权限与路径有效性** 执行前需确保新路径存在且Oracle用户有读写权限。 2. **与 `SET NEWNAME` 的区别** - `SET NEWNAME`:临时指定单个文件的恢复路径,仅影响当前恢复会话。 - `SWITCH DATAFILE`:永久更新控制文件中的路径记录。 3. **备份副本有效性** 使用 `SWITCH DATAFILE ALL TO COPY;` 前,需通过 `CROSSCHECK` 验证副本状态: ```sql RMAN> CROSSCHECK COPY; ``` 4. **谨慎操作** 错误的路径更新可能导致数据库无法打开,建议先在测试环境验证。 --- ### **示例输出** 执行 `SWITCH DATAFILE ALL;` 后,输出如下信息: ``` 数据文件 1 已切换到新路径: '/new_path/system01.dbf' 数据文件 2 已切换到新路径: '/new_path/sysaux01.dbf' ... 所有数据文件路径已更新。 ``` --- ### **补充命令** - **查看当前数据文件路径** ```sql RMAN> REPORT SCHEMA; ``` - **单独切换指定文件** ```sql RMAN> SWITCH DATAFILE 5 TO '/new_path/users01.dbf'; ``` 通过 `SWITCH DATAFILE ALL;`,可以高效完成批量路径更新,是数据库迁移、存储调整等场景中的关键操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值