重新創(chuàng)建索引:
成都一家集口碑和實力的網(wǎng)站建設服務商,擁有專業(yè)的企業(yè)建站團隊和靠譜的建站技術,十余年企業(yè)及個人網(wǎng)站建設經(jīng)驗 ,為成都上千客戶提供網(wǎng)頁設計制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設等服務,包括成都營銷型網(wǎng)站建設,高端網(wǎng)站設計,同時也為不同行業(yè)的客戶提供成都網(wǎng)站制作、做網(wǎng)站的服務,包括成都電商型網(wǎng)站制作建設,裝修行業(yè)網(wǎng)站制作建設,傳統(tǒng)機械行業(yè)網(wǎng)站建設,傳統(tǒng)農業(yè)行業(yè)網(wǎng)站制作建設。在成都做網(wǎng)站,選網(wǎng)站制作建設服務商就選創(chuàng)新互聯(lián)。
使用以下選項可縮短創(chuàng)建索引所花費的時間:
PARALLEL NOLOGGING
PARALLEL(NOPARALLEL 是默認值):多個進程可以同時協(xié)同工作來創(chuàng)建索引。與單個服務器進程按順序創(chuàng)建索引相比,通過在多個服務器進程之間分配創(chuàng)建索引所需的工作,Oracle 服務器可以更快速地創(chuàng)建索引。將隨機對表取樣并找到一組索引關鍵字,這些索引關鍵字按照指定的并行度將索引平均分為相同數(shù)目的片段。第一組查詢進程將掃描表,提取關鍵字、行 ID 對并基于關鍵字將每個對發(fā)送到第二組查詢進程中的一個進程中。第二組中的每個進程都對關鍵字進行排序并按常規(guī)方式構建索引。所有索引片段構建完成后,并行協(xié)調程序會將這些片段(已進行排序)級聯(lián)以形成最終的索引。
SQL CREATE INDEX rname_idx
ON hr.regions (region_name)
PARALLEL 4;
NOLOGGING:使用此關鍵字會加快索引的創(chuàng)建速度,因為創(chuàng)建進程創(chuàng)建的重做日志 條目極少。這種工作量大幅減小的重做生
成也適用于直接路徑插入和 Direct Loader (SQL*Loader) 插入。這是永久性屬性,因此將顯示在數(shù)據(jù)字典中。可以隨時使用
ALTER INDEX NOLOGGING/LOGGING 命令來加以更新。
注:若數(shù)據(jù)庫在nologging狀態(tài)時,所操作的數(shù)據(jù)應該備份,再將nologging改回來,以免重大失誤難以恢復
丟失了索引表空間后進行恢復:
索引丟失時,更為快速、簡單的方法是重新創(chuàng)建而不是嘗試恢復索引。
索引是計算得到的對象,因為它們不提供任何原始數(shù)據(jù),只是已存在數(shù)據(jù)的另一表示形式。因此,在大多數(shù)情況下,可以很容易地重新創(chuàng)建索引。
如果您的表空間僅包含索引,則可以簡化在丟失了屬于該表空間的數(shù)據(jù)文件后的恢復工作。
如果丟失了此類數(shù)據(jù)文件,則可以
執(zhí)行以下步驟:
1.刪除數(shù)據(jù)文件。
2.刪除表空間。
3.重新創(chuàng)建索引表空間。
4.重新創(chuàng)建包含在表空間中的索引。
1.可以在不執(zhí)行 RECOVER 任務的情況下恢復僅包含索引的表空間。
2.如果屬于僅包含索引的表空間的數(shù)據(jù)文件丟失,則更為簡單的方法可能是重新創(chuàng)建表空間和重新創(chuàng)建索引。
實驗:索引表空間數(shù)據(jù)文件丟失
1.創(chuàng)建實驗數(shù)據(jù);
delete時直接關閉oracle數(shù)據(jù)庫不會丟失。根據(jù)查詢相關公開信息這里面有全部數(shù)據(jù)庫,復制出來插入數(shù)據(jù)庫就可以了,有時候文件里面的日期數(shù)據(jù)格式會有問題,修改一下就可以了。
按照以下方式操作。
cmd命令行里面輸入sqlplus查看,將需要導入的dmp文件放在oracle11g的安裝目錄里面的./admin/orcl/dpdump目錄下面,打開cmd,直接輸入導入的命令:impdp 用戶名/密碼 dumpfile=文件名.dmp,eg:impdp uf01/uf01 dumpfile = U8C.dmp。
dmp文件是從一個Oracle 9i的數(shù)據(jù)庫上exp出來的,在導入Oracle 11g版本的時候,可能會隨機錯誤。
根據(jù)oracle數(shù)據(jù)庫的特點和提供的工具,主要方法有以下幾種方法:
利用邏輯備份使用import工具丟失數(shù)據(jù)的表
利用物理備份來通過還原數(shù)據(jù)文件并進行不完全恢復
利用dbms_logmnr包從redo log文件中恢復
利用flashback特性恢復數(shù)據(jù)
前提
為了方便使用方法的介紹,上述恢復方法都將基于以下場景進行:系統(tǒng)管理員在前一天晚上11點用export對數(shù)據(jù)庫做了全庫邏輯備份,然后對所有數(shù)據(jù)文件進行了熱備份。第二天上午10點,系統(tǒng)管理員在修改表TFUNDASSET的數(shù)據(jù)時,由于修改語句的條件寫錯了,導致一批記錄(幾千條)的ztm字段被修改成了錯誤的值,而且已經(jīng)提交。這個表是資產(chǎn)表,相對而言數(shù)據(jù)變化不頻繁。
一、利用邏輯備份使用import工具恢復丟失的數(shù)據(jù)
export/import是oracle提供的用于對數(shù)據(jù)庫進行邏輯備份的工具。該工具適用于備份那些數(shù)據(jù)量不大、業(yè)務量不多的數(shù)據(jù)庫系統(tǒng)。因為如果在前一天晚上11點用export做了邏輯備份,那么當今天上午10點數(shù)據(jù)庫意外崩潰時,從備份起到數(shù)據(jù)庫崩潰的這段時間里的數(shù)據(jù)修改操作(包括DDL和DML)都會丟失。如果丟失數(shù)據(jù)內的表上的數(shù)據(jù)是相對比較穩(wěn)定,也就是說該表上基本沒有DML操作,例如標準代碼表、分區(qū)表里的歷史數(shù)據(jù),那么采用import來導入該表可以比較完整的恢復數(shù)據(jù)。如果該表是經(jīng)常變化的業(yè)務表,那么這些丟失的數(shù)據(jù)只能根據(jù)業(yè)務情況從紙質記錄恢復,或者其他途徑恢復。
▲示例如下:這個表是一個資產(chǎn)表。相對來說,今天系統(tǒng)運行中修改的數(shù)據(jù)較少,丟失的數(shù)據(jù)量可以承受或者可以從別的途徑恢復。那就可以用import來恢復。
方法一:
1、把這個表的數(shù)據(jù)備份到另一個表:
8bef9890242e5d20d09563896cef1471.png
2、刪除該表的記錄:
625dfa5d5986ca5c37dd5017953407cb.png
3、執(zhí)行下面的命令:
3754d50cc473bd44236d927f00196d24.png
這個命令中在關鍵字tables中指定需要導入的表名字,ignore=y表示忽略表已經(jīng)存在的錯誤。
4、導入結束后,檢查表中的記錄,并用適當?shù)姆椒ɑ謴彤斕斓男薷摹?/p>
方法二:
1、 把需要恢復的表導入到另一個用戶下面:
33806d1216df5ae9c45890d3d45930ee.png
2、檢查數(shù)據(jù)以后,把原表記錄刪除:
fe23a8a4602702e951e5ab48a7460e3b.png
3、然后從另一用戶表中插入回去:
729976810ef459046df40b791a6ca773.png
4、 數(shù)據(jù)量比較大時可以采用如下方法:
e377d10ff07132f160185cb1ba119cfc.png
二、利用物理備份來通過還原數(shù)據(jù)文件并進行不完全恢復
如果數(shù)據(jù)庫運行在歸檔模式下,那么可以通過使用以前的數(shù)據(jù)文件備份進行還原,然后利用歸檔日志進行前滾,直到回滾到錯誤操作的時間點前,然后重置日志文件打開數(shù)據(jù)庫。
可以通過下列方法確認是否是運行在歸檔模式:
c8406e42aef7ccc8ef232cfdd535e825.png
如果是如上所示,那么就是運行在歸檔模式了。
▲假定在前一天晚上11點做了全庫物理備份,那么可以考慮如下恢復:
1、關閉數(shù)據(jù)庫:
由于數(shù)據(jù)庫的不完全恢復必須在一個關閉的數(shù)據(jù)庫上實施,利用一個舊的數(shù)據(jù)庫的備份還原,然后用日志根據(jù)需要逐步前滾,而不能還原一個新的備份,再回退到某個時間點。
通知各客戶端數(shù)據(jù)庫將關閉,然后發(fā)出:
401f68e89cbfa03388f5913bf5f1ecfd.png
數(shù)據(jù)庫已經(jīng)關閉。
已經(jīng)卸載數(shù)據(jù)庫。
ORACLE 例程已經(jīng)關閉。
2、確定錯誤操作的時間:
可以根據(jù)操作員的估計來確定不完全恢復需要前滾停止的時間,也可以利用LogMiner來分析日志文件(這個工具將在后面介紹),找出錯誤操作的準確時間。
3、還原數(shù)據(jù)文件:
先對當前的數(shù)據(jù)庫文件進行備份,然后再用以前的最近一次備份覆蓋現(xiàn)有數(shù)據(jù)文件。注意:不覆蓋現(xiàn)有的控制文件。
4、基于時間點恢復,啟動數(shù)據(jù)庫到裝配狀態(tài):
8802043c250eb2a060285be160f48c36.png
這樣數(shù)據(jù)庫就恢復到了2015年10月20日的9點58分零秒。
然后再利用業(yè)務資料補充這段時間內的數(shù)據(jù)。
三、利用dbms_logmnr包從log文件中恢復
這個包是由Oracle提供,與dbms_logmnr_d包配合使用可以方便地分析聯(lián)機日志文件和歸檔日志文件,從這些日志文件中提取出所有對數(shù)據(jù)庫的更改操作。
在使用這個包之前,需要先做一些設置和修改:
1、打開initorcl.ora,修改初始化參數(shù)utl_file_dir,設置dbms_logmnr_d包將要使用的數(shù)據(jù)字典文件的放置目錄。
eb6dad504d6f5841641cbd02c5f6dee1.png
然后重啟數(shù)據(jù)庫使參數(shù)生效。
2、以sys用戶連接到數(shù)據(jù)庫執(zhí)行dbmslmd.sql腳本重建dbms_logmnr_d這個包。
應用Logminer分析重做日志文件的操作主要有以下步驟:
● 使用dbms_logmnr_d里的存儲過程build創(chuàng)建一個外部數(shù)據(jù)字典文件;
● 使用dbms_logmnr里的存儲過程add_logfile添加要分析的日志文件;
● 使用dbms_logmnr里的存儲過程start_logmnr啟動分析;
● 查詢與dbms_logmnr相關的幾個視圖來獲取日志文件內容;
● 使用dbms_logmnr里的存儲過程end_logmnr結束分析。
▲下面詳細講述使用的過程
1、使用dbms_logmnr_d里的存儲過程build創(chuàng)建一個外部數(shù)據(jù)字典文件:
a0975e25f5049f1ffdfdd49ad7ae943d.png
2、使用dbms_logmnr里的存儲過程add_logfile添加要分析的日志文件到待分析文件列表:
d16ea343204a3a15b29bc6b94985d48d.png
如果沒有運行在歸檔模式,那么由于重做日志文件的循環(huán)使用可能導致日志文件被覆蓋而無法獲取到所要尋找的恢復條目。如果運行在歸檔模式,則可以通過查看$ORACLE_HOMEadminorclbdump目錄下的alert_orcl.log里日志文件歸檔的時間和錯誤操作的時間來確定加入哪些歸檔日志文件到待分析的文件列表中去。
eff89b61175131d3edda456d8d9bc18e.png
注意:執(zhí)行以上過程時logfilename參數(shù)需要寫日志文件的全路徑,否則會報錯。重復以上操作直到把所有需要分析的文件都加到列表中去。這樣就可以啟動進行分析。
3、使用dbms_logmnr里的存儲過程start_logmnr啟動分析;
3630359ea5afa57b5ea51c89da5b8c41.png
這樣就可以通過下面的查詢來獲取日志文件的內容了。
4、查詢與dbms_logmnr相關的幾個視圖來獲取日志文件內容;
3f8098efdbe50d4b5b4a5311eab6b5d0.png
這樣就可以找出要恢復所需的語句。注意:v$logmnr_contents只對執(zhí)行dbms_logmnr.start_logmnr的會話有效,如果通過其他會話或者使用dbms_logmnr.end_logmnr終止了分析,都將不能訪問v$logmnr_contents的數(shù)據(jù)。如果要使其他會話也能獲取到這些數(shù)據(jù),可以通過另外建表來實現(xiàn),如:
create table undo_sql as select * from v$logmnr_contents。
再對undo_sql進行授權,其他用戶就可以訪問v$logmnr_contents的數(shù)據(jù)了。
5、使用dbms_logmnr里的存儲過程end_logmnr結束分析。
使用完成以后用下面的命令來結束分析活動:exec dbms_logmnr.end_logmnr;
這樣就釋放了分配給logminer的資源(內存和數(shù)據(jù)結構)。
從上面的過程可知,如果是更新的數(shù)據(jù)量比較大,而日志文件比較小,就可能會導致日志文件的切換。如果沒有及時去挖掘日志文件(沒有運行在歸檔模式),那么可能會由于日志文件的循環(huán)使用而導致數(shù)據(jù)不可恢復。如果運行在歸檔模式,也可能由于需要分析的日志文件比較多而時間較長。
四、利用flashback新特性恢復數(shù)據(jù)
Oracle9i 開始提供了閃回查詢(Flashback Query)功能,對于誤刪除或者誤更新并且已經(jīng)commit了的情況提供了簡便快捷的恢復方法;而在Oracle 提供閃回查詢之前,碰到這種情況只能通過備份來進行基于時間點的恢復或者使用logmnr挖掘日志來恢復,無疑這比閃回查詢要麻煩而且費時。
使用這個Flashback Query特性的前提條件:
1. 數(shù)據(jù)庫必須處于Automatic Undo Management 狀態(tài)。
9d9facd0a8d3e8675284d38f601525d1.png
2. 最大可以閃回查詢的時間段由UNDO_RETENTION 初始化參數(shù)(單位為秒)指定
b7a419e2f47bd4d31005ca2d9b4a7c58.png
可以通過ALTER SYSTEM SET UNDO_RETENTION = ;來動態(tài)修改參數(shù)值。
▲如何使用Flashback Query來恢復數(shù)據(jù)呢?
1. 通過SQL
28b1053a806762ec87261e80f0e8751f.png
使用SELECT 語句的AS OF 來進行閃回查詢,語法如下:
使用AS OF 關鍵字來對表,視圖或者物化視圖進行Flashback Query,如果指定了SCN,那么expr 部分必須是一個數(shù)字,如果指定了TIMESTAMP,那么expr 必須是一個timestamp類型的值。查詢結果將返回在指定的SCN 或者時間點上的數(shù)據(jù)。
下面我們使用scott 方案來作一個實驗。
24547dbf2f8f3515319435d98acc0f10.png
如果想在update 的子查詢部分使用AS OF,那么該查詢只能返回一條記錄,否則將會報錯。
可以通過添加一個臨時表作為中轉,然后再作更新,如下:
5605ae591ab357c7148787937df03e17.png
2.通過DBMS_FLASHBACK包來恢復
DBMS_FLASHBACK 包提供了以下幾個函數(shù):
ENABLE_AT_TIME:設置當前SESSION 的閃回查詢時間
ENABLE_AT_SYSTEM_CHANGE_NUMBER:設置當前SESSION 的閃回查詢SCN
GET_SYSTEM_CHANGE_NUMBER:取得當前數(shù)據(jù)庫的SCN
DISABLE:關閉當前SESSION 的閃回查詢
當將一個SESSION 設置為閃回查詢模式之后,后續(xù)的查詢都會基于那個時間點或者SCN 的數(shù)據(jù)庫狀態(tài),如果SESSION 結束,那么即使沒有明確指定DISABLE,閃回查詢也會自動失效。
當SESSION 運行在閃回查詢狀態(tài)時,不允許進行任何DML 和DDL 操作。如果要用DML操作來進行數(shù)據(jù)恢復就必須使用PL/SQL 游標。
▲示例:
fbaf8acfe357d8f21039d588c8b658df.png
通過上面的例子可以看出,只要這個修改的時間不早于sysdate- (UNDO_RETENTION指定的秒數(shù)),就可通過這種方式來恢復數(shù)據(jù)。
e93c4d7b11cf4e7c8ed9a0d27c79ea80.png
對于問題中的批量數(shù)據(jù),可以寫個過程來完成獲取到更改前的數(shù)據(jù):
然后再用這個臨時表里的數(shù)據(jù)來更新TFUNDASSET就可以了。
五、總結
比較以上幾種恢復數(shù)據(jù)的方法的使用過程,我們可以看出:
● exp/imp只適合于數(shù)據(jù)變化不大的表的數(shù)據(jù)丟失的情況,即使用這種方法處理后也需要從業(yè)務辦理資料中修正數(shù)據(jù),否則導致數(shù)據(jù)丟失;
● 采用基于時間點的不完全恢復可以恢復丟失的數(shù)據(jù),但是需要關關閉數(shù)據(jù)庫,減少系統(tǒng)可用時間,而且也會丟失恢復時間點以后的數(shù)據(jù);
● 使用LogMiner可以較好的恢復數(shù)據(jù),但是要求數(shù)據(jù)庫盡可能運行在歸檔模式,否則也可能導致數(shù)據(jù)丟失。好處是不用關閉系統(tǒng),能夠從日志文件中得到所有的數(shù)據(jù)。
● 使用Flashback最方便和簡潔,可以直接得到修改前的數(shù)據(jù),但是需要依賴系統(tǒng)設置,并且需要占用大量的回滾表空間。
因此選擇什么樣的方法來恢復數(shù)據(jù),取決于你的系統(tǒng)環(huán)境和具體情況,不能生搬硬套。采用正確的方法才能最大程度的減少數(shù)據(jù)的丟失。
當然,最好是不需要用到這些恢復的辦法。前提是,你必須做好以下的工作:
1、 為不同環(huán)境創(chuàng)建不同的數(shù)據(jù)庫用戶、不同密碼(如果不能用戶不同,一定要密碼不同);
2、 將owner和應用用戶分開,并做適度授權;
3、 在做DML前,先用同樣的條件做查詢,看根據(jù)結果集是否符合預期。