您好,登錄后才能下訂單哦!
官方定義RMAN:
首先RMAN是一個與Oracle數據庫集成的程序相當于數據庫的一個功能不需要被單獨安裝。
RMAN的最小單位是文件,也就是說他是針對文件進行備份而不可以是某個表。
RMAN的連接方式:
1)本地連接:
[oracle@server1 app]$ echo $ORACLE_SID
proe
[oracle@server1 app]$ rman target /
Recovery Manager: Release 11.2.0.4.0 - Production on Tue Jul 7 16:48:27 2020
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: PROE (DBID=485315595)
RMAN>
2)網絡連接:
[oracle@server1 ~]$ rman target sys/oracle@192.168.0.50:1521/server1
3)服務名連接:
[oracle@server1 ~]$ rman target sys/oracle@proe
1)backupset:備份集,只針對數據進行備份。
-compress buckupset,壓縮備份集,只將備份目標文件中的數據部分抽取出來,不包含數據的地方跳過。
備份集:備份集是邏輯上的,它是所有備份片的集合,備份片才是物理上的,piece handle。
2)image copy:鏡像拷貝,和原數據完全一樣包括結構,可以讓備份文件直接代替原文件。
測試這幾種類別最終的大小:
鏡像拷貝:
RMAN> backup as copy tablespace example format '/u01/app/backup/example_copy_%T';
Starting backup at 07-JUL-20
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00005 name=/u01/app/oracle/oradata/proe/example01.dbf
output file name=/u01/app/backup/example_copy_20200707 tag=TAG20200707T171203 RECID=3 STAMP=1045156330
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07
Finished backup at 07-JUL-20
備份集:
RMAN> backup as backupset tablespace example format '/u01/app/backup/example_bs_%T';
Starting backup at 07-JUL-20
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00005 name=/u01/app/oracle/oradata/proe/example01.dbf
channel ORA_DISK_1: starting piece 1 at 07-JUL-20
channel ORA_DISK_1: finished piece 1 at 07-JUL-20
piece handle=/u01/app/backup/example_bs_20200707 tag=TAG20200707T171524 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 07-JUL-20
不加 as backupset也可以,默認就是這個。
壓縮備份集:
RMAN> backup as compressed backupset tablespace example format '/u01/app/backup/example_c_bs_%T';
Starting backup at 07-JUL-20
using channel ORA_DISK_1
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00005 name=/u01/app/oracle/oradata/proe/example01.dbf
channel ORA_DISK_1: starting piece 1 at 07-JUL-20
channel ORA_DISK_1: finished piece 1 at 07-JUL-20
piece handle=/u01/app/backup/example_c_bs_20200707 tag=TAG20200707T171834 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 07-JUL-20
查看一下這3個備份的大小:
還是有一些差距的。
查看備份:
備份集:
鏡像備份:
注意:如果這個備份文件已經在系統層面刪除了,在這里還是會存在。
這樣再查看就不會存在了:
SYS@proe>select * from v$rman_backup_type;
WEIGHT INPUT_TYPE
---------- -------------
1 BACKUPSET 備份集
2 SPFILE spfile
3 CONTROLFILE 控制文件
4 ARCHIVELOG 歸檔日志文件
5 DATAFILE INCR 數據文件增量備份
6 DATAFILE FULL 數據文件全量備份
7 DB INCR 整庫增量備份
8 RECVR AREA 閃回區備份
9 DB FULL 數據庫全備(0級)
9 rows selected
參數文件的備份與恢復:
Oracle中參數文件按照是否可以直接修改分為了動態參數文件和靜態參數文件,動態參數文件是二進制的無法直接修改也就是spfile是可以通過RMAN進行備份的,靜態參數文件pfile只能通過物理備份copy的形式來做。
如上,命令和最終備份片的位置。
模擬參數文件丟失場景:
將spfile文件修改名字模擬spfile損壞(pfile,spfile有一個就可以啟動數據庫所以都要改一下):
然后啟動就會報錯,
通過RMAN進行恢復:
啟動偽實例(僅用于參數文件恢復)
再重新查看發現文件已經生成:
控制文件備份與恢復:
控制文件進行備份:
查看關于控制文件的備份信息:
整體恢復方式和參數文件恢復類似,但是由于控制文件中記錄著數據庫的變化所以在恢復之前一定要更新SCN號,使用recover。
RMAN> alter database open resetlogs;
使用resetlogs的原因是recover命令只能修復控制文件中數據庫物理結構信息,而無法修改控制文件中的當前重做日志的
序列號等信息,recover命令執行完畢后,控制文件中當前在線日志序列號仍然是陳舊的。雖然使用了resetlogs,但是因
為recover database命令成功執行已提交的事務不會丟失,resetlogs僅僅是為了照顧還原的控制文件,與不完全恢復的
resetlogs是不同的。
1)備份系統表空間system:
對system表空間下的表做一些操作:
切換幾次日志:
模擬系統表空間文件損壞:
此時系統出現問題崩潰:
從下面的圖片來看,系統表空間文件是關鍵性的系統數據文件,一旦損壞數據庫可以啟動到mount狀態但是無法打開。也就是說這個時候元數據信息是可以看到的因為已經mount數據庫了。
接下來進行RMAN恢復。
查看關于系統表空間的備份信息:
還原system表空間:
修復system表空間:
啟動即可:
再次查看表信息:
備份后刪除的表不存在了,說明表空間恢復并不涉及表空間下的表。表仍需單獨備份。
查看數據文件信息:
已經恢復。
2)非關鍵性數據文件:
模擬普通數據文件損壞如何通過RMAN備份進行恢復。
首先創建模擬需要的表:testtable,testtable2并相應的插入一些數據。
可以看到在TEST_1這個表空間下存在兩個測試用的表。
對這個表空間進行RMAN備份
查看RMAN備份信息可以看到備份已經成功。
備份已經完成,接下來對這個表空間里面的表進行一些操作使其內容發生一些變化。我們插入一些數據。
然后我們需要將這個表空間的表的數據文件進行破壞掉。
首先查找這個表空間的數據文件在哪里。
確定文件位置后進行模擬刪除。建議使用cp復制模擬刪除。
數據文件模擬刪除后,需要把數據庫緩存刷新掉,把內存緩沖區數據寫回到數據文件,然后ckpt進程就會發現錯誤,實例從而崩潰。
此時查看數據庫的狀態:
為打開狀態未崩潰,說明此時數據文件已經同步想要從數據文件讀數據到緩沖區時才發現文件錯誤,并不會導致實例崩潰。
進入RMAN恢復階段
此時實例未崩潰所以需要將這個表空間先做離線處理。注意immediate直接離線避免臟塊寫入。
進行表空間還原操作:
而后進行表空間修復:
最后將表空間置于在線即可。
查看表數據可以看到后期插入的數據也已經還原。
另外一種情況就是,當數據文件損壞時實例直接崩潰,失去連接。重新連接并啟動,只能將數據庫啟動到mount狀態。這個時候直接進入RMAN進行上述表空間還原操作和表空間修復操作即可。然后將數據庫open。
這里出現一些問題,表因為主鍵被其他表的外鍵所引用所以無法進行truncate操作,解決辦法就是,讓這個表主鍵臨時失效,執行完再重新使其生效。
HR@proe>truncate table HR.employees;
truncate table HR.employees
*
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys
HR@proe>alter table employees disable primary key cascade;
Table altered.
HR@proe>HR@proe>truncate table employees;
Table truncated.
HR@proe>alter table employees enable primary key;
Table altered.
執行完誤操作此時表是這個狀態:
接下來通過RMAN進行不完全恢復操作,重新獲取正確的數據:
使用RMAN進行一致性關庫:
在RMAN中啟動數據庫到mount狀態:
還原數據庫:
修復數據庫到指定的SCN:
這個時候查詢這個數據庫:
因為此時數據庫還是處于mount狀態但是不可以直接open需要執行resetlogs。因為不完全恢復的日志并不是連續的所以需要將日志重置。
在RMAN中修改數據庫的狀態使其啟動:
重新查詢這個表的信息可以看到已經恢復:
模擬過程:
開始備份:
1)確定當前數據庫的狀態:(需要處于open狀態)
2)進入RMAN開始備份:
RMAN> sql'alter system archive log current';
sql statement: alter system archive log current
## 這里額外說明一下'alter system archive log current'和'alter system switch logfile'的區別。從表面來看,前者會對數據庫中所有實例執行日志切換,后者只會針對單實例數據庫或者RAC中的當前實例進行日志切換。所以在RAC中進行日志切換時往往會使用前者。更深層次的來看,前者需要數據庫開啟歸檔,不開啟歸檔的話需要指定到具體的日志組才行并且這個日志組不可以是當前日志組。同時這個命令中的current是指當前的日志組,所以在歸檔之前一定會先切換日志,所以這個命令伴隨著日志組的切換。而后者主要針對的是日志組與是否開啟歸檔無關,主要作用就是強制切換日志組。如果開啟了歸檔發生了日志組的切換那么必然會發生歸檔,如果沒開啟數據庫歸檔那么歸檔肯定不能發生但是日志組還是會被強制切換。
RMAN> crosscheck archivelog all;#校驗控制文件和實際物理文件差別。這個命令和下面的命令往往一起使用,單純的校驗并不會影響最終備份的結果。
released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
...
archived log file name=/u01/app/oracle/fast_recovery_area/PROE/archivelog/2020_07_13/o1_mf_1_1_hjr1nnno_.arc RECID=50 STAMP=1045666836
Crosschecked 12 objects
RMAN> delete expired archivelog all;#進行控制文件和物理文件同步,關于這兩個RMAN管理維護命令以后會繼續細講。
released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=572 device type=DISK
specification does not match any archived log in the repository
RMAN> sql'alter system switch logfile';#強制切換日志。
sql statement: alter system switch logfile
備份數據文件:
關于plus archivelog,這個命令會讓RMAN首先備份歸檔日志,然后切換當前的在線日志并歸檔這個日志,然后再把最新的歸檔日志進行備份。
備份參數文件:
備份控制文件:
注意:
如果在使用db_recovery_file_dest作為備份文件生成的路徑情況下,生成備份文件的副本那么將產生ORA-19806錯誤。
RMAN-03009: failure of backup command on ORA_DISK_1 channel
ORA-19806: cannot make duplex backups in recovery area
解決方式,將備份路徑指定為非db_recovery_files_dest的目錄
RMAN> backup tablespace users format ‘/home/oracle/%U.dbf’;
開始恢復:
查看當前備份路徑下有哪些文件:
可以看到進行數據文件備份時生成了兩個文件,所以這也是為什么命名后綴為%U的原因,因為在進行數據庫全備的時候,控制文件會自動備份當前數據庫的控制文件和參數文件也就是上面較小的database文件,如果名稱重復則會在這里報錯。
1)首先恢復參數文件。
查看當前用戶的SID。
進入RMAN,啟動偽實例數據庫到nomount狀態后恢復參數文件。
這里可能會出現了一個報錯,具體原因查看
https://www.cnblogs.com/plutozzl/p/13293789.html
參數文件恢復成功,關閉偽實例重新啟動到nomount狀態。
可以看到沒有報錯了。
2)恢復控制文件:
此時數據庫處于nomount狀態。mount會報錯
所以仍然需要恢復控制文件:
恢復成功,這個時候可以將數據庫mount并查看備份信息。
3)恢復數據文件:
還原數據庫:
修復數據庫:
4)整庫恢復完成打開數據庫即可:
這里還是需要加上resetlogs參數的,因為控制文件也是恢復而來的所以日志需要重置。
恢復成功:
這種方式可以用來進行數據庫的遷移,但是如果在一個新庫中恢復RMAN備份的路徑必須一致。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。