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