Oracle中使用RMAN備份及一些恢復方法
使用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;
}
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 10g RMAN備份及恢復Oracle 10g
- oracle RMAN 備份恢復總結Oracle
- oracle RMAN 備份恢復總結Oracle
- oracle rman備份恢復的例子Oracle
- Oracle9i RMAN備份及恢復步驟Oracle
- Oracle備份恢復之熱備份恢復及異機恢復Oracle
- ORACLE DG從庫 Rman備份恢復Oracle
- Oracle9i RMAN備份及恢復步驟(zt)Oracle
- RMAN備份恢復原理
- rman備份恢復-rman入門
- Oracle9i RMAN 的優缺點及RMAN 備份及恢復步驟Oracle
- Oracle 備份恢復篇之RMAN catalogOracle
- Oracle塊損壞恢復(有rman備份)Oracle
- [記錄]oracle RMAN 備份恢復總結Oracle
- Oracle 11G 備份與恢復 使用RMAN建立備份集舉例Oracle
- RMAN備份與恢復之加密備份加密
- 12 使用RMAN備份和恢復檔案
- Oracle的RMAN備份恢復繼續,RMAN部分引數Oracle
- Oracle備份恢復的一些概念Oracle
- docker 中 MySQL 備份及恢復DockerMySql
- Oracle DG從庫 Rman備份恢復測試Oracle
- 【RMAN】Oracle11g備份恢復新特性Oracle
- Oracle資料庫備份與恢復之RMANOracle資料庫
- oracle實驗記錄 (恢復-rman增量備份)Oracle
- oracle rman備份驗證和備份/恢復進度監控Oracle
- rman備份恢復-rman恢復資料檔案測試
- Oracle資料庫的冷備份及冷備份異地恢復方法Oracle資料庫
- RMAN備份恢復典型案例——RMAN備份&系統變慢
- 備份&恢復系列之三:在linux中對oracle用rman指令碼備份!LinuxOracle指令碼
- RMAN備份恢復效能優化優化
- rman備份恢復命令之switch
- RMAN備份恢復整個庫
- Linux下Oracle9i RMAN備份及恢復步驟(轉)LinuxOracle
- oracle 10.2.0.1 win 32 rman 備份異機恢復Oracle
- RMAN說,我能備份(12)--RMAN中的恢復目錄和備份優化優化
- RMAN備份恢復——備份到帶庫的效能
- 循序漸進oracle第7章:備份與恢復之RMAN的簡單備份與恢復Oracle
- 【RMAN】Oracle12c以後rman 備份恢復命令參考Oracle