Oracle熱備份與實例分析

baojian322 13年前發布 | 3K 次閱讀 eCromedos Firefox

1、概念
Oracle
熱備份是指數據庫處于open狀態下,對數據庫的數據文件、控制文件、參數文件、密碼文件等進行一系列備份操作。熱備是基于用戶管理備份恢復的一種方式,也是除了RMAN備份之外較為常用的一種備份方式。熱備份較冷備份的主要區別就是不會丟失在備份后更新的數據。
2、熱備的過程
凍結塊頭-->控制SCN在備份時不發生變化
進行物理拷貝
解凍塊頭-->讓SCN可以變化(當對SCN解凍后,系統會自動更新SCN至最新的狀態)
3、基于數據庫的熱備
alter database begin backup;
拷貝所有的datafile到備份目錄
alter database end backup;
4、基于表空間的熱備
alter tablespace tablespace_name begin backup;
拷貝tablespace_name表空間的數據文件到備份目錄
alter tablespace tablespace_name end backup;
說明:alter tablespace tablespace_name begin backup時完成的任務:
(1)、檢查點事件發生,檢查點通知DBWn將該表空間上所有的臟數據被寫入到磁盤
(2)、在數據文件頭部凍結當前檢查點事件發生時的SCN號
(3)、所有發生變化數據塊的完整鏡像(修改前后)被寫入到redo log中
(4)、允許該表空間內數據的正常讀寫
5、控制文件的熱備

alter database backup controlfile to '<dir>';   --控制文件的完整備份

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
6、參數文件的熱備
create pfile = '<dir>' from spfile;
7、
用戶管理的熱備份的原理分析
首先要確保數據庫是處于歸檔模式。

SQL> conn / as sysdba;
Connected.
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     90
Next log sequence to archive   92
Current log sequence           92
SQL> alter tablespace users begin backup;

Tablespace altered.

SQL> 
SQL> col filename for a45;
SQL> col ts_name for a15;
SQL> col status for a15;
SQL> select d.file_name filename,d.tablespace_name ts_name,b.status from dba_data_files d,v$backup b where d.file_id=b.file# ;

FILENAME                                      TS_NAME         STATUS
--------------------------------------------- --------------- ---------------
/u01/oracle/oradata/general10g/users01.dbf    USERS           ACTIVE
/u01/oracle/oradata/general10g/sysaux01.dbf   SYSAUX          NOT ACTIVE
/u01/oracle/oradata/general10g/undotbs01.dbf  UNDOTBS1        NOT ACTIVE
/u01/oracle/oradata/general10g/system01.dbf   SYSTEM          NOT ACTIVE
/u01/oracle/oradata/general10g/example01.dbf  EXAMPLE         NOT ACTIVE
/u01/oracle/oradata/general10g/cold_test_file COLD_TEST       NOT ACTIVE
.dbf


6 rows selected.

SQL> 
可以看到users表空間是處于備份模式的"ACTIVE"狀態的。
下面簡單分析一下
USERS表空間現在處于backup模式的時候,具體的信息:
在我們alter tablespace users begin backup 的時候是鎖定了users表空間對應的數據文件頭的change scn,
首先考慮一下數據庫怎么用日志文件做恢復:查找不一致的數據文件(根據文件頭中舊的scn),如果鎖定了文件頭,這個文件頭中的scn就不會改變(當然了數據塊還是會變化的,還可以做讀寫),然后就會應用這個scn到現在的日志。

backup開始后就鎖定了scn,不管你后邊怎么修改,總之做恢復的時候是應用鎖定的時候的scn一直到現在的日志(完全恢復的話) 。
舉個例子: 
a,b兩個數據文件,把a置于備份模式,b正常 ,這時候兩個change scn都是100,然后開始備份 
這期間有數據庫的修改,備份完成的時候,Scn變成了200。但是由于a的備份模式,所以a的文件頭中記錄的scn還是100,b是200。 某個時間,假設scn 500 ,這時候a丟失 。
copy回a的備份,然后recover,完全恢復的話數據庫就應用100—500這段的日志,自然也就不會丟失數據了。 
因為不管在我copy備份的過程中你做什么操作,總之都在鎖定的時change scn之后,所以應用的日志就不會有遺漏了。 這時候應該能理解為什么要數據庫處于archived模式了。

接下來看看數據文件頭的change scn:
SQL> select NAME,TABLESPACE_NAME,STATUS,CHECKPOINT_CHANGE# from v$datafile_header;

NAME                                                                             TABLESPACE_NAME                STATUS  CHECKPOINT_CHANGE#
-------------------------------------------------------------------------------- ------------------------------ ------- ------------------
/u01/oracle/oradata/general10g/system01.dbf                                      SYSTEM                         ONLINE             4155367
/u01/oracle/oradata/general10g/undotbs01.dbf                                     UNDOTBS1                       ONLINE             4155367
/u01/oracle/oradata/general10g/sysaux01.dbf                                      SYSAUX                         ONLINE             4155367
/u01/oracle/oradata/general10g/users01.dbf                                       USERS                          ONLINE             4155270
/u01/oracle/oradata/general10g/example01.dbf                                     EXAMPLE                        ONLINE             4155367
/u01/oracle/oradata/general10g/cold_test_file.dbf                                COLD_TEST                      ONLINE             4155367

6 rows selected

SQL> alter system checkpoint;

System altered

SQL> select NAME,TABLESPACE_NAME,STATUS,CHECKPOINT_CHANGE# from v$datafile_header;

NAME                                                                             TABLESPACE_NAME                STATUS  CHECKPOINT_CHANGE#
-------------------------------------------------------------------------------- ------------------------------ ------- ------------------
/u01/oracle/oradata/general10g/system01.dbf                                      SYSTEM                         ONLINE             4155674
/u01/oracle/oradata/general10g/undotbs01.dbf                                     UNDOTBS1                       ONLINE             4155674
/u01/oracle/oradata/general10g/sysaux01.dbf                                      SYSAUX                         ONLINE             4155674
/u01/oracle/oradata/general10g/users01.dbf                                       USERS                          ONLINE             4155270
/u01/oracle/oradata/general10g/example01.dbf                                     EXAMPLE                        ONLINE             4155674
/u01/oracle/oradata/general10g/cold_test_file.dbf                                COLD_TEST                      ONLINE             4155674

6 rows selected

SQL> 
顯然,在將users表空間置于backup狀態的時候,相應的datafile的文件頭的scn就不會再發生改變,發生檢查點也不會改變。
接下來,end backup,看看scn
SQL> alter tablespace users end backup;

Tablespace altered

SQL> select NAME,TABLESPACE_NAME,STATUS,CHECKPOINT_CHANGE# from v$datafile_header;

NAME                                                                             TABLESPACE_NAME                STATUS  CHECKPOINT_CHANGE#
-------------------------------------------------------------------------------- ------------------------------ ------- ------------------
/u01/oracle/oradata/general10g/system01.dbf                                      SYSTEM                         ONLINE             4155674
/u01/oracle/oradata/general10g/undotbs01.dbf                                     UNDOTBS1                       ONLINE             4155674
/u01/oracle/oradata/general10g/sysaux01.dbf                                      SYSAUX                         ONLINE             4155674
/u01/oracle/oradata/general10g/users01.dbf                                       USERS                          ONLINE             4155674
/u01/oracle/oradata/general10g/example01.dbf                                     EXAMPLE                        ONLINE             4155674
/u01/oracle/oradata/general10g/cold_test_file.dbf                                COLD_TEST                      ONLINE             4155674

6 rows selected

SQL> 
可以看到,scn已經是最新的了!
注:看不到scn號,請點擊‘源代碼’進行查看

8、一個簡單例子
SQL> create table hotbak_table(a int) tablespace users;

Table created
SQL> insert into hotbak_table values(11);

1 row inserted

SQL> insert into hotbak_table values(12);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from hotbak_table;

                                      A
---------------------------------------
                                     11
                                     12

SQL> 
SQL> ALTER TABLESPACE USERS BEGIN BACKUP;

Tablespace altered.
SQL> !cp /u01/oracle/oradata/general10g/*.dbf /u01/oracle/hotbackup/

SQL> ALTER TABLESPACE USERS END BACKUP;

Tablespace altered.

SQL> 
SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

SQL> insert into hotbak_table values(13);

1 row created.

SQL> commit;

Commit complete.

SQL> 
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !rm -f /u01/oracle/oradata/general10g/users01.dbf

SQL> startup;
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  1218316 bytes
Variable Size              71305460 bytes
Database Buffers           92274688 bytes
Redo Buffers                2973696 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/u01/oracle/oradata/general10g/users01.dbf'


SQL> ALTER DATABASE DATAFILE 4 OFFLINE DROP;

Database altered.

SQL> ALTER DATABASE OPEN;

Database altered.
SQL> !cp  /u01/oracle/hotbackup/*.dbf /u01/oracle/oradata/general10g/

SQL> RECOVER DATAFILE 4;
Media recovery complete.
SQL>   
如果上一步出現異常情況,需要shutdown abort,然后starup即可
SQL> ALTER DATABASE DATAFILE 4 ONLINE;

Database altered.

SQL> select * from hotbak_table;

         A
----------
        13
        11
        12

SQL> 
可以看到,后來插入的‘13’值也沒有丟失!
總結:
(1).熱備份必須在數據庫歸檔模式下進行
(2).在備份的同時,數據庫的用戶可以進行操作。
  因此,數據庫對應的物理文件的內容是不斷變化的,對這些物理文件內容的更新是保留到有關操作已經寫到重做日志文件中后再進行。
(3).歸檔日志必須是備份后的所有日至才可以實現數據庫的完全恢復。
(4).可以備份除臨時文件以外的所有數據文件,如果在恢復過程中,發現損壞的是多個數據文件,即可以采用一個一個數據文件的恢復方法
(5).特別當損壞的不是系統表空間,可以先將損壞的表空間文件脫機,這時可以在恢復損壞文件前打開數據庫,再完成恢復.

附件:備份腳本
(1)、基于表空間熱備的腳本
[oracle@linuxForOra hotbackup]$ vi hotbackup.sql
set feedback off
set heading off
set verify off
set trimspool off
set pagesize 0
set linesize 200
define dir = '/u01/oracle/hotbackup'
define script = '/tmp/hotbak.sql'
host rm &script
host rm &dir/* 
spool &script
select 'alter tablespace '|| tablespace_name ||' begin backup ;' || 
chr(10)||'host 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/initgeneral.ora' from spfile;
spool off;
SQL> start hotbackup.sql
(2)、基于數據庫熱備的腳本
set feedback off
set heading off
set verify off
set trimspool off
set pagesize 0
set linesize 200
define dir = '/u01/oracle/hotbackup'
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/initgeneral.ora' from spfile;

 本文由用戶 baojian322 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!