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