五、rman删除
delete指令
删除相關的備份集或鏡像副本的實體檔案,同時将删除标記delete更新到控制檔案,如果使用恢複目錄,則是清除恢複目錄内的備份集。
delete (archivelog, backuppiece, backupset, backup, controlfilecopy, copy, datafilecopy, expired, force,
foreign, global, noprompt, obsolete, proxy, script)
rman> delete backupset;
rman> delete backupset n;
rman> delete obsolete ;
rman> delete obsolete redundancy 2;
rman> delete noprompt copy;
rman> delete noprompt backupset tag tag20101016t143521; --prompt 提示 ->noprompt 不提示
rman> delete obsolete recovery window of 7 days;
rman> delete expired backupset;
rman> delete expired copy;
rman> delete expired archivelog all;
rman> delete archivelog until time 'sysdate-5';
舉例:
rman> delete backupset 17;
rman> delete backupset tag tinadb1218_0;
using channel ora_disk_1
list of backup pieces
bp key bs key pc# cp# status device type piece name
------- ------- --- --- ----------- ----------- ----------
20 20 1 1 available disk /orabak/db_0_tinadb_0mqp4b88_1_1
23 23 1 1 available disk /orabak/db_0_tinadb_0pqp4bou_1_1
do you really want to delete the above objects (enter yes or no)? ---需要輸入yes确認
rman> delete noprompt backupset tag tinadb1218_0; ---不确認直接删除
六、rman恢複
1)恢複spfile
rman>restore spfile to '/u01/oracle/testspfile.ora' from autobackup;
rman>restore spfile from '/u01/oracle/tinadb/autobackup/2015_12_17/o1_mf_s_898707140_c74xy47h_.bkp'
2)恢複control file
rman> set dbid=1669126943
rman> restore controlfile to '/u01/oradata/tinadb/control01.ctl' from autobackup;
rman> restore controlfile from autobackup until time "to_date('2015-12-18 15:00:00','yyyy/mm/dd hh24:mi:ss')";
---這不是備份時的精确時間,是指這時間點之前最近一次的控制檔案的備份。
3)恢複archive log
restore archivelog 的各種選項
1.恢複全部歸檔日志檔案
rman> restore archivelog all;
2.隻恢複5到8這四個歸檔日志檔案
rman> restore archivelog from logseq 5 until logseq 8;
3.恢複從第5個歸檔日志起
rman> restore archivelog from logseq 5;
4.恢複7天内的歸檔日志
rman> restore archivelog from time 'sysdate-7';
5.sequence between 寫法
rman> restore archivelog sequence between 1 and 3;
6.恢複到哪個日志檔案為止
rman> restore archivelog until logseq 3;
7.從第五個日志開始恢複
rman> restore archivelog low logseq 5;
8.到第5個日志為止
rman> restore archivelog high logseq 5;
4)恢複資料庫
rman> restore database;
rman> recover database until time "to_date('2015-12-18 15:00:00','yyyy-mm-dd hh24:mi:ss')";
七、rman report
report用于判斷資料庫目前可恢複狀态、以及資料庫已有備份的資訊。
最常使用的是report obsolete; report schema;
report {device, need, obsolete, schema, unrecoverable}
report schema;---報告資料庫模式
report obsolete;---報告已丢棄的備份集(配置了保留政策)。
report unrecoverable;---報告目前資料庫中不可恢複的資料檔案(即沒有這個資料檔案的備份、或者該資料檔案的備份已經過期)
report need backup;---報告需要備份的資料檔案(根據條件不同)
report need backup days=3;
--最近三天沒有備份的資料檔案(如果出問題的話,這些資料檔案将需要最近3天的歸檔日志才能恢複)
report need backup incremental=3;
--需要多少個增量備份檔案才能恢複的資料檔案。(如果出問題,這些資料檔案将需要3個增量備份才能恢複)
report need backup redundancy=3;
--報告出備援次數小于3的資料檔案
--例如資料檔案中包含2個資料檔案system01.dbf和users01.dbf.
--在3次或都3次以上備份中都包含system01.dbf這個資料檔案,而users01.dbf則小于3次
--那麼,報告出來的資料檔案就是users01.dbf
--即,報告出資料庫中備援次數小于 n 的資料檔案
report need backup recovery window of 2 days;
--報告出恢複需要2天歸檔日志的資料檔案
八、crosscheck指令
用于檢驗存儲倉庫中的備份集或鏡像副本,執行改指令後,将更新存儲倉庫中的剛剛校驗的對象狀态,便于後續操作處理。
rman備份校驗是的幾種狀态:
expired:對象不存在于磁盤或錄音帶。當一個備份集處于expired狀态,則該備份集中所有的備份片同樣處于expired狀态。
available:對象處于可用狀态。當一個備份集可用,則改備份集内的所有備份片同樣可用。
unavailable:對象處于不可用狀态。當一個備份可不用,則改備份集内的所有備份片同樣不可用
rman> crosscheck backupset;
rman> crosscheck copy;
rman> crosscheck backup of controlfile;
rman> crosscheck backup of archivelog all;
rman> crosscheck backup of datafile 1,2;
rman> crosscheck backup of tablespace sysaux,system;
rman> crosscheck backup completed between '13-oct-10' and '23-oct-10';
rman> crosscheck backupset 1067,1068;
九、validate指令
驗證一個備份集内的資料的完整性。rman掃描備份集得所有備份片,并檢查校驗和,驗證其内容是否可以成功還原,
validate是較crosscheck更高一級的驗證操作,crosscheck僅僅是檢查備份集的頭部資訊,檢驗檔案的存在性,validate驗證資料的有效性。
rman> validate backupset <primary key> [check logical]
十、change
1、改變備份集狀态
可用change backupset .. unavailable/available 來改變一個備份集的狀态。
rman>change backupset 22 unavailable
2、改變映像副本狀态
資料檔案:change datafilecopy .. available/unavailable
控制檔案:change controlfilecopy .. available/unavailable
歸檔日志:change archivelog .. available/unavailable
例如:
rman>change datafilecopy 'd:\backup\demo_37.bak' unavailable;
3、建立長期備份
長期備份是指被長期保留的備份檔案,使用長期備份的目的是為了可以将資料庫恢複到過去的特定時間點。當社頂了長期備份之後,rman會從裝置備援政策中
免除該備份檔案,也就是說,長期備份檔案不會被标記為陳舊備份。
指令:change .. keep/nokeep
(1)使備份集156永久保留
rman>change backupset 156 keep forever logs;
(2)使備份集198保留60天
rman>change backupset 198 keep until time 'sysdate+60' logs;
(3)免除備份集156的保留期限
rman>change backupset 156 nokeep
十一、常在run塊中運作的指令
1)給資料檔案指定新的路徑和名稱,例如:
rman>run {
allocate channel c1 device type disk;
set newname for datafile 4 to 'd:\oracle\bobnew\users01.dbf';
}
2)設定恢複到的時間點或scn,例如:
set until time "to_date('2013-12-27 10:33:05','yyyy-mm-dd hh24:mi:ss') ";
...
3)定義備份片段的備援數:
set backup copies 3;
...
4)指定resetore/recover指令産生的歸檔檔案的存儲路徑,預設情況下歸檔檔案會在log_archive_dest_1指定路徑下,如果通過
set archivelog destination to指定後,則歸檔檔案産生與set指定的路徑下
set archivelog destination to '新路徑';
十二、如何正确地删除archivelog:
archivelog并不能直接得從os層直接實體删除,因為archivelog的相關資訊是記錄在controlfile中的,
當實體删除後不會改變controlfile的設定。并且在查詢相關的動态視圖(例如v$archived_log)時,該部分日志仍然标注為存在。
也就是說oracle并不認為這些日志被删除了,是以在删除archivelog的時候,需要我們在其他地方做一些設定。
1)使用rman清楚實體删除後的記錄
可以使用rman來删除archivelog,具體可以按以下步驟操作:
1、實體删除archivelog
2、進入rman
3、crosscheck archivelog all;
4、delete expried archivelog all;
這樣就在一些oracle的記錄中查不到相應的archivelog記錄了。
2)直接使用rman删除archivelog
其實在rman中是可以使用指令直接将archivelog删除的,指令如下:
rman> delete archivelog all completed before 'sysdate-7';
表示删除7天以前的所有archivelog,但是這個指令的缺點是無法對archivelog進行細緻的劃分。
3)删除n天以前的歸檔日志,有兩個指令:
delete archivelog until time 'sysdate-n'
delete archivelog all completed before 'sysdate-n'
差別已經很明顯:
list archivelog until time 'sysdate-1'; 此時是按照歸檔日志開始時間即fisrt_time作為截止時間
list archivelog all completed before 'sysdate-1' 是按照歸檔日志完成時間即completion_time作為截止時間
試想如果删除歸檔日志,還是采用delete archivelog all completed before 'sysdate-n'
十三、備份相關的動态性能視圖及監控
1.相關視圖
v$backup_files
v$backup_set
v$backup_piece
v$backup_redolog
v$backup_spfile
v$backup_device
v$rman_configuration
v$archived_log
v$backup_corruption
v$copy_corruption
v$database_block_corruption
v$backup_datafile
2.檢視rman完整的進度
sql> select sid,serial#,context,sofar,totalwork,
2 round(sofar/totalwork*100,2) "% complete"
3 from v$session_longops
4 where opname like 'rman:%'
5 and opname not like 'rman:aggregate%'
6 and totalwork!=0;
3.通過如下sql獲得rman用來完成備份操作的服務程序的sid與spid資訊:
select sid, spid, client_info
from v$process p, v$session s
where p.addr = s.paddr
and client_info like '%id=rman%'
十四、oracle10g 中rman的增強功能catalog start with---将備份集注冊到控制檔案
rman> catalog start with '/orabak/tinadb';
通過注冊的形式,可以讓db讀取到我們的備份集,也可通過此方式異地進行備份集恢複。
常見報錯:rman-08137: warning: archive log not deleted as it is still need
archived log file name=+fra_dg/omsdb/archivelog/2013_12_31/thread_1_seq_78149.4167.835588207 thread=1 sequence=78149
rman-08137: warning: archived log not deleted, needed for standby or upstream capture process
archived log file name=+fra_dg/omsdb/archivelog/2013_12_31/thread_1_seq_78150.15705.835589103 thread=1 sequence=78150
archived log file name=+fra_dg/omsdb/archivelog/2013_12_31/thread_1_seq_78151.8949.835590003 thread=1 sequence=78151
發現有個告警資訊,通過檢視備份日志,發現:
released channel: ora_disk_1
released channel: ora_disk_2
piece handle=/ora01/db_bak/9rmqc9u3_1_1 tag=tag20111030t035751 comment=none
channel ora_disk_1: backup set complete, elapsed time: 00:04:57
rman-08137: warning: archive log not deleted as it is still needed
經過研究後确認是由于這個資料庫上配置了oracle stream replication,因為在備份完後進行删除時,
這個歸檔日志還沒有被capture process解析完,是以就不能删除,出這樣的告警。
嘗試删除歸檔日志,oracle提示這些歸檔日志還要用到standby資料庫上面,不讓删除,
這個特點不錯,可以避免由于沒有同步standby而誤删除archivelog的情況。
要删除,需要加上force删除就可以了。
rman> delete noprompt force archivelog all;
這種方法不可取
rman> configure archivelog deletion policy to shipped to standby;
old rman configuration parameters:
configure archivelog deletion policy to shipped to all standby;
new rman configuration parameters:
configure archivelog deletion policy to shipped to standby;
new rman configuration parameters are successfully stored
rman-08591: warning: invalid archived log deletion policy
然後又改回去:
rman> configure archivelog deletion policy to shipped to all standby;
sql> show parameter log_archive
name type value
------------------------------------ ----------- ------------------------------
log_archive_config string dg_config=(omsdb,omsstd)
log_archive_dest string
log_archive_dest_1 string location=use_db_recovery_file_
dest
log_archive_dest_10 string
log_archive_dest_11 string
log_archive_dest_12 string
log_archive_dest_13 string
log_archive_dest_14 string
log_archive_dest_15 string
log_archive_dest_16 string
log_archive_dest_17 string
log_archive_dest_18 string
log_archive_dest_19 string
log_archive_dest_2 string service=cnsz02_omsdb_01 lgwr a
sync noaffirm reopen=60 db_uni
que_name=omsdb
這是因為有一個dg名為omsstd的沒有了,不存在了,all stantdby就會報錯,說還在用,日志不能删
這個log_archive_config 參數一旦設定了,就一定要所有的dg都同樣設定。
應該是可以線上修改的,alter system set log_archive_config='',scope=both;
主備庫都需要修改。