隨著計(jì)算機(jī)的普及以及
網(wǎng)絡(luò)的發(fā)展,
數(shù)據(jù)庫已經(jīng)不再僅僅是那些程序員所專有的話題。而Oracle
數(shù)據(jù)庫更是憑借其性能卓越,操作方便靈活的特點(diǎn),在數(shù)據(jù)庫的市場中已經(jīng)占據(jù)了一席之地。但是同樣隨著
網(wǎng)絡(luò)技術(shù)的不斷進(jìn)步,數(shù)據(jù)信息的不斷增加,
數(shù)據(jù)安全已經(jīng)不再是以前的“老生長談”,也更不是以前書本上那些“可望不可及”的條條框框。 或許很久以前,大家都覺得Oracle數(shù)據(jù)庫的安全并不存在隱患,因?yàn)镺racle公司在去年11月份開始促銷其數(shù)據(jù)庫軟件時(shí)提出的口號是“只有Oracle9i能夠做到絕對安全”。但是不管它這么說是為了促銷,還是為了擴(kuò)大知名度,總之伴去年12 月份,英國的安全專家 David Litchfield 發(fā)現(xiàn)的9iAS 中存在的程序錯(cuò)誤導(dǎo)致的緩沖溢出漏洞以及后來,PenTest Limited 和 eEye Digital Security 各自提出了一個(gè)小的漏洞,所有使用Oracle公司產(chǎn)品的人都不由地緊張了原本松弛的大腦--這個(gè)對于用戶來說,畢竟關(guān)系到了自己的“身家性命”。
/ f. S) s+ B. K* m# G2 K 下面筆者將帶著大家走進(jìn)Oracle數(shù)據(jù)安全的世界。由于筆者水平有限,所以不足之處在所難免,望大家不吝賜教。
4 F4 l1 d7 c& u (一)Oracle數(shù)據(jù)庫的一些基本常識
# H( d, J; _& Q* x- }6 } 這里僅僅是為了以后的安全奠定一些基礎(chǔ),因?yàn)槲覀兒竺嬉玫剿鼈儭?br/>
) e4 A2 J5 j( a; y3 o 1.Oracle所包含的組件:
( k' I! ?' c% u2 w1 [ 在 Oracle,數(shù)據(jù)庫是指整個(gè) Oracle RDBMS 環(huán)境,它包括以下組件:
f6 I5 L; ^8 Y ·Oracle 數(shù)據(jù)庫進(jìn)程和緩沖(實(shí)例)。
: a& @0 Z1 G: H& }2 z3 k ·SYSTEM 表空間包含一個(gè)集中系統(tǒng)類目,它可以由一個(gè)或多個(gè)數(shù)據(jù)文件構(gòu)成。
" _7 `% C, c x8 F) p ·其它由
數(shù)據(jù)庫管理員 (DBA)(可選)定義的表空間,每個(gè)都由一個(gè)或多個(gè)數(shù)據(jù)文件構(gòu)成。
( D+ H4 s& ?0 O" l ·兩個(gè)以上的聯(lián)機(jī)恢復(fù)日志。
k) y9 {( |7 N7 w A' p ·歸檔恢復(fù)日志(可選)。
1 h4 Y" ]; n1 c/ x/ N g ·其它文件(控制文件、Init.ora、Config.ora 等)。
1 _8 D1 R' j- X$ b! Z 每個(gè) Oracle 數(shù)據(jù)庫都在一個(gè)中央系統(tǒng)類目和數(shù)據(jù)字典上運(yùn)行,它位于SYSTEM 表空間。
2 ?7 e) o. J9 ]. |' K 2.關(guān)于“日志”
: r: w2 d1 H$ R; F5 q Oracle數(shù)據(jù)庫使用幾種結(jié)構(gòu)來保護(hù)數(shù)據(jù):數(shù)據(jù)庫后備、日志、回滾段和控制文件。下面我們將大體上了解一下作為主要結(jié)構(gòu)之一的“日志”:
& |. {! }* [! o1 ^/ x( y0 j" _' r 每一個(gè)Oracle數(shù)據(jù)庫實(shí)例都提供日志,記錄數(shù)據(jù)庫中所作的全部修改。每一個(gè)運(yùn)行的Oracle數(shù)據(jù)庫實(shí)例相應(yīng)地有一個(gè)在線日志,它與Oracle后臺進(jìn)程LGWR一起工作,立即記錄該實(shí)例所作的全部修改。歸檔(離線)日志是可選擇的,一個(gè)Oracle數(shù)據(jù)庫實(shí)例一旦在線日志填滿后,可形成在線日志歸檔文件。歸檔的在線日志文件被唯一標(biāo)識并合并成歸檔日志。
7 F. n; f, n6 Z* C ·關(guān)于在線日志:一個(gè)Oracle數(shù)據(jù)庫的每一實(shí)例有一個(gè)相關(guān)聯(lián)的在線日志。一個(gè)在線日志由多個(gè)在線日志文件組成。在線日志文件(online redo log file)填入日志項(xiàng)(redo entry),日志項(xiàng)記錄的數(shù)據(jù)用于重構(gòu)對數(shù)據(jù)庫所作的全部修改。
1 q& `; X. |, j ·關(guān)于歸檔日志:Oracle要將填滿的在線日志文件組歸檔時(shí),則要建立歸檔日志(archived redo log)。其對數(shù)據(jù)庫
備份和恢復(fù)有下列用處:
, [9 a& p- h* u* ^6 M <1>數(shù)據(jù)庫后備以及在線和歸檔日志文件,在
操作系統(tǒng)和磁盤故障中可保證全部提交的事物可被恢復(fù)。
) e5 u8 A( C4 C/ i/ g" \: e" c <2>在數(shù)據(jù)庫打開和正常系統(tǒng)使用下,如果歸檔日志是永久保存,在線后備可以進(jìn)行和使用。
; I$ ^* \0 l% C' @$ ^% x; t 數(shù)據(jù)庫可運(yùn)行在兩種不同方式下:NOARCHIVELOG方式或ARCHIVELOG 方式。數(shù)據(jù)庫在NOARCHIVELOG方式下使用時(shí),不能進(jìn)行在線日志的歸檔。如果數(shù)據(jù)庫在ARCHIVELOG方式下運(yùn)行,可實(shí)施在線日志的歸檔。
# s5 z) u; _9 B! j2 M' Q9 A* T% c" \ 3.物理和邏輯存儲結(jié)構(gòu):
a) J5 I y4 F( F4 O Oracle RDBMS是由表空間組成的,而表空間又是由數(shù)據(jù)文件組成的。表空間數(shù)據(jù)文件被格式化為內(nèi)部的塊單位。塊的大小,是由DBA在Oracle第一次創(chuàng)建的時(shí)候設(shè)置的,可以在512到8192個(gè)字節(jié)的范圍內(nèi)變動。當(dāng)一個(gè)對象在Oracle表空間中創(chuàng)建的時(shí)候,用戶用叫做長度的單位(初始長度((initial extent)、下一個(gè)長度(next extent)、最小長度(min extents)、以及最大長度(max extents))來標(biāo)明該對象的空間大小。一個(gè)Oracle長度的大小可以變化,但是要包含一個(gè)由至少五個(gè)連續(xù)的塊構(gòu)成的鏈。
; Z% |* U; q) T9 c# \ 4.Oracle與Microsoft SQL Server比較下的聯(lián)網(wǎng)協(xié)議:
3 z- x, H2 n1 G7 O! K# d (二)Oracle數(shù)據(jù)安全的維護(hù)
0 k: W: D4 A, I' e) ~. y 記得某位哲學(xué)家說過:“事物的變化離不開內(nèi)因和外因。”那么對于Oracle數(shù)據(jù)安全這個(gè)話題而言,也勢必分為“內(nèi)”和“外”兩個(gè)部分。那么好,我們就先從“內(nèi)”開始說起:
. x' A9 J Q& U5 L §1.從Oracle系統(tǒng)本身說起
3 w5 _) r+ G. x' b# M t5 Y5 d( Y 我們先拋開令人聞風(fēng)色變的“hacker”和其他一些外部的原因,先想一下我們的數(shù)據(jù)庫。什么硬盤損壞,什么軟件受損,什么操作事物……一系列由于我們的“疏忽”而造成的系統(tǒng)問題就完全可以讓我們辛苦建立的數(shù)據(jù)庫中的數(shù)據(jù)一去不復(fù)返。那么,我們就先從自己身上找找原因吧。
0 O5 `" y+ L& s# a 【一】解決系統(tǒng)本身問題的方法--數(shù)據(jù)庫的備份及恢復(fù)
5 P' n9 A. u- _5 _* t+ ? ·數(shù)據(jù)庫的備份:
& U, w! H0 |4 ?& l! ^8 i. l 關(guān)于Oracle數(shù)據(jù)庫的備份,標(biāo)準(zhǔn)地有三中辦法:導(dǎo)出/導(dǎo)入(Export/Import)、冷備份、熱備份。導(dǎo)出備份是一種邏輯備份,冷備份和熱備份是物理備份。
/ m. {* O+ I5 M/ X <1>導(dǎo)出/導(dǎo)入(Export/Import)
4 X: Z5 m4 S4 T( G 利用Export可將數(shù)據(jù)從數(shù)據(jù)庫中提取出來,利用Import則可將提取出來的數(shù)據(jù)送回Oracle數(shù)據(jù)庫中去。
6 y, B* C% }8 f+ @) p a.簡單導(dǎo)出數(shù)據(jù)(Export)和導(dǎo)入數(shù)據(jù)(Import)
1 x& ?9 Z) [$ @+ }% B Oracle支持三種類型的輸出:
7 [9 z0 ~, ?: r' W$ w (1)表方式(T方式),將指定表的數(shù)據(jù)導(dǎo)出。
! |5 z J( }0 L3 m" B& U (2)用戶方式(U方式),將指定用戶的所有對象及數(shù)據(jù)導(dǎo)出。
: s+ a" r7 U' J" C5 p (3)全庫方式(Full方式),將數(shù)據(jù)庫中的所有對象導(dǎo)出。
" d' j# E. I' j% c 數(shù)據(jù)導(dǎo)出(Import)的過程是數(shù)據(jù)導(dǎo)入(Export)的逆過程,它們的數(shù)據(jù)流向不同。
6 V, j7 @% C+ S, }! H ?, W4 L/ N4 u b.增量導(dǎo)出/導(dǎo)入
2 l" A% u) i$ m- F T5 ? 增量導(dǎo)出是一種常用的
數(shù)據(jù)備份方法,它只能對整個(gè)數(shù)據(jù)庫來實(shí)施,并且必須作為SYSTEM來導(dǎo)出。在進(jìn)行此種導(dǎo)出時(shí),系統(tǒng)不要求回答任何問題。導(dǎo)出文件名缺省為export.dmp,如果不希望自己的輸出文件定名為export.dmp,必須在命令行中指出要用的文件名。
/ C& h* K- M) R, B 增量導(dǎo)出包括三個(gè)類型:
, v- I# V3 }0 E, O (1)“完全”增量導(dǎo)出(Complete)
6 r. z- x! e. D# X 即備份整個(gè)數(shù)據(jù)庫,比如:
5 x; E+ j7 K, d {$ q) j $exp system/manager inctype=complete file=990702.dmp
. `* o) V: ^: N9 i (2)“增量型”增量導(dǎo)出
4 _% A+ H9 T; I% C9 W7 m4 | 備份上一次備份后改變的數(shù)據(jù)。比如:
! O8 c* y. V6 o( L1 v $exp system/manager inctype=incremental file=990702.dmp
5 O6 z) y& S% x r8 @3 N' i (3)“累計(jì)型”增量導(dǎo)出(Cumulative)
+ C0 W. A( D. v8 b- l+ n 累計(jì)型導(dǎo)出方式只是導(dǎo)出自上次“完全” 導(dǎo)出之后數(shù)據(jù)庫中變化了的信息。比如:
1 ]1 b* b8 j& G% ^ @3 D/ Z% g $exp system/manager inctype=cumulative file=990702.dmp
9 u$ `: X6 A- O 數(shù)據(jù)庫管理員可以排定一個(gè)備份日程表,用數(shù)據(jù)導(dǎo)出的三個(gè)不同方式合理高效地完成。比如數(shù)據(jù)庫的備份任務(wù)可作如下安排:
- J- K# X' I$ M8 d) r) h/ j ·星期一:完全導(dǎo)出(A)
3 c& d. m6 l! }/ _" Y, Y2 M F ·星期二:增量導(dǎo)出(B)
7 h6 q3 r7 z+ J: w1 W( r5 l ·星期三:增量導(dǎo)出(C)
. a1 b2 U8 j" g( `3 | ·星期四:增量導(dǎo)出(D)
9 v! n1 K& i1 N* N& d) x- L$ I6 U ·星期五:累計(jì)導(dǎo)出(E)
# b! [! A( X0 S ·星期六:增量導(dǎo)出(F)
" ~$ T! r6 N# T, Z6 H ·星期日:增量導(dǎo)出(G)
, U s/ m" P1 w+ Y& n 如果在星期日,數(shù)據(jù)庫遭到意外破壞,數(shù)據(jù)庫管理員可按以下步驟來
恢復(fù)數(shù)據(jù)庫:
0 F( N! ?; v0 X O0 c 第一步:用命令CREATE DATABASE重新生成數(shù)據(jù)庫結(jié)構(gòu);
2 y1 t3 o2 c( f: S6 t S$ | 第二步:創(chuàng)建一個(gè)足夠大的附加回段。
, |2 T4 z" h: S2 w: p, e 第三步:完全增量導(dǎo)入A:
' T1 ^4 N/ @7 v" Y: N; O $imp system./manager inctype= RECTORE FULL=Y FILE=A
5 ]2 b5 R0 j* }3 A, E3 l 第四步:累計(jì)增量導(dǎo)入E:
$ P( L* g% g9 [2 Q$ \7 B! q! k: ` $imp system/manager inctype= RECTORE FULL=Y FILE =E
) D. q" `2 f$ n2 S4 P% S 第五步:最近增量導(dǎo)入F:
/ {0 T0 c! e, r- a' ]$ B* }' ?' y $imp system/manager inctype=RESTORE FULL=Y FILE=F
5 l& u1 V3 `2 ~& J! \ <2>冷備份
' ]. d+ {4 ]) B+ b! G& f* U8 r 冷備份發(fā)生在數(shù)據(jù)庫已經(jīng)正常關(guān)閉的情況下,當(dāng)正常關(guān)閉時(shí)會提供給我們一個(gè)完整的數(shù)據(jù)庫。冷備份是將關(guān)鍵性文件拷貝到另外位置的一種說法。對于備份Oracle信息而言,冷備份是最快和最安全的方法。冷備份的優(yōu)點(diǎn)是:
' h* P- x8 M# s( Z ·是非常快速的備份方法(只需拷貝文件)
: \9 _0 }1 x4 c3 q% j ·容易歸檔(簡單拷貝即可)
; L! ^* N, K7 f- E3 q ·容易恢復(fù)到某個(gè)時(shí)間點(diǎn)上(只需將文件再拷貝回去)
5 Y$ F0 D3 a A/ \! e5 Z ·能與歸檔方法相結(jié)合,作數(shù)據(jù)庫“最新狀態(tài)”的恢復(fù)。
& f3 k9 m2 ~' F1 H( C) K ·低度維護(hù),高度安全。
( W2 M8 a( X. S& O5 Y 但冷備份也有如下不足:
4 H& E$ T0 @+ O: v! }# L ·單獨(dú)使用時(shí),只能提供到“某一時(shí)間點(diǎn)上”的恢復(fù)。
+ W) q8 E1 ~. C3 ] ·在實(shí)施備份的全過程中,數(shù)據(jù)庫必須要作備份而不能作其它工作。也就是說,在冷備份過程中,數(shù)據(jù)庫必須是關(guān)閉狀態(tài)。
* d# l/ N' k) \ ·若磁盤空間有限,只能拷貝到磁帶等其它外部存儲設(shè)備上,速度會很慢。
) ?; ~ [( k! g0 }0 O( B ·不能按表或按用戶恢復(fù)。
, z% w1 h) O/ S/ F 如果可能的話(主要看效率),應(yīng)將信息備份到磁盤上,然后啟動數(shù)據(jù)庫(使用戶可以工作)并將所備份的信息拷貝到磁帶上(拷貝的同時(shí),數(shù)據(jù)庫也可以工作)。冷備份中必須拷貝的文件包括:
! [8 ]% J8 J% F$ s& F* _! t6 ~, U" I ·所有數(shù)據(jù)文件
! |3 Q! [) z" k' e, B ^# u ·所有控制文件
* Q0 a G9 b1 i1 }% L6 E ·所有聯(lián)機(jī)REDO LOG文件
9 c: d. p1 g+ N( v- [- Z ·Init.ora文件(可選)
* H7 V! Z h, r7 ?, B3 n$ }5 { 值得注意的是冷備份必須在數(shù)據(jù)庫關(guān)閉的情況下進(jìn)行,當(dāng)數(shù)據(jù)庫處于打開狀態(tài)時(shí),執(zhí)行數(shù)據(jù)庫文件系統(tǒng)備份是無效的
0 w+ |! d% t* r9 e* Y) M' F! U 下面是做冷備份的完整例子:
J4 y9 K7 Z+ q { (1) 關(guān)閉數(shù)據(jù)庫$sqldba lmode=y
+ r3 i h: ?1 B8 k6 D+ p4 ~ SQLDBA >connect internal;
9 v* S) y. V) ^4 } SQLDBA >shutdown normal;
8 Q6 i% c# X2 v (2) 用拷貝命令備份全部的時(shí)間文件、重做日志文件、控制文件、初始化參數(shù)文件
' ~/ i( c8 t! m4 I. T% ^4 i SQLDBA >! cp < file > < backup directory >
: k5 R$ X5 i r8 T (3) 重啟Oracle數(shù)據(jù)庫
( E" R: K, ]6 O5 O D $sqldba lmode=y
" I* g" I9 P$ i/ F& Y SQLDBA >connect internal;
' ]2 ]& G' }0 b4 @1 M! e- G SQLDBA >startup;
_5 @4 b1 Y9 B: B* C6 b8 f, y! _8 f <3>熱備份
1 L/ ?' M) `7 \ 熱備份是在數(shù)據(jù)庫運(yùn)行的情況下,采用archivelog mode方式備份數(shù)據(jù)的方法。所以,如果你有昨天夜里的一個(gè)冷備份而且又有今天的熱備份文件,在發(fā)生問題時(shí),就可以利用這些資料恢復(fù)更多的信息。熱備份要求數(shù)據(jù)庫在Archivelog方式下操作,并需要大量的檔案空間。一旦數(shù)據(jù)庫運(yùn)行在archivelog狀態(tài)下,就可以做備份了。熱備份的命令文件由三部分組成:
+ Q0 H! @" m+ `: _) M& L 1.數(shù)據(jù)文件一個(gè)表空間一個(gè)表空間地備份。
4 C8 |, p7 p1 v; [1 O, p% E! T (1)設(shè)置表空間為備份狀態(tài)
* h6 A l {% \* g: ^/ J (2)備份表空間的數(shù)據(jù)文件
4 U5 W- b, l7 e* I/ n7 C' k (3)恢復(fù)表空間為正常狀態(tài)
+ Z! A' _1 z& e 2.備份歸檔log文件。
% K( H2 z# ~, U* s (1)臨時(shí)停止歸檔進(jìn)程
, M: v& B& k6 J( a. v4 K- ^ (2)log下那些在archive redo log目標(biāo)目錄中的文件
1 y9 h3 R/ v" F' A3 v4 m y0 P9 P* a (3)重新啟動archive進(jìn)程
4 P O8 I6 t# `: E' b (4)備份歸檔的redo log 文件
; F& @+ V! O4 V: m U" X7 E, `, `- F 3.用alter database backup controlfile命令來備份拷貝文件
( x3 v" i+ l9 H 熱備份的優(yōu)點(diǎn)是: