Oracle熱備份與實例分析
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一直到現在的日志(完全恢復的話) 。
接下來看看數據文件頭的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)、基于表空間熱備的腳本
[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;