偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Oracle數(shù)據(jù)庫(kù)數(shù)據(jù)丟失?這幾種方法教你來(lái)恢復(fù)~

數(shù)據(jù)庫(kù) Oracle
無(wú)論是開(kāi)發(fā)、測(cè)試還是運(yùn)維過(guò)程中,大家都可能會(huì)因?yàn)檎`操作、連錯(cuò)數(shù)據(jù)庫(kù)、用錯(cuò)用戶、語(yǔ)句條件有誤等原因,導(dǎo)致錯(cuò)誤刪除、錯(cuò)誤更新等問(wèn)題。當(dāng)你恨不得剁掉按回車(chē)的那個(gè)指頭、捶胸頓足、或者嚇得腿軟時(shí),肯定希望有辦法來(lái)恢復(fù)這些數(shù)據(jù)。oracle提供了一些強(qiáng)大的方法或機(jī)制,可以讓你找到“后悔藥”。

無(wú)論是開(kāi)發(fā)、測(cè)試還是運(yùn)維過(guò)程中,大家都可能會(huì)因?yàn)檎`操作、連錯(cuò)數(shù)據(jù)庫(kù)、用錯(cuò)用戶、語(yǔ)句條件有誤等原因,導(dǎo)致錯(cuò)誤刪除、錯(cuò)誤更新等問(wèn)題。當(dāng)你恨不得剁掉按回車(chē)的那個(gè)指頭、捶胸頓足、或者嚇得腿軟時(shí),肯定希望有辦法來(lái)恢復(fù)這些數(shù)據(jù)。剛好,oracle 提供了一些強(qiáng)大的方法或機(jī)制,可以讓你找到 “后悔藥”。

[[206463]] 

根據(jù) oracle 數(shù)據(jù)庫(kù)的特點(diǎn)和提供的工具,主要方法有以下幾種方法:

  • 利用邏輯備份使用 import 工具丟失數(shù)據(jù)的表
  • 利用物理備份來(lái)通過(guò)還原數(shù)據(jù)文件并進(jìn)行不完全恢復(fù)
  • 利用 dbms_logmnr 包從 redo log 文件中恢復(fù)
  • 利用 flashback 特性恢復(fù)數(shù)據(jù)

為了方便使用方法的介紹,上述恢復(fù)方法都將基于以下場(chǎng)景進(jìn)行:系統(tǒng)管理員在前一天晚上 11 點(diǎn)用 export 對(duì)數(shù)據(jù)庫(kù)做了全庫(kù)邏輯備份,然后對(duì)所有數(shù)據(jù)文件進(jìn)行了熱備份。第二天上午 10 點(diǎn),系統(tǒng)管理員在修改表 TFUNDASSET 的數(shù)據(jù)時(shí),由于修改語(yǔ)句的條件寫(xiě)錯(cuò)了,導(dǎo)致一批記錄(幾千條)的 ztm 字段被修改成了錯(cuò)誤的值,而且已經(jīng)提交。這個(gè)表是資產(chǎn)表,相對(duì)而言數(shù)據(jù)變化不頻繁。

一、利用邏輯備份使用 import 工具恢復(fù)丟失的數(shù)據(jù)

export/import 是 oracle 提供的用于對(duì)數(shù)據(jù)庫(kù)進(jìn)行邏輯備份的工具。該工具適用于備份那些數(shù)據(jù)量不大、業(yè)務(wù)量不多的數(shù)據(jù)庫(kù)系統(tǒng)。因?yàn)槿绻谇耙惶焱砩?11 點(diǎn)用 export 做了邏輯備份,那么當(dāng)今天上午 10 點(diǎn)數(shù)據(jù)庫(kù)意外崩潰時(shí),從備份起到數(shù)據(jù)庫(kù)崩潰的這段時(shí)間里的數(shù)據(jù)修改操作(包括 DDL 和 DML)都會(huì)丟失。如果丟失數(shù)據(jù)內(nèi)的表上的數(shù)據(jù)是相對(duì)比較穩(wěn)定,也就是說(shuō)該表上基本沒(méi)有 DML 操作,例如標(biāo)準(zhǔn)代碼表、分區(qū)表里的歷史數(shù)據(jù),那么采用 import 來(lái)導(dǎo)入該表可以比較完整的恢復(fù)數(shù)據(jù)。如果該表是經(jīng)常變化的業(yè)務(wù)表,那么這些丟失的數(shù)據(jù)只能根據(jù)業(yè)務(wù)情況從紙質(zhì)記錄恢復(fù),或者其他途徑恢復(fù)。

▲示例如下:這個(gè)表是一個(gè)資產(chǎn)表。相對(duì)來(lái)說(shuō),今天系統(tǒng)運(yùn)行中修改的數(shù)據(jù)較少,丟失的數(shù)據(jù)量可以承受或者可以從別的途徑恢復(fù)。那就可以用 import 來(lái)恢復(fù)。

方法一:

1、把這個(gè)表的數(shù)據(jù)備份到另一個(gè)表:

 

2、刪除該表的記錄: 

 

3、執(zhí)行下面的命令: 

 

這個(gè)命令中在關(guān)鍵字 tables 中指定需要導(dǎo)入的表名字,ignore=y 表示忽略表已經(jīng)存在的錯(cuò)誤。 

4、導(dǎo)入結(jié)束后,檢查表中的記錄,并用適當(dāng)?shù)姆椒ɑ謴?fù)當(dāng)天的修改。

方法二:

1、 把需要恢復(fù)的表導(dǎo)入到另一個(gè)用戶下面:

 

2、檢查數(shù)據(jù)以后,把原表記錄刪除: 

 

3、然后從另一用戶表中插入回去: 

 

4、 數(shù)據(jù)量比較大時(shí)可以采用如下方法: 

 

二、利用物理備份來(lái)通過(guò)還原數(shù)據(jù)文件并進(jìn)行不完全恢復(fù) 

如果數(shù)據(jù)庫(kù)運(yùn)行在歸檔模式下,那么可以通過(guò)使用以前的數(shù)據(jù)文件備份進(jìn)行還原,然后利用歸檔日志進(jìn)行前滾,直到回滾到錯(cuò)誤操作的時(shí)間點(diǎn)前,然后重置日志文件打開(kāi)數(shù)據(jù)庫(kù)。 

可以通過(guò)下列方法確認(rèn)是否是運(yùn)行在歸檔模式:

 

如果是如上所示,那么就是運(yùn)行在歸檔模式了。 

▲假定在前一天晚上 11 點(diǎn)做了全庫(kù)物理備份,那么可以考慮如下恢復(fù):

1、關(guān)閉數(shù)據(jù)庫(kù):

由于數(shù)據(jù)庫(kù)的不完全恢復(fù)必須在一個(gè)關(guān)閉的數(shù)據(jù)庫(kù)上實(shí)施,利用一個(gè)舊的數(shù)據(jù)庫(kù)的備份還原,然后用日志根據(jù)需要逐步前滾,而不能還原一個(gè)新的備份,再回退到某個(gè)時(shí)間點(diǎn)。

通知各客戶端數(shù)據(jù)庫(kù)將關(guān)閉,然后發(fā)出:

 

數(shù)據(jù)庫(kù)已經(jīng)關(guān)閉。 

已經(jīng)卸載數(shù)據(jù)庫(kù)。

ORACLE 例程已經(jīng)關(guān)閉。

2、確定錯(cuò)誤操作的時(shí)間:

可以根據(jù)操作員的估計(jì)來(lái)確定不完全恢復(fù)需要前滾停止的時(shí)間,也可以利用 LogMiner 來(lái)分析日志文件(這個(gè)工具將在后面介紹),找出錯(cuò)誤操作的準(zhǔn)確時(shí)間。

3、還原數(shù)據(jù)文件:

先對(duì)當(dāng)前的數(shù)據(jù)庫(kù)文件進(jìn)行備份,然后再用以前的最近一次備份覆蓋現(xiàn)有數(shù)據(jù)文件。注意:不覆蓋現(xiàn)有的控制文件。

4、基于時(shí)間點(diǎn)恢復(fù),啟動(dòng)數(shù)據(jù)庫(kù)到裝配狀態(tài):

 

這樣數(shù)據(jù)庫(kù)就恢復(fù)到了 2015 年 10 月 20 日的 9 點(diǎn) 58 分零秒。 

然后再利用業(yè)務(wù)資料補(bǔ)充這段時(shí)間內(nèi)的數(shù)據(jù)。

三、利用 dbms_logmnr 包從 log 文件中恢復(fù)

這個(gè)包是由 Oracle 提供,與 dbms_logmnr_d 包配合使用可以方便地分析聯(lián)機(jī)日志文件和歸檔日志文件,從這些日志文件中提取出所有對(duì)數(shù)據(jù)庫(kù)的更改操作。

在使用這個(gè)包之前,需要先做一些設(shè)置和修改:

1、打開(kāi) initorcl.ora,修改初始化參數(shù) utl_file_dir,設(shè)置 dbms_logmnr_d 包將要使用的數(shù)據(jù)字典文件的放置目錄。

 

然后重啟數(shù)據(jù)庫(kù)使參數(shù)生效。 

2、以 sys 用戶連接到數(shù)據(jù)庫(kù)執(zhí)行 dbmslmd.sql 腳本重建 dbms_logmnr_d 這個(gè)包。

應(yīng)用 Logminer 分析重做日志文件的操作主要有以下步驟:

  • 使用 dbms_logmnr_d 里的存儲(chǔ)過(guò)程 build 創(chuàng)建一個(gè)外部數(shù)據(jù)字典文件;
  • 使用 dbms_logmnr 里的存儲(chǔ)過(guò)程 add_logfile 添加要分析的日志文件;
  • 使用 dbms_logmnr 里的存儲(chǔ)過(guò)程 start_logmnr 啟動(dòng)分析;
  • 查詢與 dbms_logmnr 相關(guān)的幾個(gè)視圖來(lái)獲取日志文件內(nèi)容;
  • 使用 dbms_logmnr 里的存儲(chǔ)過(guò)程 end_logmnr 結(jié)束分析。

▲下面詳細(xì)講述使用的過(guò)程

1)使用 dbms_logmnr_d 里的存儲(chǔ)過(guò)程 build 創(chuàng)建一個(gè)外部數(shù)據(jù)字典文件:

 

2)使用 dbms_logmnr 里的存儲(chǔ)過(guò)程 add_logfile 添加要分析的日志文件到待分析文件列表: 

 

如果沒(méi)有運(yùn)行在歸檔模式,那么由于重做日志文件的循環(huán)使用可能導(dǎo)致日志文件被覆蓋而無(wú)法獲取到所要尋找的恢復(fù)條目。如果運(yùn)行在歸檔模式,則可以通過(guò)查看 $ORACLE_HOME\admin\orcl\bdump 目錄下的 alert_orcl.log 里日志文件歸檔的時(shí)間和錯(cuò)誤操作的時(shí)間來(lái)確定加入哪些歸檔日志文件到待分析的文件列表中去。 

 

注意:執(zhí)行以上過(guò)程時(shí) logfilename 參數(shù)需要寫(xiě)日志文件的全路徑,否則會(huì)報(bào)錯(cuò)。重復(fù)以上操作直到把所有需要分析的文件都加到列表中去。這樣就可以啟動(dòng)進(jìn)行分析。 

3)使用 dbms_logmnr 里的存儲(chǔ)過(guò)程 start_logmnr 啟動(dòng)分析;

 

這樣就可以通過(guò)下面的查詢來(lái)獲取日志文件的內(nèi)容了。 

4)查詢與 dbms_logmnr 相關(guān)的幾個(gè)視圖來(lái)獲取日志文件內(nèi)容;

 

這樣就可以找出要恢復(fù)所需的語(yǔ)句。注意:v$logmnr_contents 只對(duì)執(zhí)行 dbms_logmnr.start_logmnr 的會(huì)話有效,如果通過(guò)其他會(huì)話或者使用 dbms_logmnr.end_logmnr 終止了分析,都將不能訪問(wèn) v$logmnr_contents 的數(shù)據(jù)。如果要使其他會(huì)話也能獲取到這些數(shù)據(jù),可以通過(guò)另外建表來(lái)實(shí)現(xiàn),如: 

create table undo_sql as select * from v$logmnr_contents。

再對(duì) undo_sql 進(jìn)行授權(quán),其他用戶就可以訪問(wèn) v$logmnr_contents 的數(shù)據(jù)了。

5)使用 dbms_logmnr 里的存儲(chǔ)過(guò)程 end_logmnr 結(jié)束分析。

使用完成以后用下面的命令來(lái)結(jié)束分析活動(dòng):exec dbms_logmnr.end_logmnr;

這樣就釋放了分配給 logminer 的資源(內(nèi)存和數(shù)據(jù)結(jié)構(gòu))。

從上面的過(guò)程可知,如果是更新的數(shù)據(jù)量比較大,而日志文件比較小,就可能會(huì)導(dǎo)致日志文件的切換。如果沒(méi)有及時(shí)去挖掘日志文件(沒(méi)有運(yùn)行在歸檔模式),那么可能會(huì)由于日志文件的循環(huán)使用而導(dǎo)致數(shù)據(jù)不可恢復(fù)。如果運(yùn)行在歸檔模式,也可能由于需要分析的日志文件比較多而時(shí)間較長(zhǎng)。

四、利用 flashback 新特性恢復(fù)數(shù)據(jù)

Oracle9i 開(kāi)始提供了閃回查詢(Flashback Query)功能,對(duì)于誤刪除或者誤更新并且已經(jīng) commit 了的情況提供了簡(jiǎn)便快捷的恢復(fù)方法;而在 Oracle 提供閃回查詢之前,碰到這種情況只能通過(guò)備份來(lái)進(jìn)行基于時(shí)間點(diǎn)的恢復(fù)或者使用 logmnr 挖掘日志來(lái)恢復(fù),無(wú)疑這比閃回查詢要麻煩而且費(fèi)時(shí)。

使用這個(gè) Flashback Query 特性的前提條件:

1. 數(shù)據(jù)庫(kù)必須處于 Automatic Undo Management 狀態(tài)。

 

2. ***可以閃回查詢的時(shí)間段由 UNDO_RETENTION 初始化參數(shù)(單位為秒)指定 

 

可以通過(guò) ALTER SYSTEM SET UNDO_RETENTION = <seconds>; 來(lái)動(dòng)態(tài)修改參數(shù)值。 

▲如何使用 Flashback Query 來(lái)恢復(fù)數(shù)據(jù)呢?

1)通過(guò) SQL

使用 SELECT 語(yǔ)句的 AS OF 來(lái)進(jìn)行閃回查詢,語(yǔ)法如下:

 

使用 AS OF 關(guān)鍵字來(lái)對(duì)表,視圖或者物化視圖進(jìn)行 Flashback Query,如果指定了 SCN,那么 expr 部分必須是一個(gè)數(shù)字,如果指定了 TIMESTAMP,那么 expr 必須是一個(gè) timestamp 類(lèi)型的值。查詢結(jié)果將返回在指定的 SCN 或者時(shí)間點(diǎn)上的數(shù)據(jù)。 

下面我們使用 scott 方案來(lái)作一個(gè)實(shí)驗(yàn)。

 

如果想在 update 的子查詢部分使用 AS OF,那么該查詢只能返回一條記錄,否則將會(huì)報(bào)錯(cuò)。 

可以通過(guò)添加一個(gè)臨時(shí)表作為中轉(zhuǎn),然后再作更新,如下:

 

2)通過(guò) DBMS_FLASHBACK 包來(lái)恢復(fù) 

DBMS_FLASHBACK 包提供了以下幾個(gè)函數(shù):

  • ENABLE_AT_TIME:設(shè)置當(dāng)前 SESSION 的閃回查詢時(shí)間
  • ENABLE_AT_SYSTEM_CHANGE_NUMBER:設(shè)置當(dāng)前 SESSION 的閃回查詢 SCN
  • GET_SYSTEM_CHANGE_NUMBER:取得當(dāng)前數(shù)據(jù)庫(kù)的 SCN
  • DISABLE:關(guān)閉當(dāng)前 SESSION 的閃回查詢

當(dāng)將一個(gè) SESSION 設(shè)置為閃回查詢模式之后,后續(xù)的查詢都會(huì)基于那個(gè)時(shí)間點(diǎn)或者 SCN 的數(shù)據(jù)庫(kù)狀態(tài),如果 SESSION 結(jié)束,那么即使沒(méi)有明確指定 DISABLE,閃回查詢也會(huì)自動(dòng)失效。

當(dāng) SESSION 運(yùn)行在閃回查詢狀態(tài)時(shí),不允許進(jìn)行任何 DML 和 DDL 操作。如果要用 DML 操作來(lái)進(jìn)行數(shù)據(jù)恢復(fù)就必須使用 PL/SQL 游標(biāo)。

▲示例:

 

通過(guò)上面的例子可以看出,只要這個(gè)修改的時(shí)間不早于 sysdate- (UNDO_RETENTION 指定的秒數(shù)), 就可通過(guò)這種方式來(lái)恢復(fù)數(shù)據(jù)。 

對(duì)于問(wèn)題中的批量數(shù)據(jù),可以寫(xiě)個(gè)過(guò)程來(lái)完成獲取到更改前的數(shù)據(jù):

 

然后再用這個(gè)臨時(shí)表里的數(shù)據(jù)來(lái)更新 TFUNDASSET 就可以了。 

五、總結(jié)

比較以上幾種恢復(fù)數(shù)據(jù)的方法的使用過(guò)程,我們可以看出:

  • exp/imp 只適合于數(shù)據(jù)變化不大的表的數(shù)據(jù)丟失的情況,即使用這種方法處理后也需要從業(yè)務(wù)辦理資料中修正數(shù)據(jù),否則導(dǎo)致數(shù)據(jù)丟失;
  • 采用基于時(shí)間點(diǎn)的不完全恢復(fù)可以恢復(fù)丟失的數(shù)據(jù),但是需要關(guān)關(guān)閉數(shù)據(jù)庫(kù),減少系統(tǒng)可用時(shí)間,而且也會(huì)丟失恢復(fù)時(shí)間點(diǎn)以后的數(shù)據(jù);
  • 使用 LogMiner 可以較好的恢復(fù)數(shù)據(jù),但是要求數(shù)據(jù)庫(kù)盡可能運(yùn)行在歸檔模式,否則也可能導(dǎo)致數(shù)據(jù)丟失。好處是不用關(guān)閉系統(tǒng),能夠從日志文件中得到所有的數(shù)據(jù)。
  • 使用 Flashback 最方便和簡(jiǎn)潔,可以直接得到修改前的數(shù)據(jù),但是需要依賴(lài)系統(tǒng)設(shè)置,并且需要占用大量的回滾表空間。

因此選擇什么樣的方法來(lái)恢復(fù)數(shù)據(jù),取決于你的系統(tǒng)環(huán)境和具體情況,不能生搬硬套。采用正確的方法才能***程度的減少數(shù)據(jù)的丟失。

當(dāng)然,***是不需要用到這些恢復(fù)的辦法。前提是,你必須做好以下的工作:

  1. 為不同環(huán)境創(chuàng)建不同的數(shù)據(jù)庫(kù)用戶、不同密碼(如果不能用戶不同,一定要密碼不同);
  2. 將 owner 和應(yīng)用用戶分開(kāi),并做適度授權(quán);
  3. 在做 DML 前,先用同樣的條件做查詢,看根據(jù)結(jié)果集是否符合預(yù)期。  
責(zé)任編輯:龐桂玉 來(lái)源: ITPUB
相關(guān)推薦

2011-05-24 10:26:12

Oracle數(shù)據(jù)庫(kù)日志文件

2011-02-28 13:31:17

Oracle數(shù)據(jù)庫(kù)

2011-03-04 14:59:16

Raidoracle數(shù)據(jù)庫(kù)

2011-05-26 10:01:16

Oracle數(shù)據(jù)庫(kù)ODU

2010-09-08 13:53:10

.NET連接Sybas

2010-04-02 09:44:23

Oracle數(shù)據(jù)庫(kù)

2011-04-12 15:44:08

Oracle數(shù)據(jù)庫(kù)

2010-07-23 10:54:09

優(yōu)化SQL Serve

2011-08-01 14:50:10

日志挖掘數(shù)據(jù)庫(kù)

2009-11-20 13:29:59

Oracle數(shù)據(jù)庫(kù)恢復(fù)

2011-05-26 09:36:07

Oracle數(shù)據(jù)庫(kù)Redo故障

2010-11-19 14:51:09

Oracle數(shù)據(jù)庫(kù)關(guān)閉

2010-11-15 15:34:30

ORACLE數(shù)據(jù)庫(kù)恢復(fù)

2011-05-11 13:25:57

Oracle數(shù)據(jù)庫(kù)后備恢復(fù)

2009-04-03 10:54:49

Oracle備份恢復(fù)

2011-03-24 17:21:42

Oracle數(shù)據(jù)庫(kù)Redo故障

2009-04-20 14:29:41

Oracle連接創(chuàng)建連接

2009-12-14 16:00:32

Ruby操作Oracl

2011-08-29 16:41:14

OracleRMAN恢復(fù)數(shù)據(jù)文件的恢復(fù)

2010-05-04 11:58:38

Oracle數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)