如何使用RMAN恢复Oracle数据库

Tags: oracle rman

介绍

作为一个 Linux 系统管理员,您可能会需要恢复备份系统,其中就包括Oracle数据库。因此,所有系统管理员有必要了解如何从备份中恢复oracle数据库。通常情况下,DBA会使用Oracle RMAN工具热备份Oracle数据库。本教程介绍了如何从 RMAN 备份恢复 Oracle 数据库。

使用 RMAN如果你是第一次接触RMAN,你首先应该了解如何使用RMAN备份oracle数据库。

对于那些缺乏耐心的读者,下面是RMAN还原数据库的命令片段。使用时可以根据你的应用场景修改下面命令(阅读后面的文章可以了解更多的了解这些命令的详细信息)

RMAN> SET DBID 12345;
RMAN> STARTUP NOMOUNT;
RMAN> RESTORE CONTROLFILE FROM "/backup/rman/ctl_c-12345-20141003-03"; 
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN RESETLOGS;

验证备份位置

在还原之前,需要在执行还原的服务器上验证当前的RMAN配置。请执行下面的rman命令连接到RMAN,会显示RMAN> 提示符,在这里可以执行所有RMAN命令。

$ rman target /
Recovery Manager: Release 11.2.0.1.0 - Production on Mon Nov 17 11:17:11 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
connected to target database: DEVDB (DBID=821773)
RMAN>

执行show all命令,会显示当前RMAN的配置信息。如下面例子,当前RMAN的备份路径在"/backup/rman"目录

RMNAN> SHOW ALL;
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS;
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/rman/ctl_%F';
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 4;
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT   '/data/rman-backup/full_%u_%s_%p' MAXPIECESIZE 4096 M;
CONFIGURE MAXSETSIZE TO UNLIMITED;
CONFIGURE ENCRYPTION FOR DATABASE OFF;
CONFIGURE ENCRYPTION ALGORITHM 'AES128';
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup/rman/snapcf_med.f';

从RMAN备份文件恢复数据库主要有三个步骤。

  1. 从备份文件中恢复ControlFile

  2. 还原数据库

  3. 恢复数据库

警告:请在测试环境上测试rman命令,如果你尝试在生产环境上执行命令,如果出错的话会丢失生产数据。

步骤一:从备份中还原ControlFile

在还原数据库之前需要先还原数据库的控制文件(ControlFile)。当还原到一个新的数据库服务器上或者数据库服务器的控制文件已损坏时,这个步骤是必须要做的。

RMAN> SET DBID 12345;
RMAN> STARTUP NOMOUNT;
RMAN> RESTORE CONTROLFILE FROM "/backup/rman/ctl_c-12345-20141003-03"; 
RMAN> ALTER DATABASE MOUNT;

在执行RMAN还原过程前,需要完成以下工作:

设置DBID。你可以从控制文件的名子中得到dbid得到,"ctrl_c-"后面的数字。请注意这取决于在您的系统设置的控制文件格式。执行show all查看格式。在这个示例中,格式为:"ctl_ %f"使用nomount参数启动数据库从备份文件中还原ControlFile。在这个例子中,RMAN备份目录为/backup/rman。在这个目录中,有多个控制文件备份,根据备份文件上的时间戳,选择一个合适的备份文件还原。完成控制文件还原操作后,挂载数据库。

下面是resotre controlfile命令输出示例:

Starting restore at 22-NOV-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=124 devtype=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:02
output filename=/u01/oradata/devdb/control01.ctl
output filename=/u02/oradata/devdb/control02.ctl
output filename=/u03/oradata/devdb/control03.ctl
Finished restore at 22-NOV-14

当使用RMAN备份时,如果对当前备份指定了标签,那么可以通过标签名来还原控制文件(ControlFile):

RMNAN> RESTORE CONTROLFILE FROM AUTOBACKUP;

步骤二:还原数据库

使用如下命令通过/backup/rman目录下的备份文件还原数据库:

RMAN> RESTORE DATABASE;

除了使用上面命令直接还原数据库外,此命令也有其他的使用方式,参考下面的例子。根据您的具体情况选择一个合适的命令使用即可。

RMAN>
Starting restore at 22-NOV-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=125 devtype=DISK
...
channel ORA_DISK_2: starting datafile backupset restore
channel ORA_DISK_2: specifying datafile(s) to restore from backup set
restoring datafile 00020 to /u01/oradata/devdb/dev01_1.dbf
restoring datafile 00021 to /u02/oradata/devdb/report_data.dbf
restoring datafile 00022 to /u01/oradata/devdb/analytics01.dbf
channel ORA_DISK_2: reading from backup piece /backup/rman/full_32qakgmpa_123456_1
channel ORA_DISK_4: starting datafile backupset restore
....

步骤三:还原(Restore)数据库(以及日志)

如果执行了步骤一还原控制文件(ControlFile),则需要执行这个步骤。

在还原数据库步骤执行时,需要使用resetlogs选项打开数据库:

RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN RESETLOGS;

还原指定的表空间

相对于还原整个库,你可以选择只还原部分表空间,如下面的例子进还原dev1表空间:

RMNAN> RESTORE TABLESPACE dev1;

当然,也可以还原多个表空间,多个表空间名使用逗号“,"分割,下面例子还原dev1和dev2表空间:

RMNAN> RESTORE TABLESPACE dev1, dev2;

还原指定的数据文件(DataFiles)

同样可以仅还原指定的数据文件,下面的例子仅还原dev1_01.dbf数据文件:

RMNAN> RESTORE DATAFILE '/u01/oradata/devdb/dev1_01.dbf'

同样也可以还原多个数据文件,每个数据文件名使用逗号","分割,下面例子将还原dev1_01和dev1_02两个数据文件:

RMNAN> RESTORE DATAFILE '/u01/oradata/devdb/dev1_01.dbf', '/u01/oradata/devdb/dev1_02.dbf'

使用数据文件编号也能得到同样的结果

RMNAN> RESTORE DATAFILE 34, 35

数据文件编号(file_id)可以在dba_data_files表中找到:

SQL> select file_id, file_name from dba_data_files
   FILE_ID FILE_NAME
---------- -------------------------------
        34 /u01/oradata/devdb/dev1_01.dbf
        35 /u01/oradata/devdb/dev1_02.dbf

恢复归档日志(Archived Redo Logs)

下面的命令还原归档日志到默认位置

RMNAN> RESTORE ARCHIVELOG ALL;

如果希望还原归档日志到新位置,参考下面命令:

RMNAN> SET ARCHIVELOG DESTINATION TO '/home/arc_logs_new/';
RMNAN> RESTORE ARCHIVELOG ALL;

下面命令只恢复指定序列号的归档日志(序列号153-175)

RMNAN> RESTORE ARCHIVELOG FROM SEQUENCE 153 UNTIL SEQUENCE 175;

同样,可以根据起始SCN序号来恢复归档日志:

RMNAN> RESTORE ARCHIVELOG FROM SCN 56789;

注意:当使用上面步骤3来还原数据库时,它寻找所有的归档日志从归档日志,并将其应用到oracle数据库数据文件中。

恢复(Recover)指定的表空间和数据文件

和还原表空间及数据文件类似,恢复命令的结果也依赖于命令选项,下面是一些例子:

RMAN> RECOVER TABLESPACE dev1;
RMAN> RECOVER TABLESPACE dev1, dev2;
RMAN> RECOVER DATAFILE '/u01/oradata/devdb/dev1_01.dbf'
RMAN> RECOVER DATAFILE 34, 35

注意recover命令可以使用"DELETE ARCHIVELOG"选项,在执行后会删除已不需要的归档日志(restored archive logs),如:

RMNAN> RECOVER TABLESPACE dev1 DELETE ARCHIVELOG;

还原预览

在恢复数据库之前, 可以在任何恢复数据库命令上使用"PREVIEW"选项,这个选项的输出与rman的"SUMMARY"的输出很相似。预览并不会真正执行数据库恢复,预览可以作为恢复前的信息参考:

RMAN> RESTORE DATABASE PREVIEW;

如果上面命令的出处太详细了,你可以添加"SUMMARY"选项:

RMAN> RESTORE DATABASE PREVIEW SUMMARY;

下面是"PREVIEW SUMMARY"的输出示例:

Key     TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag
------- -- -- - ----------- --------------- ------- ------- ---------- ---
234587  B  F  A DISK        22-NOV-14       1       1       YES        WEEKLY_FULL_BKUP
234588  B  F  A DISK        22-NOV-14       1       1       YES        WEEKLY_FULL_BKUP
234589  B  F  A DISK        22-NOV-14       1       1       YES        WEEKLY_FULL_BKUP
234580  B  F  A DISK        22-NOV-14       1       1       YES        WEEKLY_FULL_BKUP
234581  B  F  A DISK        22-NOV-14       1       1       YES        WEEKLY_FULL_BKUP

下面的命令都是添加了"PREVIEW"选项,同样可以增加"SUMMARY"选项:

RESTORE TABLESPACE dev1 PREVIEW;
RESTORE DATAFILE '/u01/oradata/devdb/dev1_01.dbf' PREVIEW;
RESTORE ARCHIVELOG ALL PREVIEW;
RESTORE ARCHIVELOG FROM SCN 234546 PREVIEW;

还原前验证备份(演练:Dry-run)

在还原前你可能希望验证备份文件以确保备份文件没有损坏,并且确定备份文件在备份目录中存在:

RMAN> RESTORE DATABASE VALIDATE;

根据数据库的大小不同这个命令会需要一定的时间来执行。技术上讲,这个命令完全等同于真正的还原命令(只是没有还原而已),它执行的实际上是还原演练。"validate"选项会像还原一样读取备份中所有数据块并确保所有数据都是有效的。

下面是"RESTORE ... VALIDATE"命令的示例输出:

Starting restore at 22-NOV-14
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=123 devtype=DISK
...
channel ORA_DISK_1: starting validation of datafile backupset
channel ORA_DISK_2: starting validation of datafile backupset
channel ORA_DISK_1: reading from backup piece /backup/rman/full_3abcde4po_123456_1
channel ORA_DISK_2: reading from backup piece /backup/rman/full_32qakgmpa_123456_1
channel ORA_DISK_1: restored backup piece 1
...
channel ORA_DISK_2: validation complete, elapsed time: 00:53:11
Finished restore at 22-NOV-14

RMAN还原常见错误信息

下面是一些还原过程中常遇到的错误错误1: Start-up mount可能会遇到RMAN-04014错误:

RMAN> STARTUP NOMOUNT
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of startup command at 10/03/2014 11:04:19
RMAN-04014: startup failed: ORA-09925: Unable to create audit trail file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9925

解决方案1:创建审计目录,修改路径以匹配你的操作系统

mkdir -p $ORACLE_BASE/admin/devdb/adump

错误2:还原控制文件(ControlFile)可能遇到RMAN-00558、RMAN-01006或RMAN-02001错误

RMAN> RESTORE CONTROLFILE FROM /backup/rman/ctl_c-12345-20141003-03
RMAN-00558: error encountered while parsing input commands
RMAN-01006: error signaled during parse
RMAN-02001: unrecognized punctuation symbol "/"

解决方案2:确保用引号(")括住整个控制文件路径,例如:

RMAN> RESTORE CONTROLFILE FROM "/backup/rman/ctl_c-12345-20141003-03";

错误3:还原控制文件(或数据库)会遇到MAN-03002、ORA-19870、ORA-27040错误,并同时提示“Linux-x86_64 Error: 2: No such file or directory”。

RMAN> RESTORE CONTROLFILE FROM "/backup/rman/ctl_c-12345-20141003-03"; 
RMAN-03002: failure of restore command at 10/03/2014 11:12:25
ORA-19870: error while restoring backup piece /backup/rman/ctl_c-12345-20141003-03
ORA-19504: failed to create file "/u01/oradata/devdb/control01.ctl"
ORA-27040: file create error, unable to create file
Linux-x86_64 Error: 2: No such file or directory

解决方案3:大多数情况下是路径不对,创建相应的目录就行了。有可能还会碰到找不到flash_recovery_area目录错误,同样也创建一个目录。或者,根据错误提示创建对应的目录也可以。

mkdir -p $ORACLE_BASE/oradata/devdb
mkdir -p $ORACLE_BASE/flash_recovery_area/devdb/

问题4:当执行"alter database open resetlogs"时,可能会遇到ORA-01152错误

RMAN> ALTER DATABASE OPEN RESETLOGS;
ERROR at line 1:
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: '/u01/oradata/devdb/system01.dbf'

解决方案4:首先,尝试取消还原数据库操作(参考下面例子),如果没有解决问题,去掉下面例子中"UNTIL CANCEL"选项,当RMAN提示需要"Specify log"时,输入redo file文件即可。

RMAN> RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE;

原文:How to Restore Oracle Database using RMAN

翻译:4byte.cnHow to Restore Oracle Database using RMAN

本文链接:http://www.4byte.cn/learning/119994/ru-he-shi-yong-rman-hui-fu-oracle-shu-ju-ku.html