[轉] Oracle數據庫冷備份與熱備份操作梳理

 

 

https://cloud.tencent.com/developer/article/1027486

 

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)要熱備份,數據庫必須處於歸檔模式。冷備份,數據庫可以處於歸檔模式也可以處於非歸檔模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章