任何軟件都有可能在有意或無(wú)意的情況下被重新安裝,如Oracle重裝后數(shù)據(jù)庫(kù)怎么恢復(fù)呢?情況發(fā)生在你是無(wú)意的情況下!ORACLE數(shù)據(jù)庫(kù)恢復(fù)的方法我們經(jīng)常會(huì)用到,下面就為您介紹重裝系統(tǒng)后ORACLE數(shù)據(jù)庫(kù)恢復(fù)的方法,希望對(duì)您學(xué)習(xí)ORACLE數(shù)據(jù)庫(kù)恢復(fù)方面能有所幫助。\x0d\x0a\x0d\x0a我的電腦突然掛了,不得不重裝系統(tǒng),不過(guò)我的ORACLE裝在了D盤,所有的文件都還在,我相信一定能夠恢復(fù),直到搞定工作,我才開始整我的數(shù)據(jù)庫(kù),花了兩天時(shí)間,終于恢復(fù)了,慶祝一下,同時(shí)總結(jié)一下,希望有遇到同樣問(wèn)題的朋友能夠快速搞定此類問(wèn)題\x0d\x0a\x0d\x0a第一種:\x0d\x0a\x0d\x0a首先,備份數(shù)據(jù)庫(kù)(X:\oracle\oradata)下的數(shù)據(jù)文件,重新命名即可(否則裝數(shù)據(jù)庫(kù)的時(shí)候會(huì)提示sid已存在)。重新安裝數(shù)據(jù)\x0d\x0a庫(kù),當(dāng)然數(shù)據(jù)庫(kù)的名字就是你要恢復(fù)的名字。安裝完成后,打開控制面板,停止oracle的服務(wù)。把(X:\oracle\oradata)下新生成的文件\x0d\x0a改名,把原先目錄下的文件恢復(fù)名字。再重新啟動(dòng)oracle服務(wù)和監(jiān)聽。用sys/as dba \x0d\x0a登陸數(shù)據(jù)庫(kù),可能會(huì)提示權(quán)限不夠(ora-01031)修改(X:\oracle\ora92\network\admin \x0d\x0a)文件夾下的sqlnet.ora文件,添加SQLNET.AUTHENTICATION_SERVICES= \x0d\x0a(NTS),增加權(quán)限。登陸進(jìn)去后,打開table提示不能打開。打開common頁(yè),執(zhí)行命令alert database \x0d\x0aopen;這時(shí)再刷新table,發(fā)現(xiàn)原先的表可以打開了?;謴?fù)成功了。再用原先數(shù)據(jù)庫(kù)的普通用戶進(jìn)入。發(fā)現(xiàn)一切正常。至此,大功告成。\x0d\x0a\x0d\x0a第二種:\x0d\x0a\x0d\x0a1、首先,將原來(lái)的ORACLE文件夾改名,原來(lái)的路徑是D:/oracle.我暫時(shí)改成D:/oracle_old.找來(lái)ORACLE(我用\x0d\x0a的是ORACLE 9I)安裝光盤,將ORACLE安裝在原來(lái)安裝的目錄下,這樣恢復(fù)起來(lái)更加方便,主要是注冊(cè)表的內(nèi)容不用修改。\x0d\x0a\x0d\x0a2、安裝完了之后,系統(tǒng)中又有一個(gè)可以使用的ORACLE了。這個(gè)時(shí)候要做的就是將原來(lái)的文件和數(shù)據(jù)恢復(fù)過(guò)來(lái)。第一步,先關(guān)閉ORACLE的所\x0d\x0a有已經(jīng)啟動(dòng)的項(xiàng)目,在"服務(wù)"里面逐一關(guān)閉。然后,將安裝目錄改名。我現(xiàn)在用的是D:/oracle.改成D:/oracle_new.再將D:\x0d\x0a/oracle_old改成D:/oracle. \x0d\x0a這樣理論上說(shuō)從物理層面恢復(fù)了ORACLE了。但是我們發(fā)現(xiàn),現(xiàn)在還不能啟動(dòng)ORACLE的監(jiān)聽程序和服務(wù)程序。我們還要從邏輯上解決。\x0d\x0a\x0d\x0a3、在dos環(huán)境下執(zhí)行一個(gè)刪除命令:oradim -delete -sid mm,其中mm為創(chuàng)建oracle時(shí)候創(chuàng)建的實(shí)例 \x0d\x0a建議執(zhí)行這個(gè)命令后重新啟動(dòng)機(jī)器,重啟后就可以建立和原來(lái)實(shí)例名相同的實(shí)例。當(dāng)然你懶,不重新啟動(dòng)也可以,但是你的實(shí)例名就不能和原來(lái)的一樣了。\x0d\x0a\x0d\x0a4、在dos環(huán)境下執(zhí)行命令 oradim -new -sid mm -startmode a -pfile "D:\oracle\admin\mm\pfile\initmm.ora "創(chuàng)建一個(gè)新的實(shí)例,其中 "mm"為新數(shù)據(jù)庫(kù)的名稱。\x0d\x0a\x0d\x0a5、啟動(dòng)服務(wù),先打開數(shù)據(jù)庫(kù),然后可以用以前的用戶名和密碼登陸進(jìn)去。 \x0d\x0a要補(bǔ)充的是,一般的ORACLE數(shù)據(jù)庫(kù)的監(jiān)聽程序都是用電腦的名稱來(lái)識(shí)別地址的,而不是127.0.0.1或者localhost.所以,如果我們安裝系\x0d\x0a統(tǒng)的時(shí)候用的是不同的電腦名稱(比如我原來(lái)用的是wm_mm.重新安裝后用的是wenming_mm),那么我們還有一個(gè)工作要做,就是修改文件 \x0d\x0alistener.ora.將里面的相關(guān)的東西改過(guò)來(lái)就可以了。\x0d\x0a\x0d\x0a需要耐心、細(xì)心,可能在一步里有一個(gè)細(xì)小的差別就會(huì)出些古怪的錯(cuò)誤提示,有時(shí)需要根據(jù)錯(cuò)誤提示采取策略,總之原理是,先裝一個(gè)一模一樣的ORACLE,安裝目錄、數(shù)據(jù)庫(kù)名稱都一樣,這樣保證注冊(cè)表里不用更改;再覆蓋物理文件,最后重新實(shí)例化,打開數(shù)據(jù)庫(kù)就可以進(jìn)去了。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了海城免費(fèi)建站歡迎大家使用!
不知道你重裝前都備份了哪些文件,只要你那五種文件都有備份,恢復(fù)起來(lái)不是很難。主要?dú)w納為以下幾步:
1.將原來(lái)的oracle文件夾重命名,比如oracle_old;然后重新安裝oracle
到原目錄,即跟重裝操作系統(tǒng)前同一目錄,假設(shè)為d:\oracle;安裝過(guò)程選擇"只安裝軟件"
即不創(chuàng)建數(shù)據(jù)庫(kù),這樣可以節(jié)省很多時(shí)間.
注:恢復(fù)必須要有以下文件
a、初始化參數(shù)文件INIT.ORA
b、所有數(shù)據(jù)文件 .dbf
c、所有重做日志文件(聯(lián)機(jī)日志、歸檔日志)redo
d、所有控制文件 crtl
e、internal密碼文件
2.配置listener和tns:
運(yùn)行l(wèi)snrctl start,即可在創(chuàng)建監(jiān)聽服務(wù);
使用net manager配置tns,但不要測(cè)試(數(shù)據(jù)庫(kù)沒(méi)有起來(lái)肯定測(cè)試不通過(guò)的);
3.將oradata文件夾拷貝回原目錄(如d:oracleoradata);
4.將spfile拷貝回原目錄(如d:oracleora92database);
5.創(chuàng)建實(shí)例服務(wù):
oradim -new -sid orcl -startmode auto
6.重建口令文件:或是復(fù)制原來(lái)的pwdorcl.ora yhy9為實(shí)例名
orapwd file=d:oracleora92database password=orcl entries=5
7.重啟監(jiān)聽和實(shí)例.
8.如果數(shù)據(jù)庫(kù)沒(méi)有啟動(dòng)就進(jìn)入sqlplus手工打開數(shù)據(jù)庫(kù)
sqlplus /nolog
sqlconn sys/orcl@orcl as sysdba
sqlstartup;
一定要有提示成功打開,否則重復(fù)以上辦法解決。
9.如果數(shù)據(jù)庫(kù)順利打開,整個(gè)實(shí)例恢復(fù)過(guò)程即完成.
經(jīng)驗(yàn)證通過(guò)以上操作,完全可以恢復(fù)成功。需要的是耐心、細(xì)心。
如果中間有報(bào)錯(cuò),則一步步根據(jù)報(bào)錯(cuò)到網(wǎng)上查找解決辦法。
Oracle認(rèn)證:Oracle控制件文件修復(fù)
查看文件頭SCN號(hào):
SQL select file#, checkpoint_change# from v;
FILE# CHECKPOINT_CHANGE#
1 18120070
2 18120070
3 18120070
4 18120070
5 18120070
6 18120070
7 18120070
8 18120070
9 18120070
10 18120070
11 18121207
FILE# CHECKPOINT_CHANGE#
12 18121196
12 rows selected.
查看控制文件SCN號(hào):
SQL select file#, checkpoint_change# from v;
FILE# CHECKPOINT_CHANGE#
1 18120070
2 18120070
3 18120070
4 18120070
5 18120070
6 18120070
7 18120070
8 18120070
9 18120070
10 18120070
11 18121207
FILE# CHECKPOINT_CHANGE#
12 18121196
12 rows selected.
SQL
當(dāng)數(shù)據(jù)文件SCN號(hào)大于控制文件scn號(hào),即會(huì)發(fā)生控制文件太久的提示,
當(dāng)數(shù)據(jù)文件SCN號(hào)小于控制文件scn號(hào)時(shí), 則提示mediea recovery提示
當(dāng)數(shù)據(jù)文件sCN號(hào)等于控制文件scn號(hào),正常啟動(dòng)實(shí)例
SQL alter database backup controlfile to trace as '/u01/Oracle/admin/ora9i/udump/c.trc';
Database altered.
SQL
/u01/Oracle/oradata/ora9i
[oracle@test ora9i]$ rm control0*
[oracle@test ora9i]$
SQL shutdown immediate;
ORA-00210: cannot open the specified controlfile
ORA-00202: controlfile: '/u01/Oracle/oradata/ora9i/control01.ctl'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
SQL shutdown abort;
ORACLE instance shut down.
SQL
修改備份c.trc文件使用第一個(gè)sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORA9I" NORESETLOGS ARCHIVELOG
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 '/u01/Oracle/oradata/ora9i/redo01.log' SIZE 100M,
GROUP 2 '/u01/Oracle/oradata/ora9i/redo02.log' SIZE 100M,
GROUP 3 '/u01/Oracle/oradata/ora9i/redo03.log' SIZE 100M
DATAFILE
'/u01/Oracle/oradata/ora9i/system01.dbf',
'/u01/Oracle/oradata/ora9i/undotbs01.dbf',
'/u01/Oracle/oradata/ora9i/cwmlite01.dbf',
'/u01/Oracle/oradata/ora9i/drsys01.dbf',
'/u01/Oracle/oradata/ora9i/example01.dbf',
'/u01/Oracle/oradata/ora9i/indx01.dbf',
'/u01/Oracle/oradata/ora9i/odm01.dbf',
'/u01/Oracle/oradata/ora9i/tools01.dbf',
'/u01/Oracle/oradata/ora9i/users01.dbf',
'/u01/Oracle/oradata/ora9i/xdb01.dbf',
'/u01/Oracle/oradata/ora9i/app2.dbf',
'/u01/Oracle/oradata/ora9i/app1_01.dbf'
CHARACTER SET ZHS16GBK
;
# Configure RMAN configuration record 1
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
# Recovery is required if any of the datafiles are restored backups,
# or if the last shutdown was not normal or immediate.
RECOVER DATABASE
# All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
# Database can now be opened normally.
ALTER DATABASE OPEN;
# Commands to add tempfiles to temporary tablespaces.
# Online tempfiles have complete space information.
# Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/Oracle/oradata/ora9i/temp01.dbf' REUSE;
# End of tempfile additions.
# ;
Oracle數(shù)據(jù)恢復(fù)專題
備份恢復(fù)是Oracle中永恒的話題, 只要有數(shù)據(jù) 就有備份恢復(fù)的需求。 而在國(guó)內(nèi)對(duì)于備份以及備份的可用性往往被企業(yè)所忽視。這造成了再數(shù)據(jù)庫(kù)恢復(fù)上存在著東西方的差異。 更多的老外DBA把經(jīng)歷花在對(duì)Oracle內(nèi)部原理和性能優(yōu)化的研究上。
oracle data block structure
而我們國(guó)內(nèi) DBA似乎必須要精通一門額外的技術(shù)==》 在沒(méi)有任何備份的情況下 恢復(fù)Oracle數(shù)據(jù)庫(kù)中數(shù)據(jù)的技術(shù)! 雖然這在大多數(shù)情況下是屠龍之技, 但很多時(shí)候卻又變成了衡量一個(gè)DBA技術(shù)水準(zhǔn)的標(biāo)準(zhǔn)了,(這樣不好.. 不好)。
當(dāng)然也并不是說(shuō) 這種無(wú)備份下的數(shù)據(jù)恢復(fù)是無(wú)技術(shù)含金量的,實(shí)際上它們很需要對(duì)Oracle數(shù)據(jù)文件、數(shù)據(jù)塊及其數(shù)據(jù)結(jié)構(gòu)的理解,以及對(duì)數(shù)據(jù)字典構(gòu)成的了解。
這里我們總結(jié)Oracle數(shù)據(jù)恢復(fù)專題的專題,包括一些在無(wú)備份情況下的數(shù)據(jù)恢復(fù):例如DUL和BBED工具恢復(fù)等技術(shù)。
【數(shù)據(jù)恢復(fù)】利用構(gòu)造ROWID實(shí)現(xiàn)無(wú)備份情況下繞過(guò)ORA-1578、ORA-8103、ORA-1410等邏輯/物理壞塊問(wèn)題
【數(shù)據(jù)恢復(fù)】ORA-600[kccpb_sanity_check_2]一例
Oracle rman中set newname可能很慢
如何清除Oracle控制文件中的無(wú)用記錄,例如v$archived_log中的deleted歸檔日志記錄
如何找回被create or replace覆蓋的PL/SQL對(duì)象
Archivelog Completed Before VS UNTIL TIME
ASM丟失disk header導(dǎo)致ORA-15032、ORA-15040、ORA-15042 Diskgroup無(wú)法mount
Overcome ORA-600[4xxx] open database
數(shù)據(jù)恢復(fù):解決ORA-600[kghstack_free2][kghstack_err+0068]一例
清理RMAN Catalog恢復(fù)目錄
如何rename datafile name中存在亂碼的數(shù)據(jù)文件
11g新特性recover corruption list
解決ORA-01578錯(cuò)誤一例
Script:收集介質(zhì)恢復(fù)診斷信息
如何重建SYSAUX表空間上的對(duì)象
Oracle數(shù)據(jù)恢復(fù):解決ORA-00600:[4000] ORA-00704: bootstrap process failure錯(cuò)誤一例
Script:檢查數(shù)據(jù)庫(kù)當(dāng)前是否有備份操作在執(zhí)行中
數(shù)據(jù)恢復(fù):模擬2個(gè)邏輯壞塊
Script:收集Oracle備份恢復(fù)信息
Oracle備份恢復(fù):Rman Backup緩慢問(wèn)題一例
了解rman catalog的兼容性
Oracle內(nèi)部錯(cuò)誤:ORA-00600[2608]一例
使用bbed解決ORA-01189錯(cuò)誤
Fractured block found during backing up datafile
手動(dòng)遞增SCN號(hào)的幾種方法:How to increase System Change Number by manual
DBMS_REPAIR example
Oracle的損壞/壞塊 主要分以下幾種:
ORA-1578
ORA-8103
ORA-1410
ORA-1499
ORA-1578
ORA-81##
ORA-14##
ORA-26040
ORA-600 Errors
Block Corruption
Index Corruption
Row Corruption
UNDO Corruption
Control File
Consistent Read
Dictionary
File/RDBA/BL
一種方法是重裝數(shù)據(jù)庫(kù)后用IMP來(lái)導(dǎo)入原來(lái)的數(shù)據(jù),但使用這種方法的前提是你有以前數(shù)據(jù)的備份,并且這種方法還有許多不足的地方,如備份過(guò)舊,可能會(huì)丟失許多數(shù)據(jù)、導(dǎo)入數(shù)據(jù)太長(zhǎng)等。
一般情況下我們可以采用重用原來(lái)的數(shù)據(jù)庫(kù)的方法來(lái)恢復(fù)。在講步驟前先說(shuō)說(shuō)這種方法的原理。
數(shù) 據(jù)庫(kù)與實(shí)例對(duì)應(yīng),當(dāng)數(shù)據(jù)庫(kù)服務(wù)啟動(dòng)后,我們可以用SQLPLUS "/AS SYSDBA"方法連接到一個(gè)空閑的例程,當(dāng)執(zhí)行startup啟動(dòng)數(shù)據(jù)庫(kù)時(shí),首先會(huì)在%ORACLE_HOME%/database下找當(dāng)前SID對(duì)應(yīng) 的參數(shù)文件(PFILE或者SPFILE)和密碼文件,然后啟動(dòng)例程;接著根據(jù)參數(shù)文件記錄的信息找到控制文件,讀取控制文件的信息,這就是mount數(shù) 據(jù)庫(kù)了;最終根據(jù)控制文件的信息打開數(shù)據(jù)庫(kù)。這個(gè)過(guò)程相當(dāng)于對(duì)數(shù)據(jù)庫(kù)著了一次冷備份的恢復(fù)。
下面的具體步驟:(我們假設(shè)原庫(kù)的所有相關(guān)文件都存在)1、安裝數(shù)據(jù)庫(kù)軟件只需安裝同版本的數(shù)據(jù)庫(kù)軟件即可,不需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)。最好安裝在和原來(lái)數(shù)據(jù)庫(kù)同樣的%ORACLE_HOME%下,省得還要修改參數(shù)文件路徑等。(直接覆蓋原來(lái)的oracle即可)再次強(qiáng)調(diào),只安裝軟件,不創(chuàng)建數(shù)據(jù)庫(kù),否則將數(shù)據(jù)庫(kù)軟件安裝在同樣的目錄下舊的部分?jǐn)?shù)據(jù)文件會(huì)被覆蓋,這樣數(shù)據(jù)庫(kù)也不能被恢復(fù)了。
2、新建一個(gè)實(shí)例在cmd窗口執(zhí)行oradim -new -sid xinhai注意,這個(gè)SID名稱最好與你以前的SID一樣,否則在啟動(dòng)的數(shù)據(jù)需要指明pfile,并且需要重建密碼文件,比較麻煩。(當(dāng)然,如果你就不想用原來(lái)的SID也可以,把參數(shù)文件、密碼文件的名稱都改成與新SID對(duì)應(yīng)的名稱)。
3、啟動(dòng)數(shù)據(jù)庫(kù)做完以上兩步,就可以啟動(dòng)數(shù)據(jù)庫(kù)了。用net start 檢查oracle服務(wù)是否已經(jīng)啟動(dòng),如果oracle服務(wù)沒(méi)有啟動(dòng),則在cmd下運(yùn)行如下命令:net start oracleservicexinhai然后設(shè)定必要的環(huán)境變量,在cmd窗口運(yùn)行set ORACLE_SID=xinhai
接著連接數(shù)據(jù)庫(kù)sqlplus "/as sysdba"startup
如果正常的話,數(shù)據(jù)庫(kù)應(yīng)該就能起來(lái)了
4、啟動(dòng)監(jiān)聽lsnrctl start
5、后續(xù)工作經(jīng)過(guò)以上幾步后,基本上就可以使用oracle了,但是使用起來(lái)有點(diǎn)不方便,如每次在cmd中啟動(dòng)數(shù)據(jù)庫(kù)都需要先SET ORACLE_SID、在本機(jī)連接數(shù)據(jù)庫(kù)也都需要加上@TNSNAME等。我們可以修改注冊(cè)表,添加ORACLE_SID的信息,避免這些麻煩。
在注冊(cè)表的HKEY_LOCAL_MACHINESOFTWAREORACLE下新建字符串值,名稱為ORACLE_SID,值為xinhai。也可以將以下內(nèi)容保持成一個(gè)后綴名為reg的文件(文件名隨便起),然后雙擊,即可將信息導(dǎo)入到注冊(cè)表中。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREORACLE]"ORACLE_SID"="xinhai"
注意,以上步驟都是在%ORACLE_HOME%、%ORACLE_SID%都與原庫(kù)一樣的情況下討論的,雖然%ORACLE_HOME%和%ORACLE_SID%可以與原庫(kù)不一樣,但為了減少麻煩和出錯(cuò)的幾率,建議不要改變則兩個(gè)值。
6、如果系統(tǒng)啟動(dòng)時(shí) 還不能啟動(dòng)oracle就增加以下
編輯一個(gè)oracle_startup.bat文檔 內(nèi)容為:
set sid=xinhailsnrctl starte:/oracle_startuplog.logsqlplus /nolog @e:oracle_startupsql.txte:/ oracle_startuplog.log
在e盤下增加文檔oracle_startuplog.log,內(nèi)容為:
connect / as sysdba;startup nomount;alter database mount;alter database open;quit
然后把oracle_startup.bat放到系統(tǒng)啟動(dòng)項(xiàng)里面,這樣每次啟動(dòng)系統(tǒng)時(shí)oracle就自動(dòng)啟動(dòng)了。
根據(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ǔ)句的條件寫錯(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)槿绻谇耙惶焱砩?1點(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è)表:
8bef9890242e5d20d09563896cef1471.png
2、刪除該表的記錄:
625dfa5d5986ca5c37dd5017953407cb.png
3、執(zhí)行下面的命令:
3754d50cc473bd44236d927f00196d24.png
這個(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è)用戶下面:
33806d1216df5ae9c45890d3d45930ee.png
2、檢查數(shù)據(jù)以后,把原表記錄刪除:
fe23a8a4602702e951e5ab48a7460e3b.png
3、然后從另一用戶表中插入回去:
729976810ef459046df40b791a6ca773.png
4、 數(shù)據(jù)量比較大時(shí)可以采用如下方法:
e377d10ff07132f160185cb1ba119cfc.png
二、利用物理備份來(lái)通過(guò)還原數(shù)據(jù)文件并進(jìn)行不完全恢復(fù)
如果數(shù)據(jù)庫(kù)運(yùn)行在歸檔模式下,那么可以通過(guò)使用以前的數(shù)據(jù)文件備份進(jìn)行還原,然后利用歸檔日志進(jìn)行前滾,直到回滾到錯(cuò)誤操作的時(shí)間點(diǎn)前,然后重置日志文件打開數(shù)據(jù)庫(kù)。
可以通過(guò)下列方法確認(rèn)是否是運(yùn)行在歸檔模式:
c8406e42aef7ccc8ef232cfdd535e825.png
如果是如上所示,那么就是運(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ā)出:
401f68e89cbfa03388f5913bf5f1ecfd.png
數(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):
8802043c250eb2a060285be160f48c36.png
這樣數(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、打開initorcl.ora,修改初始化參數(shù)utl_file_dir,設(shè)置dbms_logmnr_d包將要使用的數(shù)據(jù)字典文件的放置目錄。
eb6dad504d6f5841641cbd02c5f6dee1.png
然后重啟數(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ù)字典文件:
a0975e25f5049f1ffdfdd49ad7ae943d.png
2、使用dbms_logmnr里的存儲(chǔ)過(guò)程add_logfile添加要分析的日志文件到待分析文件列表:
d16ea343204a3a15b29bc6b94985d48d.png
如果沒(méi)有運(yùn)行在歸檔模式,那么由于重做日志文件的循環(huán)使用可能導(dǎo)致日志文件被覆蓋而無(wú)法獲取到所要尋找的恢復(fù)條目。如果運(yùn)行在歸檔模式,則可以通過(guò)查看$ORACLE_HOMEadminorclbdump目錄下的alert_orcl.log里日志文件歸檔的時(shí)間和錯(cuò)誤操作的時(shí)間來(lái)確定加入哪些歸檔日志文件到待分析的文件列表中去。
eff89b61175131d3edda456d8d9bc18e.png
注意:執(zhí)行以上過(guò)程時(shí)logfilename參數(shù)需要寫日志文件的全路徑,否則會(huì)報(bào)錯(cuò)。重復(fù)以上操作直到把所有需要分析的文件都加到列表中去。這樣就可以啟動(dòng)進(jìn)行分析。
3、使用dbms_logmnr里的存儲(chǔ)過(guò)程start_logmnr啟動(dòng)分析;
3630359ea5afa57b5ea51c89da5b8c41.png
這樣就可以通過(guò)下面的查詢來(lái)獲取日志文件的內(nèi)容了。
4、查詢與dbms_logmnr相關(guān)的幾個(gè)視圖來(lái)獲取日志文件內(nèi)容;
3f8098efdbe50d4b5b4a5311eab6b5d0.png
這樣就可以找出要恢復(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 開始提供了閃回查詢(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)。
9d9facd0a8d3e8675284d38f601525d1.png
2. 最大可以閃回查詢的時(shí)間段由UNDO_RETENTION 初始化參數(shù)(單位為秒)指定
b7a419e2f47bd4d31005ca2d9b4a7c58.png
可以通過(guò)ALTER SYSTEM SET UNDO_RETENTION = ;來(lái)動(dòng)態(tài)修改參數(shù)值。
▲如何使用Flashback Query來(lái)恢復(fù)數(shù)據(jù)呢?
1. 通過(guò)SQL
28b1053a806762ec87261e80f0e8751f.png
使用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類型的值。查詢結(jié)果將返回在指定的SCN 或者時(shí)間點(diǎn)上的數(shù)據(jù)。
下面我們使用scott 方案來(lái)作一個(gè)實(shí)驗(yàn)。
24547dbf2f8f3515319435d98acc0f10.png
如果想在update 的子查詢部分使用AS OF,那么該查詢只能返回一條記錄,否則將會(huì)報(bào)錯(cuò)。
可以通過(guò)添加一個(gè)臨時(shí)表作為中轉(zhuǎn),然后再作更新,如下:
5605ae591ab357c7148787937df03e17.png
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)。
▲示例:
fbaf8acfe357d8f21039d588c8b658df.png
通過(guò)上面的例子可以看出,只要這個(gè)修改的時(shí)間不早于sysdate- (UNDO_RETENTION指定的秒數(shù)),就可通過(guò)這種方式來(lái)恢復(fù)數(shù)據(jù)。
e93c4d7b11cf4e7c8ed9a0d27c79ea80.png
對(duì)于問(wèn)題中的批量數(shù)據(jù),可以寫個(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ù),但是需要依賴系統(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)用用戶分開,并做適度授權(quán);
3、 在做DML前,先用同樣的條件做查詢,看根據(jù)結(jié)果集是否符合預(yù)期。