oracle數據庫的備份與恢復
創新互聯主要從事網站建設、成都網站設計、網頁設計、企業做網站、公司建網站等業務。立足成都服務息縣,十年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:18980820575
---- 當我們使用一個數據庫時,總希望數據庫的內容是可靠的、正確的,但由于計算機系統的故障(包括機器故障、介質故障、誤操作等),數據庫有時也可能遭到破壞,這時如何盡快恢復數據就成為當務之急。如果平時對數據庫做了備份,那么此時恢復數據就顯得很容易。由此可見,做好數據庫的備份是多么的重要,下面筆者就以oracle7為例,來講述一下數據庫的備份和恢復。oracle 數據庫有三種標準的備份方法,它們分別為導出/導入(export/import)、冷備份、熱備份。導出備份是一種邏輯備份,冷備份和熱備份是物理備份。
---- 一、 導出/導入(export/import)
---- 利用export可將數據從數據庫中提取出來,利用import則可將提取出來的數據送回oracle數據庫中去。
---- 1. 簡單導出數據(export)和導入數據(import)
---- oracle支持三種類型的輸出:
---- (1)表方式(t方式),將指定表的數據導出。
---- (2)用戶方式(u方式),將指定用戶的所有對象及數據導出。
---- (3)全庫方式(full方式),將數據庫中的所有對象導出。
---- 數據導出(import)的過程是數據導入(export)的逆過程,它們的數據流向不同。
---- 2. 增量導出/導入
---- 增量導出是一種常用的數據備份方法,它只能對整個數據庫來實施,并且必須作為system來導出。在進行此種導出時,系統不要求回答任何問題。導出文件名缺省為export.dmp,如果不希望自己的輸出文件定名為export.dmp,必須在命令行中指出要用的文件名。
---- 增量導出包括三個類型:
---- (1)“完全”增量導出(complete)
---- 即備份整個數據庫,比如:
---- $exp system/manager inctype=complete file=990702.dmp
---- (2) “增量型”增量導出
---- 備份上一次備份后改變的數據。比如:
---- $exp system/manager inctype=incremental file=990702.dmp
---- (3) “累計型”增量導出(cumulative)
---- 累計型導出方式只是導出自上次“完全” 導出之后數據庫中變化了的信息。比如:
---- $exp system/manager inctype=cumulative file=990702.dmp
---- 數據庫管理員可以排定一個備份日程表,用數據導出的三個不同方式合理高效地完成。
---- 比如數據庫的備份任務可作如下安排:
---- 星期一:完全導出(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
---- 二、 冷備份
---- 冷備份發生在數據庫已經正常關閉的情況下,當正常關閉時會提供給我們一個完整的數據庫。冷備份是將關鍵性文件拷貝到另外位置的一種說法。對于備份oracle信息而言,冷備份是最快和最安全的方法。冷備份的優點是:
---- 1.是非??焖俚膫浞莘椒ǎㄖ恍杩截愇募?/p>
---- 2.容易歸檔(簡單拷貝即可)
---- 3.容易恢復到某個時間點上(只需將文件再拷貝回去)
---- 4.能與歸檔方法相結合,作數據庫“最新狀態”的恢復。
---- 5.低度維護,高度安全。
---- 但冷備份也有如下不足:
---- 1.單獨使用時,只能提供到“某一時間點上”的恢復。
---- 2.在實施備份的全過程中,數據庫必須要作備份而不能作其它工作。也就是說,在冷備份過程中,數據庫必須是關閉狀態。
---- 3.若磁盤空間有限,只能拷貝到磁帶等其它外部存儲設備上,速度會很慢。
---- 4.不能按表或按用戶恢復。
---- 如果可能的話(主要看效率),應將信息備份到磁盤上,然后啟動數據庫(使用戶可以工作)并將所備份的信息拷貝到磁帶上(拷貝的同時,數據庫也可以工作)。冷備份中必須拷貝的文件包括:
---- 1.所有數據文件
---- 2.所有控制文件
---- 3.所有聯機redo log文件
---- 4.init.ora文件(可選)。
---- 值得注意的是冷備份必須在數據庫關閉的情況下進行,當數據庫處于打開狀態時,執行數據庫文件系統備份是無效的
---- 下面是做冷備份的完整例子:
---- (1) 關閉數據庫$sqldba lmode=y
---- sqldba connect internal;
---- sqldba shutdown normal;
---- (2) 用拷貝命令備份全部的時間文件、重做日志文件、控制文件、初始化參數文件
---- sqldba ! cp file ; backup directory
---- (3) 重啟oracle數據庫
---- $sqldba lmode=y
---- sqldba connect internal;
---- sqldba startup;
---- 三、 熱備份
---- 熱備份是在數據庫運行的情況下,采用archivelog mode方式備份數據的方法。所以,如果你有昨天夜里的一個冷備份而且又有今天的熱備份文件,在發生問題時,就可以利用這些資料恢復更多的信息。熱備份要求數據庫在archivelog方式下操作,并需要大量的檔案空間。一旦數據庫運行在archivelog狀態下,就可以做備份了。熱備份的命令文件由三部分組成:
---- 1.數據文件一個表空間一個表空間地備份。
---- (1)設置表空間為備份狀態
---- (2)備份表空間的數據文件
---- (3)恢復表空間為正常狀態
---- 2.備份歸檔log文件。
---- (1)臨時停止歸檔進程
---- (2)log下那些在archive redo log目標目錄中的文件
---- (3)重新啟動archive進程
---- (4)備份歸檔的redo log 文件
---- 3.用alter database backup controlfile命令來備份拷貝文件
---- 熱備份的優點是:
---- 1.可在表空間或數據文件級備份,備份時間短。
---- 2.備份時數據庫仍可使用。
---- 3.可達到秒級恢復(恢復到某一時間點上)。
---- 4.可對幾乎所有數據庫實體作恢復。
---- 5.恢復是快速的,在大多數情況下在數據庫仍工作時恢復。
---- 熱備份的不足是:
---- 1.不能出錯,否則后果嚴重。
---- 2.若熱備份不成功,所得結果不可用于時間點的恢復。
---- 3.因難于維護,所以要特別仔細小心,不允許“以失敗而告終”。
根據oracle數據庫的特點和提供的工具,主要方法有以下幾種方法:
利用邏輯備份使用import工具丟失數據的表
利用物理備份來通過還原數據文件并進行不完全恢復
利用dbms_logmnr包從redo log文件中恢復
利用flashback特性恢復數據
前提
為了方便使用方法的介紹,上述恢復方法都將基于以下場景進行:系統管理員在前一天晚上11點用export對數據庫做了全庫邏輯備份,然后對所有數據文件進行了熱備份。第二天上午10點,系統管理員在修改表TFUNDASSET的數據時,由于修改語句的條件寫錯了,導致一批記錄(幾千條)的ztm字段被修改成了錯誤的值,而且已經提交。這個表是資產表,相對而言數據變化不頻繁。
一、利用邏輯備份使用import工具恢復丟失的數據
export/import是oracle提供的用于對數據庫進行邏輯備份的工具。該工具適用于備份那些數據量不大、業務量不多的數據庫系統。因為如果在前一天晚上11點用export做了邏輯備份,那么當今天上午10點數據庫意外崩潰時,從備份起到數據庫崩潰的這段時間里的數據修改操作(包括DDL和DML)都會丟失。如果丟失數據內的表上的數據是相對比較穩定,也就是說該表上基本沒有DML操作,例如標準代碼表、分區表里的歷史數據,那么采用import來導入該表可以比較完整的恢復數據。如果該表是經常變化的業務表,那么這些丟失的數據只能根據業務情況從紙質記錄恢復,或者其他途徑恢復。
▲示例如下:這個表是一個資產表。相對來說,今天系統運行中修改的數據較少,丟失的數據量可以承受或者可以從別的途徑恢復。那就可以用import來恢復。
方法一:
1、把這個表的數據備份到另一個表:
8bef9890242e5d20d09563896cef1471.png
2、刪除該表的記錄:
625dfa5d5986ca5c37dd5017953407cb.png
3、執行下面的命令:
3754d50cc473bd44236d927f00196d24.png
這個命令中在關鍵字tables中指定需要導入的表名字,ignore=y表示忽略表已經存在的錯誤。
4、導入結束后,檢查表中的記錄,并用適當的方法恢復當天的修改。
方法二:
1、 把需要恢復的表導入到另一個用戶下面:
33806d1216df5ae9c45890d3d45930ee.png
2、檢查數據以后,把原表記錄刪除:
fe23a8a4602702e951e5ab48a7460e3b.png
3、然后從另一用戶表中插入回去:
729976810ef459046df40b791a6ca773.png
4、 數據量比較大時可以采用如下方法:
e377d10ff07132f160185cb1ba119cfc.png
二、利用物理備份來通過還原數據文件并進行不完全恢復
如果數據庫運行在歸檔模式下,那么可以通過使用以前的數據文件備份進行還原,然后利用歸檔日志進行前滾,直到回滾到錯誤操作的時間點前,然后重置日志文件打開數據庫。
可以通過下列方法確認是否是運行在歸檔模式:
c8406e42aef7ccc8ef232cfdd535e825.png
如果是如上所示,那么就是運行在歸檔模式了。
▲假定在前一天晚上11點做了全庫物理備份,那么可以考慮如下恢復:
1、關閉數據庫:
由于數據庫的不完全恢復必須在一個關閉的數據庫上實施,利用一個舊的數據庫的備份還原,然后用日志根據需要逐步前滾,而不能還原一個新的備份,再回退到某個時間點。
通知各客戶端數據庫將關閉,然后發出:
401f68e89cbfa03388f5913bf5f1ecfd.png
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
2、確定錯誤操作的時間:
可以根據操作員的估計來確定不完全恢復需要前滾停止的時間,也可以利用LogMiner來分析日志文件(這個工具將在后面介紹),找出錯誤操作的準確時間。
3、還原數據文件:
先對當前的數據庫文件進行備份,然后再用以前的最近一次備份覆蓋現有數據文件。注意:不覆蓋現有的控制文件。
4、基于時間點恢復,啟動數據庫到裝配狀態:
8802043c250eb2a060285be160f48c36.png
這樣數據庫就恢復到了2015年10月20日的9點58分零秒。
然后再利用業務資料補充這段時間內的數據。
三、利用dbms_logmnr包從log文件中恢復
這個包是由Oracle提供,與dbms_logmnr_d包配合使用可以方便地分析聯機日志文件和歸檔日志文件,從這些日志文件中提取出所有對數據庫的更改操作。
在使用這個包之前,需要先做一些設置和修改:
1、打開initorcl.ora,修改初始化參數utl_file_dir,設置dbms_logmnr_d包將要使用的數據字典文件的放置目錄。
eb6dad504d6f5841641cbd02c5f6dee1.png
然后重啟數據庫使參數生效。
2、以sys用戶連接到數據庫執行dbmslmd.sql腳本重建dbms_logmnr_d這個包。
應用Logminer分析重做日志文件的操作主要有以下步驟:
● 使用dbms_logmnr_d里的存儲過程build創建一個外部數據字典文件;
● 使用dbms_logmnr里的存儲過程add_logfile添加要分析的日志文件;
● 使用dbms_logmnr里的存儲過程start_logmnr啟動分析;
● 查詢與dbms_logmnr相關的幾個視圖來獲取日志文件內容;
● 使用dbms_logmnr里的存儲過程end_logmnr結束分析。
▲下面詳細講述使用的過程
1、使用dbms_logmnr_d里的存儲過程build創建一個外部數據字典文件:
a0975e25f5049f1ffdfdd49ad7ae943d.png
2、使用dbms_logmnr里的存儲過程add_logfile添加要分析的日志文件到待分析文件列表:
d16ea343204a3a15b29bc6b94985d48d.png
如果沒有運行在歸檔模式,那么由于重做日志文件的循環使用可能導致日志文件被覆蓋而無法獲取到所要尋找的恢復條目。如果運行在歸檔模式,則可以通過查看$ORACLE_HOMEadminorclbdump目錄下的alert_orcl.log里日志文件歸檔的時間和錯誤操作的時間來確定加入哪些歸檔日志文件到待分析的文件列表中去。
eff89b61175131d3edda456d8d9bc18e.png
注意:執行以上過程時logfilename參數需要寫日志文件的全路徑,否則會報錯。重復以上操作直到把所有需要分析的文件都加到列表中去。這樣就可以啟動進行分析。
3、使用dbms_logmnr里的存儲過程start_logmnr啟動分析;
3630359ea5afa57b5ea51c89da5b8c41.png
這樣就可以通過下面的查詢來獲取日志文件的內容了。
4、查詢與dbms_logmnr相關的幾個視圖來獲取日志文件內容;
3f8098efdbe50d4b5b4a5311eab6b5d0.png
這樣就可以找出要恢復所需的語句。注意:v$logmnr_contents只對執行dbms_logmnr.start_logmnr的會話有效,如果通過其他會話或者使用dbms_logmnr.end_logmnr終止了分析,都將不能訪問v$logmnr_contents的數據。如果要使其他會話也能獲取到這些數據,可以通過另外建表來實現,如:
create table undo_sql as select * from v$logmnr_contents。
再對undo_sql進行授權,其他用戶就可以訪問v$logmnr_contents的數據了。
5、使用dbms_logmnr里的存儲過程end_logmnr結束分析。
使用完成以后用下面的命令來結束分析活動:exec dbms_logmnr.end_logmnr;
這樣就釋放了分配給logminer的資源(內存和數據結構)。
從上面的過程可知,如果是更新的數據量比較大,而日志文件比較小,就可能會導致日志文件的切換。如果沒有及時去挖掘日志文件(沒有運行在歸檔模式),那么可能會由于日志文件的循環使用而導致數據不可恢復。如果運行在歸檔模式,也可能由于需要分析的日志文件比較多而時間較長。
四、利用flashback新特性恢復數據
Oracle9i 開始提供了閃回查詢(Flashback Query)功能,對于誤刪除或者誤更新并且已經commit了的情況提供了簡便快捷的恢復方法;而在Oracle 提供閃回查詢之前,碰到這種情況只能通過備份來進行基于時間點的恢復或者使用logmnr挖掘日志來恢復,無疑這比閃回查詢要麻煩而且費時。
使用這個Flashback Query特性的前提條件:
1. 數據庫必須處于Automatic Undo Management 狀態。
9d9facd0a8d3e8675284d38f601525d1.png
2. 最大可以閃回查詢的時間段由UNDO_RETENTION 初始化參數(單位為秒)指定
b7a419e2f47bd4d31005ca2d9b4a7c58.png
可以通過ALTER SYSTEM SET UNDO_RETENTION = ;來動態修改參數值。
▲如何使用Flashback Query來恢復數據呢?
1. 通過SQL
28b1053a806762ec87261e80f0e8751f.png
使用SELECT 語句的AS OF 來進行閃回查詢,語法如下:
使用AS OF 關鍵字來對表,視圖或者物化視圖進行Flashback Query,如果指定了SCN,那么expr 部分必須是一個數字,如果指定了TIMESTAMP,那么expr 必須是一個timestamp類型的值。查詢結果將返回在指定的SCN 或者時間點上的數據。
下面我們使用scott 方案來作一個實驗。
24547dbf2f8f3515319435d98acc0f10.png
如果想在update 的子查詢部分使用AS OF,那么該查詢只能返回一條記錄,否則將會報錯。
可以通過添加一個臨時表作為中轉,然后再作更新,如下:
5605ae591ab357c7148787937df03e17.png
2.通過DBMS_FLASHBACK包來恢復
DBMS_FLASHBACK 包提供了以下幾個函數:
ENABLE_AT_TIME:設置當前SESSION 的閃回查詢時間
ENABLE_AT_SYSTEM_CHANGE_NUMBER:設置當前SESSION 的閃回查詢SCN
GET_SYSTEM_CHANGE_NUMBER:取得當前數據庫的SCN
DISABLE:關閉當前SESSION 的閃回查詢
當將一個SESSION 設置為閃回查詢模式之后,后續的查詢都會基于那個時間點或者SCN 的數據庫狀態,如果SESSION 結束,那么即使沒有明確指定DISABLE,閃回查詢也會自動失效。
當SESSION 運行在閃回查詢狀態時,不允許進行任何DML 和DDL 操作。如果要用DML操作來進行數據恢復就必須使用PL/SQL 游標。
▲示例:
fbaf8acfe357d8f21039d588c8b658df.png
通過上面的例子可以看出,只要這個修改的時間不早于sysdate- (UNDO_RETENTION指定的秒數),就可通過這種方式來恢復數據。
e93c4d7b11cf4e7c8ed9a0d27c79ea80.png
對于問題中的批量數據,可以寫個過程來完成獲取到更改前的數據:
然后再用這個臨時表里的數據來更新TFUNDASSET就可以了。
五、總結
比較以上幾種恢復數據的方法的使用過程,我們可以看出:
● exp/imp只適合于數據變化不大的表的數據丟失的情況,即使用這種方法處理后也需要從業務辦理資料中修正數據,否則導致數據丟失;
● 采用基于時間點的不完全恢復可以恢復丟失的數據,但是需要關關閉數據庫,減少系統可用時間,而且也會丟失恢復時間點以后的數據;
● 使用LogMiner可以較好的恢復數據,但是要求數據庫盡可能運行在歸檔模式,否則也可能導致數據丟失。好處是不用關閉系統,能夠從日志文件中得到所有的數據。
● 使用Flashback最方便和簡潔,可以直接得到修改前的數據,但是需要依賴系統設置,并且需要占用大量的回滾表空間。
因此選擇什么樣的方法來恢復數據,取決于你的系統環境和具體情況,不能生搬硬套。采用正確的方法才能最大程度的減少數據的丟失。
當然,最好是不需要用到這些恢復的辦法。前提是,你必須做好以下的工作:
1、 為不同環境創建不同的數據庫用戶、不同密碼(如果不能用戶不同,一定要密碼不同);
2、 將owner和應用用戶分開,并做適度授權;
3、 在做DML前,先用同樣的條件做查詢,看根據結果集是否符合預期。
備份一張表一般用create 備份表 as select * from 原表;
如果不想要這個備份,直接運行
drop table 備份表;
就可以,沒有回退的說法。
分享文章:oracle怎么回退備份,oracle 備份與恢復
網頁地址:http://m.kartarina.com/article16/hegsdg.html
成都網站建設公司_創新互聯,為您提供響應式網站、網站收錄、品牌網站建設、用戶體驗、Google、標簽優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯