1. 程式人生 > >oracle 12c叢集使用rman備份恢復

oracle 12c叢集使用rman備份恢復

1、資料庫備份

物理備份

熱備:在資料庫開機狀態下進行的備份。

冷備:資料庫關閉的情況下,進行作業系統檔案的拷貝(注意此時關閉資料庫庫必須是按照正常情況關閉的)。

邏輯備份

2、物理熱備

recovery manager(RMAN)

是一個客戶端應用程式,用於資料庫的備份和恢復。rman的體系結構由rman客戶端、目標資料庫、恢復目錄組成。

3、recovery catalog(恢復目錄,rman資料庫)

歸檔日誌的名字記錄在控制檔案中

如果使用恢復目錄,則歸檔日誌的名字記錄在recovery catalog恢復目錄(中)

recovery catalog恢復目錄存放的元資料資訊

1、資料檔案和歸檔日誌檔案的備份集(

backup sets)和備份碎片的資訊。

2、資料檔案副本的資訊

3、歸檔日誌檔案及副本的資訊

4、目標資料庫的表空間和資料檔案的資訊

5、儲存指令碼

6、rman的配置資訊

4、歸檔日誌檔案

1、每個節點都有自己的回滾表空間

2、每個節點都有自己的聯機重做日誌

3、每個節點都有歸檔日誌檔案

5、還原(restore)和恢復(recovery)區別

restore 是使用備份檔案,將資料庫還原到過去的某個狀態,是對備份的資料檔案等的簡單還原。

recovery是應用online redo logs和歸檔日誌將資料庫做向前恢復。

6、熱備的環境準備。

[[email protected]

~]# olsnodes -s

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中,這樣兩個節點產生的歸檔都在一起,對單例項可以同時訪問,這樣我們在一個節點上做歸檔日誌檔案的備份時,可以同時備份兩個節點的歸檔日誌檔案。

驗證資料庫是否起來:


驗證我們測試表中的資料是否回來了:


發現全備之後插入的資料也回來了,恢復成功!

啟動節點一的例項:


檢查叢集資源:



叢集資源沒問題。