oracle 12c叢集使用rman備份恢復
1、資料庫備份
物理備份
熱備:在資料庫開機狀態下進行的備份。
冷備:資料庫關閉的情況下,進行作業系統檔案的拷貝(注意此時關閉資料庫庫必須是按照正常情況關閉的)。
邏輯備份
2、物理熱備
recovery manager(RMAN)
是一個客戶端應用程式,用於資料庫的備份和恢復。rman的體系結構由rman客戶端、目標資料庫、恢復目錄組成。
3、recovery catalog(恢復目錄,rman資料庫)
歸檔日誌的名字記錄在控制檔案中
如果使用恢復目錄,則歸檔日誌的名字記錄在recovery catalog恢復目錄(中)
recovery catalog恢復目錄存放的元資料資訊
1、資料檔案和歸檔日誌檔案的備份集(
2、資料檔案副本的資訊
3、歸檔日誌檔案及副本的資訊
4、目標資料庫的表空間和資料檔案的資訊
5、儲存指令碼
6、rman的配置資訊
4、歸檔日誌檔案
1、每個節點都有自己的回滾表空間
2、每個節點都有自己的聯機重做日誌
3、每個節點都有歸檔日誌檔案
5、還原(restore)和恢復(recovery)區別
restore 是使用備份檔案,將資料庫還原到過去的某個狀態,是對備份的資料檔案等的簡單還原。
recovery是應用online redo logs和歸檔日誌將資料庫做向前恢復。
6、熱備的環境準備。
rac1 Active
rac2 Active
[[email protected] ~]#
兩節點的叢集
設定閃回區的大小:
su - oracle
sqlplus / as sysdba
alter system set db_recovery_file_dest_size=2g scope=both sid=’*’;
設定閃回區的路徑
alter system set db_recovery_file_dest='+DATA' scope=both sid='*';
需要注意閃回區經常會滿,導致資料庫hang住。
在熱備時,要求資料是歸檔狀態,所以下面需要使資料庫在歸檔狀態。
1、關閉資料庫
關閉資料庫,會關閉叢集中的所有例項。
關閉完成後,在叢集中任意一個節點,把資料庫啟動到mount階段
su - oracle
sqlplus / as sysdba
startup mount;
執行開歸檔命令
alter database archivelog;
執行開啟資料庫
alter database open ;
檢視資料庫的狀態
srvctl status database -d tar
驗證資料庫是否是歸檔狀態
sqlplus / as sysdba
select log_mode from v$database ;
archive log list
兩種方式都能驗證是否已經開啟歸檔。
歸檔路徑和歸檔大小都在閃回區,就是我們前面指定的。
下面可以檢視歸檔日誌檔案
set linesize 1000;
column name format a90;
select name,status from v$archived_log ;
測試環境準備好就可以備份資料庫了
首先必須記住資料庫的DBID
select dbid from v$database ;
3086949231
建立測試表
create table cust8(
cust_id number ,
last_name varchar2(30),
first_name varchar2(30)
);
插入4條記錄
insert into cust8(cust_id,last_name,first_name) values(7,’acer’,’scott’);
insert into cust8(cust_id,last_name,first_name) values(5,’stark’,’jim’);
insert into cust8(cust_id,last_name,first_name) values(3,’grey’,’bob’);
insert into cust8(cust_id,last_name,first_name) values(11,’khan’,’brad’);
commit ;
select * from cust8;
剛才插入的資料可能還在聯機日誌裡面,並沒有到資料庫歸檔中去,所以我們執行日誌切換,生成歸檔
alter system switch logfile;
切換日誌後查詢歸檔,發現又多生成了一個歸檔日誌。
現在可以利用rman登入目標資料庫
su - oracle
rman nocatalog target sys/root123
通常我們用超級使用者來做資料庫的備份和恢復
記住我們平時在開始就應該記錄每個資料庫的dbid,不要在資料庫完蛋的時候才想起來沒有dbid。
下面我們開啟備份檔案自動備份功能
configure controlfile autobackup on ;
show all
show snapshot controlfile name;
檢視控制檔案快照的名稱
建立一個目錄存放我們的備份檔案
mkdir /taryartar/12c/db_base/BKDIR
然後我們就可以通過指令碼全備資料庫:
run{
allocate channel t1 type disk Format '/taryartar/12c/db_base/BKDIR/fullBK%s_%p_%t.bak';
set controlfile autobackup format for device type disk to '/taryartar/12c/db_base/BKDIR/c_%F.control';
backup database ;
release channel t1 ;
}
執行資料庫的全備份。
全備完成後,我們在插入四條資料,模擬資料庫全備後資料庫繼續運行了一段時間
insert into cust8(cust_id,last_name,first_name) values(14,’khan’,’after fullbak’);
insert into cust8(cust_id,last_name,first_name) values(15,’khan’,’after fullbak’);
insert into cust8(cust_id,last_name,first_name) values(16,’khan’,’after fullbak’);
commit;
select * from cust8;
日誌切換,生成歸檔
alter system switch logfile;
set linesize 1000;
column name format a60;
select name ,completion_time from v$archived_log;
得到歸檔日誌名字,記錄下來最後一個名字:
SQL> select name ,completion_time from v$archived_log;
NAME COMPLETIO
------------------------------------------------------------ ---------
+DATA/TAR/ARCHIVELOG/2017_12_24/thread_1_seq_22.300.96359306 24-DEC-17
5
+DATA/TAR/ARCHIVELOG/2017_12_24/thread_2_seq_5.301.963604847 24-DEC-17
+DATA/TAR/ARCHIVELOG/2017_12_24/thread_2_seq_6.302.963606783 24-DEC-17
SQL>
在資料庫運行了幾天以後,我們又對歸檔日誌檔案做了備份
backup archivelog all delete all input format '/taryartar/12c/db_base/BKDIR/arch_%s_%p_%t';
這裡我們並沒有備份控制檔案和初始化引數檔案,但是在輸出可以看出,資料庫自動備份了控制檔案和初始化引數檔案
破壞資料庫
先關閉資料庫
srvctl stop database -d tar -o abort
檢視資料庫狀態
srvctl status database -d tar
所有例項都沒運行了。
asmcmd
rm -rf +DATA/tar/AUTOBACKUP/*
rm -rf +DATA/tar/DATAFILE/*
rm -rf +DATA/tar/ONLINELOG/*
rm -rf +DATA/tar/TEMPFILE/*
rm -rf spfiletar.ora
rm -rf +DATA/tar/CONTROLFILE/*
rm -rf *
刪除資料庫
su - grid
asmcmd
rm -r -f +DATA/tar/DATAFILE/*
刪除資料檔案
rm -r -f +DATA/tar/CONTROLFILE/*
資料庫被破壞以後,嘗試啟動資料庫看看
su - oracle
sqlplus / as sysdba
startup
資料庫起不來了。
注意關掉,下面要進行恢復了。
恢復資料庫
rman nocatalog target sys/root123
一定要設定dbid
set dbid 3086949231
這個值是前面已經查詢後記錄下來的。
啟動資料庫到nomount階段
startup nomount ;
啟動到這一步是為了恢復spfile,如果你的spfile沒有被破壞,可以不需要執行這一步,直接啟動到mount階段。
啟動例項後,才能還原spfile:
restore spfile to '+data/tar/PARAMETERFILE/spfiletar.ora' from '/taryartar/12c/db_base/BKDIR/c_c-3086949231-20171224-00.control';
從備份中還原spfile,所以我們要確定上面我們把spfile和控制檔案備份在哪兒了,檔名是是啥。
注意新還原的spfile路徑在你刪除原有spfile檔案的時候,PARAMETERFILE路徑也會一塊被刪掉了,所以主要要驗證你的PARAMETERFILE路徑是否存在。
檢視目標目錄,發現檔案應來了:
下面還原控制檔案
shutdown abort;
startup nomount ;
set dbid 3005509599;
然後從備份中還原控制檔案:
restore controlfile from '/taryartar/12c/db_base/BKDIR/c_c-3086949231-20171224-00.control' ;
然後就可以重啟例項到mount階段了。
shutdown abort;
startup mount ;
下面就可以還原資料庫了:
restore database ;
注意,此處為什麼直接可以執行restore database而不用像上面恢復spfile和控制檔案一樣,需要指定從哪邊的備份檔案恢復呢?
因為此時已經是mount狀態了,控制檔案已經生效了,所以此時就按照控制檔案中的存在的資訊來進行恢復的,而控制檔案是在我們全備的時候備份的,所以裡面已經知道全備的檔案具體路徑了。
還記得嗎?這個地方全備的4個檔案都是在控制檔案中有的。
執行完成以後,控制檔案是全備的時候的控制檔案資訊,這個裡面並不包括我們在全備以後做的歸檔日誌檔案的備份資訊,因此,我們需要把備份集新增(註冊)到catalog中:
list backupset of archivelog all;
catalog backuppiece '/taryartar/12c/db_base/BKDIR/arch_8_1_963606886' ;
list archivelog all;
list backupset of archivelog all;
然後就可以執行資料庫的恢復了
recover database ;
到最後應用歸檔時,到最後會報錯,因為他應用到最後一個歸檔後還會朝後面應用,導致找不到歸檔了,這個錯誤可以忽略。
然後就可以開啟資料庫了:
alter database open resetlogs ;
注意本實驗都在一個節點上做的,注意本實驗的歸檔檔案在共享磁碟+DATA中,這樣兩個節點產生的歸檔都在一起,對單例項可以同時訪問,這樣我們在一個節點上做歸檔日誌檔案的備份時,可以同時備份兩個節點的歸檔日誌檔案。
驗證資料庫是否起來:
驗證我們測試表中的資料是否回來了:
發現全備之後插入的資料也回來了,恢復成功!
啟動節點一的例項:
檢查叢集資源:
叢集資源沒問題。