在RMAN用語中,“還原”與“恢復”具有不同的含義,還原(restore)是指訪問先前生成的備份集,從中得到一個或多個對象,然后再磁盤上的某個位置還原這些對象。還原與恢復時分離的。恢復(recovery)是一個使數據庫與給定時間點相一致以保證能夠打開這個數據庫的實際操作。
RMAN configuration parameters for database with db_unique_name ORCL are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
。。。。
3> allocate channel c1 device type disk;
4> backup tablespace system format '/storage/database/oracle/backupset/online/backup_%U.bkp';
5> backup current controlfile;
6> RELEASE CHANNEL c1;
7> }
。。。。。。
Starting Control File and SPFILE Autobackup at 2015-06-07 10:24:00
piece handle= /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/c-1405321682-20150607-01 comment=NONE
Finished Control File and SPFILE Autobackup at 2015-06-07 10:24:01
released channel: c1
using channel ORA_DISK_1
channel ORA_DISK_1: AUTOBACKUP found: c-1405321682-20150607-01
channel ORA_DISK_1: restoring spfile from AUTOBACKUP c-1405321682-20150607-01
channel ORA_DISK_1: SPFILE restore from AUTOBACKUP complete
Finished restore at 2015-06-07 13:33:28
RMAN> startup
如果丟失了所有的參數文件(spfile和pfile),而且開啟了控制文件自動備份(RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;),我們可以從自動備份的控制文件+參數文件的備份集中恢復服務器的參數文件。不同的操作系統,自動備份的參數文件+控制文件保存的位置略有區別:
windows:$ORACLE_HOME%\database
linux/unix:$ORACLE_HOME/dbs
如果之前有自動備份控制文件+參數文件備份集,那么我們只需要簡單執行一條語句:restore spfile from autobackup; 語句就可以恢復參數文件。執行該語句時,Oracle會在默認位置中(或則在allocate channel命令定義的位置中)查找所需備份集,該備份集使用Oracle默認的命名規則(%F),該命名規則在FRA里面不適用(FRA有自己的命名規則)。
示例:模擬參數文件丟失(先在脫機狀態執行數據庫全備,然后移出所有$ORACLE_HOME/dbs下的spfile和pfile文件到臨時目錄下)
數據庫會啟動失敗:
SQL> startup
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/initorcl.ora'
方法一,使用默認配置進行參數文件恢復
啟動RMAN進行參數文件的恢復:
[oracle@localhost ~] $ set oracle_sid=orcl
[oracle@localhost ~] $ rman target /
RMAN>set DBID = 1405321682
RMAN>startup nomount
RMAN>restore spfile from autobackup;
Starting restore at 2015-06-06 21:24:27
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=130 device type=DISK
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20150606
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20150605
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20150604
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20150603
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20150602
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20150601
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20150531
channel ORA_DISK_1: no AUTOBACKUP in 7 days found
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 06/06/2015 21:24:29
RMAN-06172: no AUTOBACKUP found or specified handle is not a valid copy or piece
錯誤分析
恢復報錯,提示未找到有效的備份集。分析原因:正常來說,剛才做的數據庫全備,並設置了configure autobackup on,應該是有參數文件備份的,但是為什么找不到了?
默認配置恢復參數文件,Oracle會到$ORACLE_HOME/dbs下尋找指定名稱的備份集,從報錯信息來看,默認情況下它會在該目錄下尋找過去7天內創建的控制文件備份集(可以加上maxseq和maxdays來改變默認天數),如果沒找到就報錯。去$ORACLE_HOME/dbs目錄下查看,確實沒有任何備份集,從剛才的備份過程來看,Oracle將控制文件自動保存到FRA里面去了,而且使用的是FRA里面的默認命令規則:
Starting Control File and SPFILE Autobackup at 2015-06-06 21:22:36
piece handle=/home/oracle/app/flash_recovery_area/ORCL/autobackup/2015_06_06/o1_mf_s_881702383_bq5x0wq0_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2015-06-06 21:22:37
released channel: c1
由於數據庫是啟動在nomount狀態,參數文件丟失,因此並沒有加載參數文件,Oracle也就無法定位FRA,因此Oracle不會去FRA中尋找(測試過將c-1405321682-20150606-01放在FRA中,仍然無法恢復),而是去$ORACLE_HOME/dbs下尋找(補充說明2)。手工恢復參數文件,查看RMAN的默認配置,是否有設置控制文件的默認存儲位置(
注意了,nomount狀態下只能看到RMAN最原始的配置信息,見下面的補充說明1,看不到修改的配置信息,必須將數據庫啟動到mount狀態):
RMAN> show all;
RMAN configuration parameters for database with db_unique_name ORCL are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
。。。。
錯誤解決
備份目錄確實是使用的是默認的,為什么自動備份控制文件和參數文件的時候會將備份集保存到FRA中去?確實很奇怪,手工設置一下備份路徑:
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F';
RMAN> show all;
RMAN configuration parameters for database with db_unique_name ORCL are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F';
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
。。。。。
發現 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; 后面的default沒有的,但是值還是不變,在執行一次備份:
RMAN> run
2> {
3> allocate channel c1 device type disk;
4> backup tablespace system format '/storage/database/oracle/backupset/online/backup_%U.bkp';
5> backup current controlfile;
6> RELEASE CHANNEL c1;
7> }
。。。。。。
Starting Control File and SPFILE Autobackup at 2015-06-07 10:24:00
piece handle= /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/c-1405321682-20150607-01 comment=NONE
Finished Control File and SPFILE Autobackup at 2015-06-07 10:24:01
released channel: c1
哈哈,參數文件和控制文件的備份集保存到正確的默認路徑下面了。其實這個操作什么也沒改,但重新設置一下就好了,這應該是Oracle的bug。再次模擬參數文件的丟失,執行參數文件的恢復:
RMAN> restore spfile from autobackup;
Starting restore at 2015-06-07 13:33:27
using channel ORA_DISK_1
channel ORA_DISK_1: AUTOBACKUP found: c-1405321682-20150607-01
channel ORA_DISK_1: restoring spfile from AUTOBACKUP c-1405321682-20150607-01
channel ORA_DISK_1: SPFILE restore from AUTOBACKUP complete
Finished restore at 2015-06-07 13:33:28
RMAN> shutdown immediate
Oracle instance shut down
RMAN> startup
方法二,使用指定備份集的方式進行恢復
[oracle@localhost ~] $ set oracle_sid=orcl
[oracle@localhost ~] $ rman target /
RMAN>set DBID = 1405321682
RMAN>startup nomount
RMAN>restore spfile from '
/home/oracle/app/flash_recovery_area/ORCL/autobackup/2015_06_06/o1_mf_s_881702383_bq5x0wq0_.bkp';
RMAN>shutdown immediate
方法三,使用臨時參數文件進行恢復
如果忘記了待恢復數據庫的DBID,上面的兩種方式就失效了,可以使用臨時參數文件來恢復spfile,前提是正確配置臨時參數文件。因為臨時參數文件可以指定FRA的位置,那么Oracle執行restore spfile from autobackup的時候就會去FRA中尋找。(沒有實踐)
[oracle@localhost ~] $ set oracle_sid=orcl
[oracle@localhost ~] $ rman target /
RMAN>startup nomount; --加載臨時參數文件
RMAN>restore spfile from autobackup;
RMAN>shutdown immediate
補充:
1,在nomount狀態下看到的默認配置信息:
RMAN> show all;
RMAN configuration parameters for database with db_unique_name DUMMY are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
RMAN configuration parameters for database with db_unique_name DUMMY are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
2,為什么Oracle會到$ORACLE_HOME/dbs下尋找控制文件備份集?
you're using Flash recovery area and Oracle managed files for backup without RMAN catalog. When you start your instance with STARTUP FORCE NOMOUNT, Oracle set instance with minimal parameters and doesn't have a clue about where your flash recovery area is located. Oracle is looking for autobackup in "well" known locations (dbs on Unix, database on Windows) for a file that conforms to notation: c-IIIIIIIIII-YYYYMMDD-QQ (this is set with %F parameter). In your case Oracle doesn't find one because it's not there.