天天看點

Oracle資料庫的備份(下)

Oracle資料庫的備份(下)邏輯備份的實作之Export/Import.

EXP和IMP是Oracle提供的一種邏輯備份工具。邏輯備份建立資料庫對象的邏輯拷貝并存入一個二進制轉儲檔案。這種邏輯備份需要在資料庫啟動的情況下使用, 其導出實質就是讀取一個資料庫記錄集(甚至可以包括資料字典)并将這個記錄集寫入一個檔案,這些記錄的導出與其實體位置無關,導入實質就是讀取轉儲檔案并執行其中的指令。此備份方式是通過Oracle的實用工具export和import來實施的, export是把資料庫中的資料導出,import是把export卸出的資料導入資料庫中。通過此工具可以衍生出多種功能, 比如整個資料庫的備份、表結構重建、資料的傳輸、使用者的改變等等。

Oracle Export/Import工具提供了靈活多樣的功能和導出/導入模式,最常使用的三種模式是User、table和full database。除此以外,還可以在導出/導入時決定是否包含與對象有關的資料字典資訊,如索引、限制、權限等等。

注意:通過邏輯備份可以備份整個資料庫, 或僅備份部分重要資料。因為是邏輯上的備份,故隻能用于邏輯的恢複資料, 一旦資料庫被實體損壞, 導緻不能啟動,邏輯備份的資料不能幫助恢複資料庫。

1. Export/Import的使用舉例:(以下操作均為在

(1). 将一個使用者的對象導入到另一個使用者模式中:

把資料庫中原有的使用者Export至一個dmp檔案(如把使用者olduser的對象導出到檔案olduser0701.dmp中):

$ exp sys/password file= olduser0701 owner=olduser grant=N indexes=Y rows=Y

從dmp檔案中把一個使用者的對象import至一個使用者的模式中(從olduser0701.dmp中,把使用者olduser的對象導入到使用者newuser中):

$imp sys/password file=olduser0701 fromuser=olduser touser=newuser indexes=Y rows=Y

(2). 導入時避免出現ORA-00942(表或是圖不存在)錯誤:

因為,導出是按照在資料庫中對象建立的順序進行的,進而在導入時,資料庫對象之間的依賴性會引起某些先導入對象找不到其依賴對象(如view、procedure等等),就會引起ORA-00942(表或是圖不存在)錯誤。通常解決這種問題的方法是,做兩次導入工作,第一遍導入時設定如下:

$ imp sys/password file=demo0701 full=Y commit=y rows=Y

導入時如果出現錯誤,就修改設定:rows=n,ignore=n:

$ imp sys/password file=demo0701 full=Y rows=N commit=Y ignore=N

(3). 做無增量的全資料庫備份及恢複的例子:

全資料庫Export至dmp檔案(如sidfull0701.dmp):

$ exp sys/password file=sidfull0701.dmp Full=y -- rows确省為Y

把整個資料庫備份的sidfull0701.dmp檔案至資料庫中:

$ imp sys/password file=sidfull0701.dmp ignore=y full=y-- rows确省為Y

注意:導入/導出是最徹底的減少磁盤碎片的方法。

2. 備份政策和綜合應用舉例:

(1). 做全資料庫增量備份和恢複的方法:

全資料庫Export至dmp檔案(如sidfull0701.dmp):

$ exp sys/manager file= sidfull0701.dmp Full=y inctype=complete

第一天增量備份Export至dmp檔案(如sidincr1.dmp):

$ exp sys/manager file= sidincr1.dmp inctype=incremental

第二天增量備份Export至dmp檔案(如sidincr2.dmp):

$ exp sys/manager file= sidincr2.dmp inctype=incremental

第三天增量備份Export至dmp檔案(如sidincr3.dmp):

$ exp sys/manager file= sidincr3.dmp inctype=incremental

現假設Oracle資料庫在第三天被破壞了重建立一個Oracle資料庫,先把最後的一個dmp檔案imp至資料庫中:

$ imp sys/manager file= sidincr3.dmp full=y ignore=y inctype=system

把整個資料庫備份的dmp檔案imp至資料庫中:

$ imp sys/manager file= sidfull0701.dmp ignore=y full=y inctype=restore

把第一天增量備份的dmp檔案imp至資料庫中:

$ imp sys/manager file= sidincr1.dmp ignore=y full=y inctype=restore

把第二天增量備份的dmp檔案imp至資料庫中:

$ imp sys/manager file= sidincr2.dmp ignore=y full=y inctype=restore

把第三天增量備份的dmp檔案imp至資料庫中

$ imp sys/manager file= sidincr3.dmp ignore=y full=y inctype=restore

(2). 資料庫邏輯備份政策的制定:

資料庫管理者可以排定一個備份日程表,結合資料導出的三個不同方式合理、高效、可靠地完成。比如資料庫的備份任務可作如下安排:

星期一:完全導出(A)

星期二:增量導出(B)

星期三:增量導出(C)

星期四:增量導出(D)

星期五:累計導出(E)

星期六:增量導出(F)

星期日:增量導出(G)

如果在星期日,資料庫遭到意外破壞,資料庫管理者可按以下步驟來恢複資料庫:

第一步:用指令CREATE DATABASE重新生成資料庫結構;

第二步:建立一個足夠大的附加復原段。

第三步:完全增量導入A:

$ imp system/manager inctype=RECTORE FULL=Y FILE=A

第四步:累計增量導入E:

$ imp system/manager inctype=RECTORE FULL=Y FILE =E

第五步:最近增量導入F:

$ imp system/manager inctype=RESTORE FULL=Y FILE=F

注: 備份檔案的命名最好加上日期,這樣便于以後的恢複工作。

操作如下:

$ tar -cvf full'date +%Y-%m-%d-%H-%M'.dmp abc

$ tar -cvf full'date +%Y-%m-%d-%H-%M-%S'.dmp abc

(3). 利用cron定時備份資料庫:

Linux、Unix提供了定時服務cron程式,能夠在确定的時間中執行一系列任務,是以資料庫的備份必須和cron合作來完成,或者使用/etc下的daily,weekly,monthly檔案做定時的資料庫備份操作。

例如:編寫Oracle邏輯備份的sh檔案,并用cron程式來制定備份的時間。

i. 編輯完全備份的腳本檔案(exp_comp.sh):

rq='date +"%m%d"'

su - oracle -c "exp system/manager full=y inctype=complete file=/oracle/

export/db_comp$rq.dmp"

ii. 編輯累計備份的腳本檔案(exp_cumu.sh):

rq=' date +"%m%d"'

su - oracle -c"exp system/manager full=y inctype=cumulative file=/oracle

/export/db_cumu$rq.dmp"

iii. 編輯增量備份的腳本檔案(exp_incr.sh):

rq='date +"%m%d" '

su - oracle -c"exp system/manager full=y inctype=incremental file=/oracle

/export/db_incr$rq.dmp"

iv. 編輯root使用者crontab檔案,将上面的腳本指令用cron程式來制定資料庫備份的時間:

$ vi /var/spool/cron/crontabs/root

v. 在/var/spool/cron/crontabs/root檔案中增加以下内容:

0 2 1 * * /oracle/exp_comp.sh

30 2 * * 0-5 /oracle/exp_incr.sh

45 2 * * 6 /oracle/exp_cumu.sh

當然上面這個時間表可以根據不同的需求來改變。比如按照上面的資料庫的備份安排表來做這個cron程式的制定,如下所示:

星期一:完全導出(A)

星期二:增量導出(B)

星期三:增量導出(C)

星期四:增量導出(D)

星期五:累計導出(E)

星期六:增量導出(F)

星期日:增量導出(G)

(4).使用Export/Import的注意事項:

在做Export和Import的時候千萬請注意您的字元集設定,如果在做Export或Import的時候,UINX的環境變量如果和字元集設定不一緻的話, 将導緻資料庫恢複的資訊不能正确讀取,特别是資料庫采用的非預設值的中文字元集。切記一定要求保持一緻,如果有特殊的要求請先聯系Oracle售後支援部。下面介紹怎樣确定Oracle資料庫的字元集設定和作業系統的環境變量:

$ sqlplus sys/manager

SQL> select * from NLS_DATABASE_PARAMETERS;

PARAMETER VALUE

------------------------- -----------------------------

NLS_LANGUAGE AMERICAN

NLS_TERRITORY AMERICA

NLS_CHARACTERSET UTF8

環境變量應設定

$ export NLS_LANG=American_america.UTF8

Export/Import支援的增量和累計備份實際上是表級的,即上一次備份之後變化的表将全表解除安裝,而不是變化的記錄。是以,在以OLTP應用為主的資料庫中,由于儲存主要業務資料的表處于頻繁的錄入和更新之中,增量和累計解除安裝并不能顯著提高備份的效率。

在做整個資料庫Import時,預設狀态下以一個Table為一個Transaction,是以如果存在一些表的資料量很大, 建議使用commit=y并且要提供一個較大的buffer值,同時建立一個臨時Rollback segment ,它的default storage參數initial 和 next要設定大一些,并要将這個Rollback Segment Online,同時offline 其他小的rollback segments。確定一個Table能完整import 。因為在做import時, 資料庫将自動建立索引,及完整性限制, 為了加快資料加載的速度及一次成功的機率,可以考慮在export之前首先disable所有的完整性限制, 在import之後在enable所有的完整性限制。而對索引,可以考慮單獨export索引。通過使用指令 "imp indexfile=……" 在import資料之後來單獨建立索引。

如果希望在export資料庫時,直接将産生的dmp檔案寫到外設上, 你可以使用 " exp file=裝置名… Volsize=裝置的容量"。

由于export出來的檔案可能較大,而某些作業系統(如Linux)對檔案大小有限制,如不能大于2G。是以可将dmp檔案設定為指定大小的若幹檔案。如:

$exp sys/manager buffer=4096000 file=(full1.dmp,full2.dmp,full3.dmp,full4.dmp) filesize=2G Full=y inctype=complete log=full.log

至此,所有關于Oracle資料庫備份政策的介紹就給大家講完了。

表的導入導出

exp system/[email protected] tables=(IRIS.SALE) file=/home/iris/bat/SALE

imp iris/[email protected] file=/home/iris/bat/SALE.dmp ignore=y full=y