Oracle中使用RMAN備份及一些恢復方法

bitifi發表於2015-09-22
使用RMAN備份並恢復
Backup  備份命令生成 Backup sets (備份集合),以 oracle 專有的格式儲存,
由一個完全
的所有的備份片集合構成,構成一個完全備份或增量備份。
 
1.1.1 BACKUP  備份命令選項
 
設定標記(TAG)
RMAN> backup database tag='test backup';
 
限制備份集大小
RMAN> backup database maxsetsize=100M;
 
只備份新增部分
RMAN> backup incremental level 0 database;
 
備份控制檔案同時備份SPFILE
RMAN> backup current controlfile;
RMAN> configure controlfile autobackup on;    //  預設是 off
也可以在備份資料庫或者檔案的時候加上 include current controlfile 選項。
例如:

RMAN> backup database include current controlfile;

備份時如果包含了 SYSTEM表空間,將自動備份控制元件檔案和 SPFILE
RMAN> backup file 1;


使用自動備份進行恢復:

RMAN> restore spfile/controlfile to '/xx/xx' from autobackup;
 
備份歸檔日誌(9i)
RMAN> backup archivelog all;
RMAN> backup ... plus archivelog; //  在備份其他時同時備份歸檔日誌

plus archivelog 隱含如下步驟:

?      執行一個 ALTER SYSTEM ARCHIVELOG CURRENT 命令
?      執行  BACKUP ARCHIVELOG ALL 命令。注意如果備份最佳化被啟用,
RMAN只會備份未備份過的日誌
?      備份 BACKUP命令中定義的檔案
?      執行 ALTER SYSTEM ARCHIVE LOG CURRENT 命令
?      備份所有的剩下的歸檔日誌
 
備份完後刪除歸檔日誌
RMAN> backup ... ARCHIVELOG all delete all input;

修改備份集的儲存策略

例如:將備份設定為永久有效
RMAN> backup database keep forever logs|nologs;

設定為有效期 180 天

RMAN> backup database keep until time='sysdate+180';

重寫configure exclude / noexclude

透過 configure exclude 可以配置 RMAN 不備份上次備份以來沒有發生變化的資料文件。
如果要確保 RMAN備份這些資料檔案,可以在 backup命令中新增 noexclude 選項。
例如:

RMAN> backup database noexclude;
 
跳過離線的、不可存取的或者只讀的資料檔案
RMAN> backup database skip offline skipinaccessible skipreadonly;
 
強制備份只讀的資料檔案
RMAN> backup database force;
 
備份指定週期內沒有備份的資料檔案
RMAN> backup database not backed up;
RMAN> backup database not backed up since time='sysdate-2';
 
在備份操作期間檢查邏輯訛誤
RMAN> backup check logical database;    //在檢查邏輯錯誤的同時進行備份
RMAN> backup validate check logical database;    //只檢查

建立壓縮備份集

RMAN> backup as compressed backupset tablespace users
FORMAT='D:\BACKUP\%d_%s.dbf';
 
1.1.2 RESTORE/RECOVER 恢復命令選項
 
資料庫恢復
RMAN> restore/revover database ;
 
表空間恢復
RMAN> restore/revover tablespace xx ;
 
只讀表空間的恢復
預設情況下,即使丟失了只讀的資料檔案,RMAN 也不會在執行完全資料庫還原 操作時候還原只讀的資料檔案。
要在完全恢復期間還原只讀的資料檔案,就必須在 RESTORE 命令中使用 CHECK READONLY 引數:

RMAN> RESTORE DATABASE CHECK READONLY;
 
恢復SPFILE/控制檔案
使用自動備份恢復 SPFILE、控制檔案
RMAN> startup nomount;
RMAN> set dbid=153910023;

RMAN> restore controlfile from autobackup;
RMAN> restore spfile/controlfile to '/xx/xx' from autobackup;

RMAN> restore controlfile from'/arch/ct_c-2347671489-20060630-00';

聯機狀態:目標資料庫 MOUNT 或 OPEN

RMAN> restore controlfile to 'd:\temp\control01.ctl';

歸檔重做日誌的還原
RMAN> RESTORE ARCHIVELOG ALL;
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1 UNTIL LOGSEQ=20;
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1;

也可以用 SET命令來指定歸檔日誌的還原位置,
例如:

RMAN> run
{
set archivelog destination to "d:\temp";
restore archivelog all;
}
 
資料檔案副本還原
RMAN> sql "alter datafile 5 offline";
RMAN> restore (datafile 5) from datafilecop y;
RMAN> recover datafile 5;

RMAN> sql "alter datafile 5 online";
請注意,上面的圓括號很重要!
 
還原檢查與恢復測試
與備份檢查一樣,還原操作也可以檢查是否能正常 restore 或者是否該備份集是否有效。
如:
 
RMAN> RESTORE DATABASE VALIDATE;
RMAN>VALIDATEBACKUPSET 218;
RMAN> RESTORE DATABASE VALIDATE CHECK LOGICAL ;

從指定的 tag 恢復:
RMAN> RESTORE FROM tag=’xxxx’;
 
不完全恢復的還原:
1.set until time/SCN/
2.RMAN> restore database until scn 1000;
RMAN>restore database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";
RMAN> restore database until sequence 100 thread 1;

 
塊級別的恢復
 
塊恢復 Block Media Recovery (BMR),塊是恢復的最小單元,透過塊可以減少恢復時間,而且資料檔案可以線上。
恢復塊的時候,必須指定具體的塊號,
如:

RMAN> blockrecoverdatafile 6 block 3;
  
1.1.3  非歸檔模式下的 BACKUP 備份與恢復
 
恢復目錄:    
開啟
目標資料庫:例程啟動,資料庫載入,mount 不能 open
因為目標資料庫不在歸檔模式下,所以當進行備份/恢復操作的時候資料庫無法打開。
目標資料庫只能在  MOUNT 狀態不能 Open,所以屬於離線備份。


非歸檔模式不備份 redo日誌,只有完全備份和 readonly/offline 表空間和資料檔案備份是有意義的,
所以非歸檔模式最好不用 RMAN 進行備份,備份語法與歸檔模式相 同,所以這裡只做簡單介紹。


1.1.3.1  全庫備份

 
例:
使用預設的設定離線全備份的語句

RMAN> shutdown immediate;
RMAN> startup mount;
RMAN> backup database;
RMAN> startup;
 
例:
不使用預設的設定執行離線備份操作,在備份命令中指定備份選項

RMAN> shutdown immediate;
RMAN> startup mount;
RMAN> run {
allocate channel c1 type disk format '/xxx/ming_%U';
allocate channel c2 type disk format '/xxx/ming_%U';
backup full tag full_db_backup format "/backups/db_t%t_s%s_p%p" (database);
backup current controlfile;
release channel c1 ;
release channel c2 ;
}
在這個例子中,我們分配了兩個通道,備份位置是在 /xxx。預設情況下,如果備份資料檔案 1 (SYSTEM 表空間),
控制檔案和引數檔案也會備份。可以透過下面的命令顯示恢復目錄中記載的備份集資訊:
RMAN> list backupset of database;

 
1.1.3.2  全庫備份的恢復
 
$ rman target /
RMAN> startup mount
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
 
1.1.3.3  表空間備份
 
只有 readonly/offline 表空間的備份才有意義。
RMAN> run {
2> allocate channel dev1 type disk;
3> backup
4> tag tbs_users_read_only
5> format "/oracle/backups/tbs_users_t%t_s%s"
6> (tablespace users);
7> }
 
使用下列命令來顯示恢復目錄中該表的備份資訊:
RMAN> list backupset of tablespace users;
 
1.1.3.4  表空間備份的恢復
 
RMAN> RUN{
sql "alter tablespace xx offline immediate;"
restore tablespace xx;
recover tablespace xx; 
sql "alter tablespace xx online;"
}
 
1.1.3.5  備份控制檔案
 
RMAN> run {
2> allocate channel dev1 type "SBT_TAPE";
3> backup
4> format "cf_t%t_s%s_p%p"
5> tag cf_monday_night
6> (current controlfile);
7> release channel dev1;
8> }
 
注:資料庫完全備份將自動備份控制檔案。(或者備份時加 include current controlfile)
 
1.1.4  歸檔模式下的 BACKUP 備份與完全恢復
 
要用 RMAN 進行聯機備份操作,資料庫就必須位於 ARCHIVELOG 模式。
恢復目錄必須開啟,目標資料庫例程必須啟動,資料庫載入或者開啟。

這部分只介紹完全恢復。

1.1.4.1  整庫備份與恢復備份命令:

只備份資料檔案(如果 configure controlfile autobackup on;  將自動包括控制元件檔案,SPFILE):
RMAN> backup database;

同時備份歸檔日誌,然後將備份後的歸檔日誌刪除

RMAN> backup database plus archivelog delete input;

明確指定同時備份控制元件檔案:

RMAN> run{
allocate channel c1 type disk;
sql 'alter system archive log current';
backup full database include current controlfile tag 'dbfull'
format '/u06/oracle/rmanback/full_%u_%s_%p';
sql 'alter system archive log current';
release channel c1;
}
 
可以用 RMAN的 plus archvielog 選項簡化資料庫備份:
RMAN> run {
2> backup database
3> format '/xxfull%d_%T_%s'
4> plus archivelog
5> format '/xx/arch_%d_%T_%s'
6> delete all input;
7> }
 
完全恢復:

目標資料庫必須是 mount狀態

$ rman target /
RMAN> startup mount
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open;
 
1.1.4.3  表空間的備份與恢復
 
備份命令:
RMAN> backup tablespace users ;
例:
RMAN> RUN{
allocate channel c1 type disk;
backup tablespace users tag 'ts_users' format '/oracle/rmanback/ts_%u_%s_%p' ;
release channel c1;
}
 
恢復:
如果我們只丟失了特定的表空間的資料檔案,那麼我們可以選擇只恢復這個表空間,而不是恢復整個資料庫。
表空間恢復可以在不關閉資料庫的情況下進行,只需要將需要恢復的 表空間 offline。

RMAN> RUN{
sql "alter tablespace xx offlineimmediate;"
restore tablespace xx;
recover tablespace xx;
sql "alter tablespace xx online;"
}
 
恢復到一個不同的位置:
RMAN> RUN{
sql "alter tablespace xx offline immediate;"
SET NEWNAME for datafile 1 to '/xx';
restore tablespace xx;
switch datafile 1;
recover tablespace xx;
sql "alter tablespace tbs1 online;"
}
 
1.1.4.3  資料檔案的備份與恢復
 
備份命令:
RMAN> backup datafile 3;
RMAN> backup datafile 'D:\ORAC LE\ORADATA\TEST\TEST.DB';
 
恢復命令:
資料檔案恢復與表空間恢復類似。假設資料檔案號為5 的檔案丟失,檔名是:
'E:\ORACLE\ORADATA\USERS.DBF',那麼我們恢復的時候可以指定檔案號,也可以指定檔名。
RMAN> run {
allocate channel dev1 type disk;
sql "alter tablespace users offline immediate";
restore datafile 4;    --或者 restore 'E:\ORACLE\ORADATA\USERS.DBF'
recover datafile 4;
sql "alter tablespace users online";
release channel dev1;
}
 
恢復到一個不同的位置:
$ rman target /
RMAN> startup mount
RMAN> RUN{
sql "alter tablespace users offline immediate";
SET NEWNAME for datafile 9 to '/xx/user01.dbf';
restore datafile 9;
switch datafile all;
recover datafile 9;
sql "alter tablespace users online";
}
 
1.1.4.4  歸檔重做日誌的備份與恢復
 
備份:
整庫備份的同時,備份所有歸檔  (以及聯機日誌):
RMAN> backup database plus archivelog;

備份所有歸檔:

RMAN> backup archivelog all;

備份兩天來的歸檔:

RMAN> backup archivelog from time='sysdate-2' [to time=’xxx’] ;

備份從 sequence 1 開始的歸檔:

RMAN> backup archivelog from sequence 1[to sequence =’n];

備份沒有三次備份的歸檔:

RMAN> backup archivelog not backed up 3 times;

備份所有歸檔,然後刪除歸檔:

RMAN> backup archivelog all delete input;

恢復:

顯示恢復目錄中的歸檔日誌:
RMAN> list backupset of archivelog all;

一般情況下,在 RMAN 的普通恢復過程中,不必恢復歸檔的重做日誌。
不過偶爾也需 要恢復重做日誌,例如我們用 Log Miner 來從歸檔中查詢一些東西。

RMAN命令舉例:
RMAN> RESTORE ARCHIVELOG ALL;
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1UNTIL LOGSEQ=20;
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1;

 
可以用  SET命令來指定歸檔日誌的還原位置,
例如:

RMAN> run{
set archivelog destination to "d:\temp";
restore archivelog all;
}
需要注意的是,即使新的歸檔日誌目錄不同於預設的歸檔日誌目錄,
如果 Oracle 判定
日誌已存在,也不會恢復該歸檔日誌檔案。
 
1.1.4.5  聯機日誌的備份
 
聯機日誌不能用 RMAN 來備份,可以先將其歸檔,再備份。
為了實現這點,必須在 RMAN
中執行歸檔命令語句:
RMAN> run {
allocate channel dev1 type disk;
sql "alter system archive log current";
backup (archivelog from time "sysdate-1" all delete input)
"format "/oracle/backups/log_t%t_s%s_p%p";
release channel dev1;
}

上面的指令碼可以在執行完一個完整的聯機資料庫備份後執行,確保所有的重做日誌可以
將資料庫恢復到一個一致性的狀態。
當然,也可以在全庫備份時使用 plus archvielog 選項,將自動完成聯機日誌的備份。

1.1.4.6  控制檔案和伺服器引數檔案的備份與恢復備份:

RMAN> set controlfile autobackup format for device t ype disk to 'ctl_%F';   // 設定檔名格式
1. RMAN> configure controlfile autobackup on;    // backup database 時將自動備份
2. RMAN> backup current controlfile;
3. RMAN> backup .... include control file;
4. RMAN> backup file 1;     // system datafile 自動備份
 
恢復SPFILE:
SPFILE(PFILE)的丟失/損壞,對資料庫不會產生致命影響,可以從其他方式恢復。
不過既然RMAN的備份計劃中包括了SPFILE的備份,那麼就可以使用 RMAN 來還原 SPFILE了。

$ rman target / catalog "rman/rman@db"
RMAN> set dbid=153910023;   // SET DBID 這個步驟是不能省略的,否則會報錯。
RMAN> restore spfile from autobackup [MAXDAYS 100];   //  或者 restore spfile;
RMAN> startup force


或者從某個備份集恢復:

RMAN> restore spfile from backupset bs_num 命令。

使用 dbms_backup_restore 包恢復伺服器引數檔案:

在一些不常見的情況下,我們可能需要直接使用 dbms_backup_restore 包來恢復 spfile。
當然這個包也可以用來恢復其它資料,是常規辦法都沒有用的時候的一個利器。
這個包可以在資料庫 NOMOUNT 狀態下使用。
假設我們有一個自動備份檔案
C-2600315304-20060829-02,我們需要從這裡恢復資料,那麼可以透過執行下面的指令碼來完成:
SQL>
DECLARE
DEVTYPE VARCHAR2(256);
DONE BOOLEAN;
BEGIN
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorespfileto('/back/SPFILE.ORA');
DBMS_BACKUP_RESTORE.restorebackuppiece(
'/back/C-2600315304-20060829-02',DONE=>done);
DBMS_BACKUP_RESTORE.devicedeallocate(NULL);
END;
 
恢復控制檔案:
RMAN> startup nomount;
RMAN> set dbid=153910023

RMAN> restore controlfile from autobackup

RMAN> restore controlfile from'/arch/ct_c-2347671489-20060630-00';

聯機狀態:目標資料庫 MOUNT 或 OPEN

RMAN> restore controlfile to 'd:\temp\control01.ctl';
 
然後再執行恢復資料庫的其他步驟:
RMAN> restore database;
RMAN> recover database;

RMAN> alter database open resetlogs;
 
使用  dbms_backup_restore 包恢復控制檔案:
 
SQL>
DECLARE
DEVTYPE VARCHAR2(256);
DONE BOOLEAN;
BEGIN
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);
DBMS_BACKUP_RESTORE.restoresetdatafile;
DBMS_BACKUP_RESTORE.restorecontrolfileto('/back/CONTROL01.CTL');
DBMS_BACKUP_RESTORE.restorebackuppiece
('/back/C-2600315304-20060829-00',DONE=>done);
DBMS_BACKUP_RESTORE.devicedeallocate(NULL);
END;
/

1.1.4.7  備份集的備份的備份與恢復
 
備份:
備份所有備份集:
RMAN> backup backupset all;

備份指定備份集:

RMAN> backup backupset bs_num;

恢復:(這種備份只是增加一個映象,不用恢復)

主要用於改變備份集的位置,或者建立多個映象備份,比如將備份集從硬碟備份到磁帶。
 
1.1.5  歸檔模式下的不完全恢復
 
不完全恢復就意味著有資料的丟失。引起不完全恢復的原因有很多,如丟失了聯機日誌或某個歸檔日誌。
另外如果出現了嚴重損害資料庫的使用者錯誤,比如某使用者錯誤的刪除了某 個重要的資料,那麼資料庫也要恢復到這個錯誤操作之前。

不完全恢復會影響整個資料庫,需要在 MOUNT 狀態下進行。在不完全恢復完成之後,通常需要使用 resetlogs 選項來開啟資料庫。resetlogs  表示一個資料庫邏輯生存期的結束和 另一個資料庫邏輯生存期的開始。
資料庫的邏輯生存期也被稱為一個對應(incarnation)。
每次使用 resetlogs 選項來開啟資料庫後都會建立一個新的資料庫對應物,這對於恢復操作來說非常重要。
每次使用 resetlogs 後,SCN計數器不會被重置,但是 Oracle會重置聯機日 志序列號,同時還會重置聯機重做日誌內容。
因此執行了  resetlogs  之後,應該立即重新備份整個資料庫,否則恢復起來相當麻煩。
(注:Oracle 10g 中已經可以在  resetlogs 之後不備 份資料庫,恢復的時候能夠穿越 resetlogs)

使用  RMAN  執行不完全恢復操作時需要完成的一個工作是建立恢復目標。
恢復目標是
要終止恢復程式的點,可以是時間點、指定的 SCN 或者一個日誌序列號。
我們可以在  run 
程式碼中使用 set  命令和 until time、until scn、until sequence 引數。
也可以選擇在 RESTORE 和 RECOVER命令中直接使用 UNTIL TIME、UNTIL SCN、或者 UNTIL SEQUENCE 引數,
這樣就可以避免使用  run  程式碼。
例如;

startup mount;
restore database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";
recover database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";
alter database open resetlogs;

 
1.1.5.1  基於SCN的恢復
 
如果知道資料庫出錯前的 SCN,可以將資料庫還原到指定 SCN 狀態。
 $ startup mount;
RMAN> run{
allocate channel d1 type disk;
restore database until scn 1317011;      --或者 set until scn 1317011
recover database until scn 1317011;
sql 'alter database open resetlogs';
release channel d1;
}

1.1.5.2  基於時間的恢復

 
下面使用 set until time命令為2015年5月10日下午20點的恢復目標:
$ startup mount;
 
RMAN> run{
set until time "to_date('2015/05/10 20:00:00','yyyy/mm/dd hh24:mi:ss')";
restore database;
recover database;
alter database open resetlogs;
}
 
執行上面的命令時, RMAN  會查詢與恢復目標時間最近,但是不包含恢復目標時間及以後時間的備份集,
並且從這個備份中還原資料庫。如果資料庫非歸檔模式,那麼恢復操作 會在備份集的時間點停止;
否則  RECOVER  命令會應用恢復目標之前的歸檔重做日誌或需 要的增量備份。

 
1.1.5.3  基於日誌序列的恢復
 
RMAN  允許使用者將資料庫恢復到指定的歸檔重做日誌序列號。
如果歸檔的重做日誌中有間隙(某個歸檔日誌檔案或備份損壞或丟失),使用這種方法就很方便。
間隙通常意味 著我們只能將資料庫還原到間隙開始的地方。

SQL> startup mount;
RMAN> restore database until sequence 100 thread 1;    --not include 100
RMAN> recover database until sequence 100 thread 1; 
SQL> alter database open resetlogs;
RMAN> RUN {
SET UNTIL SEQUENCE 120 THREAD 1;
RESTORE DATABASE;
RECOVER DATABASE;    --recovers through log 119 not include 120
ALTER DATABASE OPEN RESESTLOGS;
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30496894/viewspace-1806061/,如需轉載,請註明出處,否則將追究法律責任。

相關文章