數據泵增量備份
阿新 • • 發佈:2018-03-03
base 分區表 documents 種類型 ova 一個數據庫 related 不存在 服務器
本帖最後由 java3344520 於 2012-11-8 12:51 編輯 大家看看這個參數inctype你是否使用過?我做了以下測試,歡迎拍磚! Oracle數據庫邏輯增量備份之exp/imp 一、實現需求 由於一個庫在雲平臺上,雖然做了RMAN備份,但是RMAN備份在雲本地磁盤上,同時庫備份數據量比較大,無法轉移到其他的空間上。由於該庫應用的性質比較特殊,大數據量部分要求保存180天後即可刪除,因此除了做RMAN之外,我希望將核心數據做下額外的備份,expdp可以滿足,目前是這麽做的,但是expdp做不了增量備份。聽說exp/imp有參數能做增量備份,但是又聽說exp增量備份的最小單位是表,只要表一條數據發生變化,就會對全表進行備份。之前沒有用過 下列關鍵字僅用於可傳輸的表空間 TRANSPORT_TABLESPACE 導入可傳輸的表空間元數據(N) TABLESPACES 將要傳輸到數據庫的表空間 DATAFILES 將要傳輸到數據庫的數據文件 TTS_OWNERS 擁有可傳輸表空間集中數據的用戶 三、exp邏輯備份 ORACLE數據庫的邏輯備份分為三種模式:表備份、用戶備份和完全備份。 (1)、表方式(T方式),將指定表的數據導出。 (2)、用戶方式(U方式),將指定用戶的所有對象及數據導出。 (3)、全庫方式(Full方式),將數據庫中的所有對象導出 1、exp表模式備份 備份某個用戶模式下指定的對象(表)。業務數據庫通常采用這種備份方式。 若備份到本地文件,使用如下命令: C:\Documents and Settings\A4586>set nls_lang=simplifiedchinese_china.zhs16gbk C:\Documents and Settings\A4586>exp scott/tiger file=c:\exp_scott_emp.dmplog=c:\exp_scott_emplog tables=scott.emp,scott.dept 即將導出指定的表通過常規路徑... . . 正在導出表 EMP導出了 14 行 . . 正在導出表 DEPT導出了 4 行 導出成功。 2、exp用戶模式備份 備份某個用戶模式下的所有對象。業務數據庫通常采用這種備份方式。若備份到本地文件,使用如下命令: C:\Documentsand Settings\A4586>expscott/tiger file=c:\exp_scott.dmp log=c:\exp_scott.log owner=scott 即將導出指定的用戶... . 正在導出 pre-schema 過程對象和操作 . 正在導出用戶 SCOTT 的外部函數庫名 . 導出 PUBLIC 類型同義詞 . 正在導出專用類型同義詞 . 正在導出用戶 SCOTT 的對象類型定義 即將導出 SCOTT 的對象... . 正在導出數據庫鏈接 . 正在導出序號 . 正在導出簇定義 . 即將導出 SCOTT 的表通過常規路徑... . . 正在導出表 BONUS導出了 0 行 . . 正在導出表 DEPT導出了 4 行 . . 正在導出表 EMP導出了 14 行 . . 正在導出表 SALGRADE導出了 5 行 ……. 3、exp全庫模式備份 備份完整的數據庫。業務數據庫不采用這種備份方式。註意導出用戶權限。備份命令為: C:\Documents and Settings\A4586>exp system/oraclefile=c:\exp_full.dmp log=c:\exp_full.log full=y; 即將導出整個數據庫... . 正在導出表空間定義 . 正在導出概要文件 . 正在導出用戶定義 . 正在導出角色 . 正在導出資源成本 . 正在導出回退段定義 . 正在導出數據庫鏈接 . 正在導出序號 ……. 四、imp邏輯恢復 數據導入(Import)的過程是數據導出(Export)的逆過程,分別將數據文件導入數據庫。數據庫的邏輯恢復分為表恢復、用戶恢復、完全恢復三種模式。 1、imp表模式恢復 A. 恢復表備份數據的全部內容 若從本地文件恢復scott導出的表,使用如下命令: C:\Documentsand Settings\A4586>impscott/tiger fromuser=scott touser=scott file=c:\exp_scott_emp.dmp log=c:\imp_scott_emp.log 經由常規路徑由 EXPORT:V10.02.01 創建的導出文件 已經完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的導入 導入服務器使用 AL32UTF8 字符集 (可能的字符集轉換) . 正在將 SCOTT 的對象導入到 SCOTT . . 正在導入表 "EMP"導入了 14 行 . . 正在導入表 "DEPT"導入了 4 行 即將啟用約束條件... 成功終止導入, 沒有出現警告。 B. 恢復備份數據中的指定表 若從本地文件恢復scott備份導出的表,此時必須制定所有表,使用如下命令: C:\Documents andSettings\A4586>impscott/tiger fromuser=scott touser=scotts file=c:\exp_scott_emp.dmp log=c:\imp_scott_emp.logtables=emp ignore=y; 經由常規路徑由 EXPORT:V10.02.01 創建的導出文件 已經完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的導入 導入服務器使用 AL32UTF8 字符集 (可能的字符集轉換) . 正在將 SCOTT 的對象導入到 SCOTTS . . 正在導入表 "EMP"導入了 14 行 即將啟用約束條件... 成功終止導入, 沒有出現警告。 2、imp用戶模式恢復 A. 恢復備份數據的全部內容 若從本地文件恢復整個用戶的所有表,使用如下命令 C:\Documents and Settings\A4586>imp scott/tigerfromuser=scott touser=scott file=c:\exp_scott.dmp log=c:\imp_scott.log; . 正在將 SCOTT 的對象導入到 SCOTTS B. 恢復備份數據中的指定表 若從本地文件恢復該用戶的部分表,註意,這裏一定要使用ingore=y,使用如下命令: C:\Documentsand Settings\A4586>impscott/tiger fromuser=scott touser=scotts file=c:\exp_scott.dmp log=c:\imp_scott.logtables=emp ignore=y; 經由常規路徑由 EXPORT:V10.02.01 創建的導出文件 已經完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的導入 導入服務器使用 AL32UTF8 字符集 (可能的字符集轉換) . . 正在導入表 " EMP "導入了 14 行 成功終止導入, 沒有出現警告。 3、imp全庫模式恢復 A. 恢復備份數據的全庫全部內容 若從全庫備份文件恢復全庫,使用如下命令: C:\Documents and Settings\A4586>imp scott/tigerfile=c:\exp_full.dmp log=c:\imp_full.log full=y; 經由常規路徑由 EXPORT:V10.02.01 創建的導出文件 已經完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的導入 導入服務器使用 AL32UTF8 字符集 (可能的字符集轉換) . 正在將 SYSTEM 的對象導入到 SYSTEM ……. B. 恢復備份數據的特定用戶內容 若從全庫備份文件恢復特定用戶的對象,使用如下命令: C:\Documents and Settings\A4586>imp scott/tigerfile=c:\exp_full.dmp log=c:\imp_full_scott.log fromuser=scott touser=scott ignore=y; 經由常規路徑由 EXPORT:V10.02.01 創建的導出文件 已經完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的導入 導入服務器使用 AL32UTF8 字符集 (可能的字符集轉換) . 正在將 SCOTT 的對象導入到 SCOTTS ……. C. 恢復備份數據的特定表內容 若從全庫備份文件恢復特定表,使用如下命令: C:\Documents and Settings\A4586>imp scott/tigerfile=c:\exp_full.dmp log=c:\imp_full.log fromuser=scott touser=scott tables=empignore=y; 經由常規路徑由 EXPORT:V10.02.01 創建的導出文件 已經完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的導入 導入服務器使用 AL32UTF8 字符集 (可能的字符集轉換) . 正在將 SCOTT 的對象導入到 SCOTT . . 正在導入表 "EMP"導入了 14 行 即將啟用約束條件... 成功終止導入, 沒有出現警告。 五、 exp/imp增量參數INCTYPE1、exp增量備份條件 增量導出是一種常用的數據備份方法,它只能對整個數據庫來實施,並且必須使用SYSTEM賬號來導出。在進行此種導出時,系統不要求回答任何問題。導出文件名缺省為export.dmp,如果不希望自己的輸出檔定名為export.dmp,必須在命令行中指出要用的文件名。當全庫備份比較小時候,采用數據庫備份更便於恢復。 執行增量備份必須滿足下列條件: 1.只對完整數據庫備份有效,且第一次需要full=y參數,以後需要inctype=incremental參數。 2. 用戶必須有EXP_FULL_DATABASE的系統角色。 2、exp增量備份類型 增量導出包括三種類型: (1)“完全”增量導出(Complete) 備份整個數據庫,腳本內容如下: C:\Documents andSettings\A4586>expsystem/oracle inctype=complete file=c:\exp_incr_full.dmplog=c:\exp_incr_full.log (2)“增量型”增量導出(Incremental) 備份上一次備份後改變的數據,腳本內容如下: C:\Documents andSettings\A4586>expsystem/oracle inctype=incremental file=c:\exp_incr_incr.dmplog=c:\exp_incr_incr.log (3)“累積型”增量導出(Cumulative) 備份自上次“完全”導出之後數據庫中變化了的數據。腳本內容如下: C:\Documents andSettings\A4586>expsystem/oracle inctype=cumulative file=c:\exp_incr_cum.dmplog=c:\exp_incr_cum.log 六、增量備份恢復實例1、exp增量備份恢復策略 數據庫管理員可以排定一個備份日程表,用數據導出的三個不同方式合理高效的完成。 比如數據庫的備分任務可以做如下安排: 星期一:完全導出(export_A.dmp) 星期二:增量導出(export_B.dmp) 星期三:增量導出(export_C.dmp) 星期四:增量導出(export_D.dmp) 星期五:累計導出(export_E.dmp) 星期六:增量導出(export_F.dmp) 星期日:增量導出(export_G.dmp) 如果在星期日,數據庫遭到意外破壞,數據庫管理員可按照如下步驟恢復數據庫: 第一步:用命令CREATE DATABASE重新生成數據庫結構; 第二步:創建一個足夠大的附加回滾,供imp使用。 第三步:完全增量導入A: imp system/manager inctype=RESTORE FULL=y FILE=A 第四步:累計增量導入E: imp system/manager inctype=RESTORE FULL=Y FILE=E 第五步:最近增量導入F: imp system/manager inctype=RESTORE FULL=Y FILE=F 2、A時間點全備 C:\Documents and Settings\A4586>sqlplus sys/oracle assysdba SQL*Plus: Release 10.2.0.1.0 - Productionon 星期三 11月 7 17:03:41 2012 Copyright (c) 1982, 2005, Oracle. All rights reserved. 連接到: Oracle Database 10g Enterprise EditionRelease 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Miningoptions SQL>grant dba to scott; SQL> create tablespace tbs_incr datafile‘D:\oracle\product\10.2.0\oradata\xmlgis\tbs_incr.dbf‘ size 10M autoextend onnext 10M maxsize unlimited; SQL> create table scott.a (status varchar(20),weektimevarchar(20)) tablespace tbs_incr; SQL> insert into scott.a values(‘insert‘,‘A‘); SQL> commit; C:\Documents and Settings\A4586>exp scott/tigerinctype=complete file=c:\exp_incr_A.dmp log=c:\exp_incr_A.log; 日誌中發現如下: . 即將導出 SCOTT 的表通過常規路徑... . . 正在導出表 A導出了 1 行 3、B時間點增量備份 SQL> create table scott.b (status varchar(20),weektimevarchar(20)) tablespace tbs_incr; SQL> insert into scott.b values(‘insert‘,‘b‘); SQL> insert into scott.a values(‘insert‘,‘b‘); SQL> commit; C:\Documents and Settings\A4586>exp scott/tiger inctype=incrementalfile=c:\exp_incr_B.dmp log=c:\exp_incr_B.log; 日誌中發現如下: . 即將導出 SCOTT 的表通過常規路徑... . . 正在導出表 A導出了 2 行 . . 正在導出表 B導出了 1 行 通過以上就說明了exp增量備份的最小執行 單位是表。 4、C時間點累積備份 SQL> create table scott.c (status varchar(20),weektimevarchar(20)) tablespace tbs_incr; SQL> insert into scott.c values(‘insert‘,‘c‘); SQL> insert into scott.a values(‘insert‘,‘c‘); SQL> commit; C:\Documents and Settings\A4586>exp scott/tiger inctype=cumulativefile=c:\exp_incr_C.dmp log=c:\exp_incr_C.log; 日誌中發現如下: . 即將導出 SCOTT 的表通過常規路徑... . . 正在導出表 A導出了 3 行 . . 正在導出表 B導出了 1 行 . . 正在導出表 C導出了 1 行 註意,這裏的B表也被備份了,這是因為這裏做的是累積備份,相對於全庫備份的增加來進行的,因此B表也是新增的,因此被備份了。增量和累積的差異非常清晰。 5、D時間點增量備份 SQL> create table scott.d (status varchar(20),weektimevarchar(20)) tablespace tbs_incr; SQL> insert into scott.d values(‘insert‘,‘d‘); SQL> insert into scott.a values(‘insert‘,‘d‘); SQL> commit; C:\Documents and Settings\A4586>exp scott/tiger inctype=incrementalfile=c:\exp_incr_D.dmp log=c:\exp_incr_D.log; 日誌中發現如下: . 即將導出 SCOTT 的表通過常規路徑... . . 正在導出表 A導出了 4 行 . . 正在導出表 D導出了 1 行 6、E時間點增量備份 SQL> create table scott.e(status varchar(20),weektimevarchar(20)) tablespace tbs_incr; SQL> insert into scott.e values(‘insert‘,‘e‘); SQL> insert into scott.a values(‘insert‘,‘e‘); SQL> commit; SQL> col status format a10 SQL> select * from scott.a; STATUS WEEKTIME -------------------------------------------------- insert b insert A insert c insert d insert e 6、A表丟失數據恢復 假設A表數據被誤刪除後,這個時候想要恢復到A,B,C,D,E某個時間的備份如何操作呢?(變相的需求是當前數據不是我想要的,我想恢復到之前某天的數據,先刪除,在恢復!) 由於表是一個單獨備份的對象單元,因此恢復的時候只要找到備份文件,就可以恢復到想要恢復的時刻。 舉例:恢復表A到C點時間的數據,恢復步驟如下: SQL> select * from scott.a; STATUS WEEKTIME -------------------------------------------------- insert b insert A insert c insert d insert e SQL> drop table scott.a; C:\Documents and Settings\A4586>imp scott/tigerfromuser=scott touser=scott file=c:\exp_incr_c.dmp log=c:\imp_incr_c.logtables=a ignore=y; 經由常規路徑由 EXPORT:V10.02.01 創建的導出文件 已經完成 ZHS16GBK 字符集和AL16UTF16 NCHAR 字符集中的導入 導入服務器使用 AL32UTF8 字符集 (可能的字符集轉換) . 正在將 SCOTT 的對象導入到 SCOTT . . 正在導入表 "A"導入了 3 行 成功終止導入, 沒有出現警告。 SQL> col status format a10 SQL> select * from scott.a; STATUS WEEKTIME ---------- ---------------------------------------- insert b insert A insert c 舉例:恢復A表到D點時刻數據 SQL> drop table scott.a; C:\Documents and Settings\A4586>imp scott/tigerfromuser=scott touser=scott fil=c:\exp_incr_d.dmp log=c:\imp_incr_d.logtables=a ignore=y; 經由常規路徑由 EXPORT:V10.02.01 創建的導出文件 已經完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的導入 導入服務器使用 AL32UTF8 字符集 (可能的字符集轉換) . 正在將 SCOTT 的對象導入到 SCOTT . . 正在導入表 "A"導入了 4 行 成功終止導入, 沒有出現警告。 SQL> col status format a10 SQL> select * from scott.a; STATUS WEEKTIME -------------------------------------------------- insert b insert A insert c insert d 7、D時間點丟失表空間恢復 假設在D時間點備份之後做了些操作後,表空間的數據文件tbs_del.dbf被誤刪除了,這個情況下的數據恢復步驟: 1:模擬破壞表空間 刪除tbs_incr.dbf數據文件,關閉數據庫重新啟動後,執行插入報錯如下: SQL> insert intoscott.a values(‘del files‘,‘e‘); insert into scott.a values(‘del files‘,‘e‘) * 第 1 行出現錯誤: ORA-00376: 此時無法讀取文件 7 ORA-01110: 數據文件 7:‘D:\ORACLE\PRODUCT\10.2.0\ORADATA\XMLGIS\TBS_INCR.DBF‘ 2:將被損壞的表空間(或涉及到數據文件損壞的表空間)offline: SQL>connect / as sysdba SQL> COL SEGMENT_NAME FORMAT A10 SQL> select SEGMENT_NAME,SEGMENT_TYPE from dba_segmentswhere tablespace_name=‘T BS_INCR‘; SEGMENT_NA SEGMENT_TYPE ---------------------------------------------- A TABLE B TABLE C TABLE D TABLE E TABLE SQL>alter tablespace tbs_incr offline immediate; SQL>drop tablespace tbs_incr including contents; 3:恢復表空間和數據文件 SQL>create tablespace tbs_incr datafile‘D:\oracle\product\10.2.0\oradata\xmlgis\tbs_incr.dbf‘ size 10M autoextend onnext 10M maxsize unlimited; 創建表空間參數,以及數據文件的路徑和大小,可以參照以前的設置,創建表空間成功後,一一恢復屬於該表空間的各用戶對象。 然後根據想要表對應的備份進行恢復即可,步驟同6. 8、全庫恢復 進行全庫方法,建立好表空間,然後全庫導入,這裏測試用刪除SCOTT用戶的表A,來測試全庫恢復情況(A+C+D): 恢復全庫備份A: C:\Documents and Settings\A4586>imp scott/tiger file=c:\exp_incr_a.dmp log=c:\imp_incr_a.loginctype=restore full=y ignore=y; 恢復累積備份C: C:\Documents and Settings\A4586>imp scott/tiger file=c:\exp_incr_c.dmp log=c:\imp_incr_c.loginctype=restore full=y ignore=y; . 正在將 SCOTT 的對象導入到 SCOTT . . 正在導入表 "A"導入了 3 行 . . 正在導入表 "B"導入了 1 行 . . 正在導入表 "C"導入了 1 行 恢復增量備份D: C:\Documents and Settings\A4586>imp scott/tiger file=c:\exp_incr_d.dmp log=c:\imp_incr_d.loginctype=restore full=y ignore=y; . 正在將 SCOTT 的對象導入到 SCOTT . . 正在導入表 "A"導入了 4 行 . . 正在導入表 "D"導入了 1 行 SQL> col status format a10 SQL> select * from scott.a; STATUS WEEKTIME -------------------------------------------------- insert b insert A insert c insert d 異常測試:刪除A表和B表,直接用C備份進行恢復,看看回復情況如何 SQL> DROP TABLE SCOTT.A; SQL> DROP TABLE SCOTT.B; 直接恢復累積備份C: C:\Documents and Settings\A4586>imp scott/tiger file=c:\exp_incr_c.dmp log=c:\imp_incr_c.loginctype=restore full=y ignore=y; . 正在將 SCOTT 的對象導入到 SCOTT . . 正在導入表 "A"導入了 3 行 . . 正在導入表 "B"導入了 1 行 . . 正在導入表 "C"導入了 1 行 SQL> select * from scott.b; select * from scott.b * 第 1 行出現錯誤: ORA-00942: 表或視圖不存在 這個時候發現,B表並未導入,類似RMAN裏的不完全恢復。 七、Exp/Imp增量備份恢復總結 Export/Import支持的增量和累計備份實際上是表級的,即上一次備份之後變化的表將全表卸載,而不是變化的記錄。因此,在以OLTP應用為主的數據庫中,由於保存主要業務數據的表處於頻繁的錄入和更新之中,增量和累計卸載並不能顯著提高備份的效率。 在做整個數據庫Import時,缺省狀態下以一個Table為一個Transaction,所以如果存在一些表的數據量很大, 建議使用commit=y並且要提供一個較大的buffer值,同時建立一個臨時Rollback segment ,它的default storage參數initial 和 next要設置大一些,並要將這個Rollback Segment Online,同時offline 其他小的rollbacksegments。確保一個Table能完整import 。因為在做import時, 數據庫將自動創建索引,及完整性約束, 為了加快數據加載的速度及一次成功的概率,可以考慮在export之前首先disable所有的完整性約束, 在import之後在enable所有的完整性約束。而對索引,可以考慮單獨export索引。通過使用命令 "imp indexfile=……" 在import數據之後來單獨創建索引。 如果希望在export數據庫時,直接將產生的dmp文件寫到外設上, 你可以使用 "exp file=設備名… Volsize=設備的容量"。 由於export出來的文件可能較大,而某些操作系統(如Linux)對文件大小有限制,如不能大於2G。因此可將dmp文件設置為指定大小的若幹文件。如: exp sys/managerbuffer=4096000 file=(full1.dmp,full2.dmp,full3.dmp,full4.dmp) filesize=2GFull=y inctype=complete log=full.log
|
數據泵增量備份