Oracle資料庫冷備份與熱備份操作梳理

散盡浮華發表於2017-10-20

 

Oracle資料庫的備份方式有冷備份和熱備份兩種,針對這兩種備份的實施過程記錄如下:

一、Oracle冷備份

概念
資料庫在關閉狀態下完成所有物理系統檔案拷貝的過程,也稱離線備份。
適合於非歸檔模式(即noarchivelog模式,SCN保持一致)下,資料庫處於一致性狀態。
冷備份,資料庫可以處於歸檔模式也可以處於非歸檔模式,最好是處於非歸檔模式。

步驟

  • 首先在執行的庫中得到資料庫執行的所有的物理檔案位置,然後在計劃內關閉資料庫(shutdown)
  • 再執行拷貝物理檔案到備份路徑或備份裝置
  • 備份完成後立即啟動資料庫讓其提供正常的服務

冷備份指令碼的寫法
首先應該在相關檢視裡查出資料庫的資料檔案,日誌檔案,控制檔案,臨時檔案所在的位置
注意:不要直接在oradata下進行cp就行了,因為生產庫裡各個檔案通常分佈在不同的磁碟,不同的地方,所以在去檢視裡獲得真實路徑

冷備份操作

1)檢視Oracle資料庫的日誌模式,如果是歸檔模式,將需要將資料庫設定為noarchivelog模式(非歸檔模式),從而進行冷備份。

SQL> archive log list  
Database log mode              No Archive Mode  
Automatic archival             Enabled                     //Enabled表示為歸檔模式
Archive destination            /u01/admin/denver/archdest  
Oldest online log sequence     1  
Current log sequence           1 

SQL> startup mount  
ORACLE instance started.  
Total System Global Area  422670336 bytes  
Fixed Size                  1336960 bytes  
Variable Size             314575232 bytes  
Database Buffers          100663296 bytes  
Redo Buffers                6094848 bytes  
Database mounted.  

SQL>  alter database noarchivelog  
Database altered.  

SQL> archive log list  
Database log mode              No Archive Mode  
Automatic archival             Disabled                   //Disabled表示為非歸檔模式
Archive destination            /u01/admin/denver/archdest  
Oldest online log sequence     1  
Current log sequence           1  

SQL> alter database open;  
Database altered.  

2)檢視例項和資料庫的相關資訊

SQL> select instance_name,version,status,archiver,database_status from v$instance;
 
    INSTANCE_NAME    VERSION           STATUS       ARCHIVE DATABASE_STATUS
    ---------------- ----------------- ------------ ------- -----------------
    orcl             10.2.0.1.0        OPEN         STOPPED ACTIVE
 
SQL> select dbid,name,log_mode from v$database;
 
    DBID NAME      LOG_MODE
    ---------- --------- ------------
    1242732291 ORCL      NOARCHIVELOG

3)檢視資料檔案及狀態資訊

SQL> select file_name,tablespace_name,status,online_status from dba_data_files;
 
    FILE_NAME                                               TABLESPACE STATUS    ONLINE_
    ------------------------------------------------------- ---------- --------- -------
    /u01/app/oracle/oradata/orcl/undotbs01.dbf              UNDOTBS1   AVAILABLE ONLINE
    /u01/app/oracle/oradata/orcl/system01.dbf               SYSTEM     AVAILABLE SYSTEM
    /u01/app/oracle/oradata/orcl/sysaux01.dbf               SYSAUX     AVAILABLE ONLINE
    /u01/app/oracle/oradata/orcl/users01.dbf                USERS      AVAILABLE ONLINE
    /u01/app/oracle/oradata/orcl/example01.dbf              EXAMPLE    AVAILABLE ONLINE
    /u01/app/oracle/oradata/orcl/tbs1_1.dbf                 TBS1       AVAILABLE ONLINE
    /u01/app/oracle/oradata/orcl/tbs1_2.dbf                 TBS1       AVAILABLE ONLINE

4)檢視資料檔案

SQL> select name from v$datafile;
 
    NAME
    --------------------------------------------------------------------------------
    /u01/app/oracle/oradata/orcl/system01.dbf
    /u01/app/oracle/oradata/orcl/undotbs01.dbf
    /u01/app/oracle/oradata/orcl/sysaux01.dbf
    /u01/app/oracle/oradata/orcl/users01.dbf
    /u01/app/oracle/oradata/orcl/example01.dbf
    /u01/app/oracle/oradata/orcl/tbs1_1.dbf
    /u01/app/oracle/oradata/orcl/tbs1_2.dbf

5)檢視臨時檔案

SQL> select name from v$tempfile;
 
    NAME
    --------------------------------------------------------------------------------
    /u01/app/oracle/oradata/orcl/temp01.dbf

6)檢視日誌檔案

SQL> select member from v$logfile;
 
    MEMBER
    ------------------------------------------------------------
    /u01/app/oracle/oradata/orcl/redo2a.rdo
    /u01/app/oracle/oradata/orcl/redo2b.rdo
    /u01/app/oracle/oradata/orcl/redo1a.rdo
    /u01/app/oracle/oradata/orcl/redo3a.rdo
    /u01/app/oracle/oradata/orcl/redo3b.rdo
    /u01/app/oracle/oradata/orcl/redo1b.rdo

7)檢視控制檔案

SQL> select name from v$controlfile;
 
    NAME
    ------------------------------------------------------------
    /u01/app/oracle/oradata/orcl/control01.ctl
    /u01/app/oracle/oradata/orcl/control02.ctl

8)建立備份目錄

SQL> ho mkdir /u01/app/oracle/coolbak

9)使用連線符生成複製檔案命令

SQL> select 'ho cp ' || name || ' /u01/app/oracle/coolbak' from v$controlfile;
 
    'HOCP'||NAME||'/U01/APP/ORACLE/COOLBAK'
    ----------------------------------------------------------------------------------
    ho cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/coolbak
    ho cp /u01/app/oracle/oradata/orcl/control02.ctl /u01/app/oracle/coolbak

將上面的輸入儲存為tmpbak.sql

SQL> save /tmp/tmpbak.sql;   
Created file /tmp/tmpbak.sql

10)編輯tmpbak.sql,將下面的內容輸入到tmpbak.sql

SQL> ho vim /tmp/tmpbak.sql   
    set feedback off
    set heading off
    set verify off
    set trimspool off
    set pagesize 0
    set linesize 200
    define dir = '/u01/app/oracle/coolbak'
    define script = '/tmp/coolbak.sql'
    spool &script
    select 'ho cp ' || name || ' &dir' from v$controlfile
    union all
    select 'ho cp ' || name || ' &dir' from v$datafile
    union all
    select 'ho cp ' || member || ' &dir'  from v$logfile
    union all
    select 'ho cp ' || name || ' &dir' from v$tempfile
    /
    create pfile = '&dir/initorcl.ora' from spfile;
    ho cp /u01/app/oracle/10g/dbs/orapworcl &dir
    spool off
    shutdown immediate
    start &script
    ho rm &script
    startup

執行tmpbak.sql(執行過程及其中的資料庫啟動在此略過)

SQL> @/tmp/tmpbak.sql;

啟動後檢視備份的檔案

SQL> ho ls /u01/app/oracle/coolbak
control01.ctl  orapworcl   redo2b.rdo    system01.dbf   users01.dbf
control02.ctl  redo1a.rdo  redo3a.rdo    tbs1_1.dbf
example01.dbf  redo1b.rdo  redo3b.rdo    tbs1_2.dbf
initorcl.ora   redo2a.rdo  sysaux01.dbf  undotbs01.dbf

冷備份總結

優點

  • 冷備模式下概念易於理解,即將需要備份的檔案複製到安全的位置
  • 操作比較簡單,不需要太多的干預
  • 容易恢復到某個時間點上(只需將檔案再拷貝回去)
  • 能與歸檔方法相結合,作資料庫“最新狀態”的恢復。

缺點

  • 備份時,資料庫必須處於一致性關閉狀態
  • 只能提供到某一時間點的恢復
  • 備份時速度比較慢,尤其是資料量大效能影響比較大
  • 不能實現基於表和使用者級別的資料恢復

二、Oracle熱備份

概念
Oracle 熱備份是指資料庫處於open狀態下,對資料庫的資料檔案、控制檔案、引數檔案、密碼檔案等進行一系列備份操作。
熱備份是基於使用者管理備份恢復的一種方式,也是除了RMAN備份之外較為常用的一種備份方式。
熱備份時,Oracle資料庫必須處於歸檔模式(即archivelog模式,SCN不一致)下。

熱備的過程

  • 凍結塊頭:控制SCN在備份時不發生變化
  • 進行物理拷貝
  • 解凍塊頭:讓SCN可以變化(當對SCN解凍後,系統會自動更新SCN至最新的狀態)

基於資料庫的熱備
alter database begin backup;
拷貝所有的datafile到備份目錄
alter database end backup;

基於表空間的熱備
alter tablespace tablespace_name begin backup;
拷貝tablespace_name表空間的資料檔案到備份目錄
alter tablespace tablespace_name end backup;

當alter tablespace tablespace_name begin backup時完成的任務
檢查點事件發生,檢查點通知DBWn將該表空間上所有的髒資料被寫入到磁碟
在資料檔案頭部凍結當前檢查點事件發生時的SCN號
所有發生變化資料塊的完整映象(修改前後)被寫入到redo log中
允許該表空間內資料的正常讀寫

建議使用基於表空間的熱備,這樣將盡可能的減少對系統效能的影響

控制檔案的熱備
alter database backup controlfile to '<dir>' [reuse];               //控制檔案的完整備份
alter database backup controlfile to trace as '<dir>';            //用於建立控制檔案的語句,丟失了部分資訊
控制檔案發生變化情況
alter database [add |drop] logfile;
alter database [add |drop] logfile member;
alter database [add |drop] logfile group;
alter database [archivelog |noarchivelog];
alter database rename file;
create tablespace;
alter tablespace [add | rename] datafile;
alter tablespace [read write | read only];
drop tablespace;

引數檔案的熱備
create pfile from spfile ;
create pfile = '<dir>' from spfile;

熱備份操作

1)檢視Oracle資料庫的日誌模式,一定要確保是歸檔模式!

SQL> archive log list 
Database log mode              No Archive Mode 
Automatic archival             Disabled                   //Disabled表示為非歸檔模式
Archive destination            /u01/admin/denver/archdest 
Oldest online log sequence     1 
Current log sequence           1 

現在需要設定為歸檔模式
SQL> shutdown immediate
Database cloesd.
Database dismounted.
ORACLE instance shut down.

SQL> startup mount 
ORACLE instance started. 
Total System Global Area  422670336 bytes 
Fixed Size                  1336960 bytes 
Variable Size             314575232 bytes 
Database Buffers          100663296 bytes 
Redo Buffers                6094848 bytes 
Database mounted. 
 
SQL>  alter database archivelog 
Database altered. 

SQL> archive log list 
Database log mode              No Archive Mode 
Automatic archival             Enabled                     //Enabled表示為歸檔模式
Archive destination            /u01/admin/denver/archdest 
Oldest online log sequence     1 
Current log sequence           1

SQL> alter database open;
Database altered.

2)臨時表空間的資料檔案、日誌檔案不需要備份,如果設定為 備份模式,會收到報錯。

檢視臨時表空間

SQL> select tablespace_name from dba_temp_files;
 
TABLESPACE_NAME
------------------------------
TEMP

檢視臨時表空間的資料檔案

SQL> select name from v$tempfile;
 
NAME
------------------------------------------------------
/u01/app/oracle/oradata/orcl/temp01.dbf

將臨時表空間置為備份模式,收到了錯誤的提示

SQL> alter tablespace temp begin backup;
alter tablespace temp begin backup
*
ERROR at line 1:
ORA-03217: invalid option for alter of TEMPORARY TABLESPACE

將臨時表空間置為備份模式,收到了錯誤的提示

SQL> alter temporary tablespace temp begin backup;
alter temporary tablespace temp begin backup
*
ERROR at line 1:
ORA-00940: invalid ALTER command

3)  Oracle熱備份指令碼

基於資料庫熱備的指令碼

SQL> ho vim /tmp/tmphotbak.sql;      //將下面的內容輸入到/tmp/tmphotbak.sql指令碼檔案中
    set feedback off
    set heading off
    set verify off
    set trimspool off
    set pagesize 0
    set linesize 200
    define dir = '/u01/app/oracle/hotbak'
    define script = '/tmp/hotbak.sql'
    spool &script
    select 'ho cp ' ||name|| ' &dir'  from v$datafile;
    spool off
    alter database begin backup;
    start &script
    alter database end backup;
    alter database backup controlfile to '&dir/controlbak.ctl';
    create pfile = '&dir/initorcl.ora' from spfile;

執行該指令碼即可對資料庫進行熱備

SQL> start /tmp/tmphotbak.sql;  

基於表空間熱備的指令碼

SQL> ho vim /tmp/tmphotbak_tb.sql            //將下面的內容輸入到/tmp/tmphotbak.sql指令碼檔案中
    set feedback off
    set heading off
    set verify off
    set trimspool off
    set pagesize 0
    set linesize 200
    define dir = '/u01/app/oracle/hotbak'
    define script = '/tmp/hotbak_tb.sql'
    ho rm &script
    ho rm &dir/* 
    spool &script
    select 'alter tablespace '|| tablespace_name ||' begin backup ;' ||
    chr(10)||'ho cp ' || file_name || ' &dir ' ||
    chr(10)||'alter tablespace '|| tablespace_name || ' end backup;'
    from dba_data_files order by tablespace_name;
    spool off
    start &script
    alter database backup controlfile to '&dir/controlbak.ctl';
    create pfile = '&dir/initorcl.ora' from spfile;

執行該指令碼即可對資料庫基於表空間進行熱備

SQL> start /tmp/tmphotbak.sql;

4)備份的相關檢視

SQL> desc v$backup;
Name                                      Null?    Type
----------------------------------------- -------- ---------------------
FILE#                                              NUMBER
STATUS                                             VARCHAR2(18)
CHANGE#                                            NUMBER                        //記錄備份時的SCN號
TIME                                               DATE
 
狀態為NOT ACTIVE ,此時沒有任何資料處於備份狀態
SQL> select * from v$backup;   
 
FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
1 NOT ACTIVE            1006747 16-AUG-10
2 NOT ACTIVE            1006793 16-AUG-10
3 NOT ACTIVE            1006729 16-AUG-10
4 NOT ACTIVE            1006807 16-AUG-10
5 NOT ACTIVE            1006717 16-AUG-10
 
對錶空間users進行熱備
SQL> alter tablespace users begin backup;  
Tablespace altered.
 
對應的file# 為的處於ACTIVE狀態
SQL> select * from v$backup;   
 
FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
1 NOT ACTIVE            1006747 16-AUG-10
2 NOT ACTIVE            1006793 16-AUG-10
3 NOT ACTIVE            1006729 16-AUG-10
4 ACTIVE                1006852 16-AUG-10
5 NOT ACTIVE            1006717 16-AUG-10
 

備份時發生斷電或意外故障的恢復
假定users表空間目前置於begin bakup模式,系統斷電     
SQL> alter tablespace users begin backup;
Tablespace altered.
       
在另一個會話中強制關閉資料庫 
SQL> shutdown abort;
ORACLE instance shut down.
 
啟動後收到錯誤提示
SQL> startup
ORACLE instance started.
Total System Global Area  469762048 bytes
Fixed Size                  1220048 bytes
Variable Size              92275248 bytes
Database Buffers          373293056 bytes
Redo Buffers                2973696 bytes
Database mounted.
ORA-01113: file 4 needs media recovery
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/users01.dbf'
 
檢視備份檢視,檔案此時處於活動狀態
SQL> select * from v$backup;
 
FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
1 NOT ACTIVE            1006958 16-AUG-10
2 NOT ACTIVE            1006983 16-AUG-10
3 NOT ACTIVE            1006943 16-AUG-10
4 ACTIVE                1007072 16-AUG-10
5 NOT ACTIVE            1006931 16-AUG-10
 
使用end backup來終止備份
SQL> alter database datafile 4 end backup;   --此處也可以使用recover datafile 4來完成恢復
Database altered.
 
SQL> alter database open;
Database altered.
 
SQL> select * from dual;
D
-
X

-----------------------------------oracle非歸檔模式與歸檔模式備份-----------------------------------
1)不一致性備份(archivelog歸檔模式)
因為備份操作不可能瞬時完成,而資料檔案時刻都在寫,SCN時刻都在變,備份完第n個資料檔案時,第n+1個資料檔案的SCN有可能已經與之前的都不同了。
不一致性的備份在恢復後必須藉助歸檔日誌檔案和聯機重做日誌,將資料庫修復到一致性的狀態才能開啟。因此,建立不一致性備份除了備份資料庫啟動時必須的資料檔案和控制檔案之外,還需要備份歸檔日誌檔案。

2)一致性備份(noarchivelog非歸檔模式)
備份的資料檔案和控制檔案擁有相同的SCN,即一致性備份。只有資料庫以shutdown immediate方式關閉。並且資料庫未被置於開啟狀態時建立的備份才是一致性備份。

3)熱備份一定是不一致性備份,即歸檔模式的備份
利用要建立的熱備份做恢復時,有可能需要應用歸檔日誌或聯機重做日誌,才能將資料庫修復到一個一致性狀態,因此要建立有效的熱備份,要求資料庫必須處於歸檔模式。
資料庫是否處於歸檔模式不影響一致性備份的建立,但是對於非歸檔資料庫而言,只有一致性備份才算是有效備份。
只有歸檔模式下建立的不一致性備份才能被視為有效備份,非歸檔模式下建立的不一致備份極有可能無法恢復,或者恢復後丟失部分資料。

4)要熱備份,資料庫必須處於歸檔模式。冷備份,資料庫可以處於歸檔模式也可以處於非歸檔模式

相關文章