亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

記一次Oracle數據恢復過程

2024-08-29 13:53:47
字體:
來源:轉載
供稿:網友

本文簡單記錄一下最近一次數據恢復的過程。
事情的起因是,一個應用升級后,某一個操作導致一個表的幾個列全部被更新為同一值(忍不住又要嘮叨測試的重要性)。這樣的錯誤居然出現在應用代碼中,顯然是重大的BUG。那個是罪魁禍首的SQL,UPDATE語句,其WHERE條件僅僅只有一個where 1=1。
系統的維護人員稱是星期五出的錯,發現出錯是在星期天,也就是我恢復數據的日期,與聲稱的出錯時間已經隔了將近2天。開始嘗試用Flashback query恢復數據,報ORA-01555錯誤,此路不通。維護人員說,星期五之前的RMAN備份已經被刪除了(又是一個備份恢復策略不當地例子),使用基于時間點的恢復也不可能了。剩下的一條路,只有使用log miner。還好歸檔文件還在數據庫服務器上。
這套庫是一套RAC數據庫,由于沒有人能確認操作發生在哪個節點,因此需要將一個節點下所有的歸檔復制到另一個節點上(如果沒有足夠的空間,可以使用NFS)。然后需要找到我們用于數據恢復的歸檔日志:
 
set linesize 170 pagesize 10000  
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';  
 
col name for a30  
col first_change for a10  
col next_change for a10  
 
select max(first_time) from v$archived_log  
where first_time < to_date('200909251900','yyyymmddhh24mi'); --這里的時間為錯誤發生時估計的最早時間。  
 
select sequence#,first_time,name,to_char(first_change#,'xxxxxxxx') first_change,  
 to_char(next_change#,'xxxxxxxx') next_change  
 from v$archived_log  
where  first_time >=to_date('200909251707','yyyymmddhh24mi')  
order by 2;--這里的時間為前一SQL的max(first_time)結果  
 
 SEQUENCE# FIRST_TIME          NAME                           FIRST_CHAN NEXT_CHANG  
---------- ------------------- ------------------------------ ---------- ----------  
      4039 2009-09-25 17:07:10 /arch/db1_1_4039.arc          88ce7eff   88d1457c  
      4040 2009-09-26 12:24:52 /arch/db1_1_4040.arc          88d1457c   88d1459f  
      4041 2009-09-26 12:25:22 /arch/db1_1_4041.arc          88d1459f   88d156a4  
      4688 2009-09-26 12:37:59 /arch/db1_2_4688.arc          88d1457f   88d1464a  
      4689 2009-09-26 12:38:27 /arch/db1_2_4689.arc          88d1464a   88d1569c  
      4042 2009-09-26 12:54:44 /arch/db1_1_4042.arc          88d156a4   88d157e7  
      4043 2009-09-26 12:54:56 /arch/db1_1_4043.arc          88d157e7   88d1ab06  
      4690 2009-09-26 13:07:47 /arch/db1_2_4690.arc          88d1569c   88d1570b  
      4691 2009-09-26 13:08:00 /arch/db1_2_4691.arc          88d1570b   88d1ab09  
      4044 2009-09-26 15:27:32 /arch/db1_1_4044.arc          88d1ab06   88d1ab0d  
      4045 2009-09-26 15:27:35 /arch/db1_1_4045.arc          88d1ab0d   88d25091  
      4692 2009-09-26 15:40:36 /arch/db1_2_4692.arc          88d1ab09   88d1ab77  
      4693 2009-09-26 15:40:39 /arch/db1_2_4693.arc          88d1ab77   88d25094  
      4046 2009-09-26 22:24:07 /arch/db1_1_4046.arc          88d25091   88d250db  
      4047 2009-09-26 22:24:19 /arch/db1_1_4047.arc          88d250db   88d2515e  
      4048 2009-09-26 22:24:29 /arch/db1_1_4048.arc          88d2515e   88d25167  
      4049 2009-09-26 22:24:41 /arch/db1_1_4049.arc          88d25167   88d25cac  
      4694 2009-09-26 22:37:13 /arch/db1_2_4694.arc          88d25094   88d25147  
      4695 2009-09-26 22:37:25 /arch/db1_2_4695.arc          88d25147   88d2515b  
      4696 2009-09-26 22:37:33 /arch/db1_2_4696.arc          88d2515b   88d2516a  
      4697 2009-09-26 22:37:47 /arch/db1_2_4697.arc          88d2516a   88d25ca9  
      4050 2009-09-26 22:41:57 /arch/db1_1_4050.arc          88d25cac   88d25cde  
      4698 2009-09-26 22:55:01 /arch/db1_2_4698.arc          88d25ca9   88d25dcf  
      4699 2009-09-26 22:55:19 /arch/db1_2_4699.arc          88d25dcf   88dbd27e 

set linesize 170 pagesize 10000
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

col name for a30
col first_change for a10
col next_change for a10

select max(first_time) from v$archived_log
where first_time < to_date('200909251900','yyyymmddhh24mi'); --這里的時間為錯誤發生時估計的最早時間。

select sequence#,first_time,name,to_char(first_change#,'xxxxxxxx') first_change,
 to_char(next_change#,'xxxxxxxx') next_change
 from v$archived_log
where  first_time >=to_date('200909251707','yyyymmddhh24mi')
order by 2;--這里的時間為前一SQL的max(first_time)結果

 SEQUENCE# FIRST_TIME          NAME                           FIRST_CHAN NEXT_CHANG
---------- ------------------- ------------------------------ ---------- ----------
      4039 2009-09-25 17:07:10 /arch/db1_1_4039.arc          88ce7eff   88d1457c
      4040 2009-09-26 12:24:52 /arch/db1_1_4040.arc          88d1457c   88d1459f
      4041 2009-09-26 12:25:22 /arch/db1_1_4041.arc          88d1459f   88d156a4
      4688 2009-09-26 12:37:59 /arch/db1_2_4688.arc          88d1457f   88d1464a
      4689 2009-09-26 12:38:27 /arch/db1_2_4689.arc          88d1464a   88d1569c
      4042 2009-09-26 12:54:44 /arch/db1_1_4042.arc          88d156a4   88d157e7
      4043 2009-09-26 12:54:56 /arch/db1_1_4043.arc          88d157e7   88d1ab06
      4690 2009-09-26 13:07:47 /arch/db1_2_4690.arc          88d1569c   88d1570b
      4691 2009-09-26 13:08:00 /arch/db1_2_4691.arc          88d1570b   88d1ab09
      4044 2009-09-26 15:27:32 /arch/db1_1_4044.arc          88d1ab06   88d1ab0d
      4045 2009-09-26 15:27:35 /arch/db1_1_4045.arc          88d1ab0d   88d25091
      4692 2009-09-26 15:40:36 /arch/db1_2_4692.arc          88d1ab09   88d1ab77
      4693 2009-09-26 15:40:39 /arch/db1_2_4693.arc          88d1ab77   88d25094
      4046 2009-09-26 22:24:07 /arch/db1_1_4046.arc          88d25091   88d250db
      4047 2009-09-26 22:24:19 /arch/db1_1_4047.arc          88d250db   88d2515e
      4048 2009-09-26 22:24:29 /arch/db1_1_4048.arc          88d2515e   88d25167
      4049 2009-09-26 22:24:41 /arch/db1_1_4049.arc          88d25167   88d25cac
      4694 2009-09-26 22:37:13 /arch/db1_2_4694.arc          88d25094   88d25147
      4695 2009-09-26 22:37:25 /arch/db1_2_4695.arc          88d25147   88d2515b
      4696 2009-09-26 22:37:33 /arch/db1_2_4696.arc          88d2515b   88d2516a
      4697 2009-09-26 22:37:47 /arch/db1_2_4697.arc          88d2516a   88d25ca9
      4050 2009-09-26 22:41:57 /arch/db1_1_4050.arc          88d25cac   88d25cde
      4698 2009-09-26 22:55:01 /arch/db1_2_4698.arc          88d25ca9   88d25dcf
      4699 2009-09-26 22:55:19 /arch/db1_2_4699.arc          88d25dcf   88dbd27e
嘗試找到數據被錯誤更新的時間點:
 
exec sys.dbms_logmnr.add_logfile(logfilename=>'/arch/db1_1_4038.arc');  
exec sys.dbms_logmnr.add_logfile(logfilename=>'/arch/db1_1_4039.arc');  
 
exec sys.dbms_logmnr.start_logmnr(options=>sys.dbms_logmnr.dict_from_online_catalog);  
 
col sql_redo for a50  
 
select scn,timestamp,username,sql_redo from v$logmnr_contents  
where Operation='UPDATE' and upper(sql_redo) like '%TBL_FORM_FORM%' 
and sql_redo like '%SGS0900021BNc10%'  --這個值是UPDATE時某一列被更新后的值,用在這里便于查找。  
order by scn,timestamp;  
exec sys.dbms_logmnr.end_logmnr; 

exec sys.dbms_logmnr.add_logfile(logfilename=>'/arch/db1_1_4038.arc');
exec sys.dbms_logmnr.add_logfile(logfilename=>'/arch/db1_1_4039.arc');

exec sys.dbms_logmnr.start_logmnr(options=>sys.dbms_logmnr.dict_from_online_catalog);

col sql_redo for a50

select scn,timestamp,username,sql_redo from v$logmnr_contents
where operation='UPDATE' and upper(sql_redo) like '%TBL_FORM_FORM%'
and sql_redo like '%SGS0900021BNc10%'  --這個值是UPDATE時某一列被更新后的值,用在這里便于查找。
order by scn,timestamp;
exec sys.dbms_logmnr.end_logmnr;
很不幸的是,沒有找著需要的數據。再往后找了幾個日志,也沒找著。
如果一直找下去,顯然會消耗比較長的時間,業務也已經停止了。不過可以用一種簡單的方法來查找數據被錯誤更新發生的時間:一個比較大的表,通常段頭后面的那個塊,也就是存儲那個表的數據的第1個塊,通常是很少更新的,至少當時恢復的那個表是這樣一種情況。我們可以通過數據塊中ITL上的事務SCN來滿足我們的要求。
 
SQL> select tablespace_name,extent_id,file_id,block_id,blocks  
     from dba_extents where owner='XXX' 
     and segment_name='TBL_FORM_FORM' 
     order by extent_id;  
 
TABLESPACE_NAME   EXTENT_ID    FILE_ID   BLOCK_ID  BLOCKS  
---------------- ---------- ---------- ---------- -------  
XXXX                      0         16      25481     128  
XXXX                      1         17      23433     128  
XXXX                      2         18      21385     128  
XXXX                      3         19      19977     128  
XXXX                      4         16      23945     128  
XXXX                      5         17       8585     128  
XXXX                      6         18      14217     128  
XXXX                      7         19      18825     128  
 
SQL> alter system dump datafile 16 block 25482;  
 
System altered.  
 
Start dump data blocks tsn: 4 file#: 16 minblk 25482 maxblk 25482  
buffer tsn: 4 rdba: 0x0400638a (16/25482)  
scn: 0x0000.88e21027 seq: 0x02 flg: 0x00 tail: 0x10270602  
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data  
Block header dump:  0x0400638a  
 Object id on Block? Y  
 seg/obj: 0x40d8  csc: 0x00.88e20c40  itc: 2  flg: -  typ: 1 - DATA  
     fsl: 0  fnx: 0x0 ver: 0x01  
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc  
0x01   0x0010.011.0006ed74  0x03c002a0.2f48.07  C---    0  scn 0x0000.88d7af30  
0x02   0x0012.019.000027e0  0x03c00ede.05de.42  C---    0  scn 0x0000.44e2ee39 

SQL> select tablespace_name,extent_id,file_id,block_id,blocks
     from dba_extents where owner='XXX'
     and segment_name='TBL_FORM_FORM'
     order by extent_id;

TABLESPACE_NAME   EXTENT_ID    FILE_ID   BLOCK_ID  BLOCKS
---------------- ---------- ---------- ---------- -------
XXXX                      0         16      25481     128
XXXX                      1         17      23433     128
XXXX                      2         18      21385     128
XXXX                      3         19      19977     128
XXXX                      4         16      23945     128
XXXX                      5         17       8585     128
XXXX                      6         18      14217     128
XXXX                      7         19      18825     128

SQL> alter system dump datafile 16 block 25482;

System altered.

Start dump data blocks tsn: 4 file#: 16 minblk 25482 maxblk 25482
buffer tsn: 4 rdba: 0x0400638a (16/25482)
scn: 0x0000.88e21027 seq: 0x02 flg: 0x00 tail: 0x10270602
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump:  0x0400638a
 Object id on Block? Y
 seg/obj: 0x40d8  csc: 0x00.88e20c40  itc: 2  flg: -  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0010.011.0006ed74  0x03c002a0.2f48.07  C---    0  scn 0x0000.88d7af30
0x02   0x0012.019.000027e0  0x03c00ede.05de.42  C---    0  scn 0x0000.44e2ee39
從上面的結果可以看到,數據塊的ITL中,最新的事務其SCN為88d7af30,正處于最后一個歸檔日志的first_change#和last_change#之間,即88d25dcf和88dbd27e之間,難不成這個錯誤是今天早上才發生的?于是我挖掘最后1個歸檔日志,結果發生錯誤的確是發生在早上,也就是我開始進行恢復操作之前半個小時。
既然錯誤并沒有發生太久,同時這個系統也允許一定的數據丟失,那就使用flashback query,得到UPDATE操作之前的數據即可。

create table tbl_form_form_new  
as select * from tbl_form_form  
as of timestamp to_date('2009-09-27 09:08:00','yyyy-mm-dd hh24:mi:ss');  
--當然這里也可以按SCN進行閃回。 

create table tbl_form_form_new
as select * from tbl_form_form
as of timestamp to_date('2009-09-27 09:08:00','yyyy-mm-dd hh24:mi:ss');
--當然這里也可以按SCN進行閃回。
幸運的是,這次閃回查詢成功了??雌饋碜銐虼蟮腢NDO表空間還是有好處,至少我已經有數次用閃回查詢來恢復數據。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内精品久久久久久中文字幕| 亚洲成**性毛茸茸| 亚洲国产精品福利| 国产精品成人在线| 亚洲成色777777女色窝| 国产成人a亚洲精品| 亚洲精品电影网| 亚洲自拍欧美色图| 91精品国产高清久久久久久| 国产日韩欧美影视| 国产精品激情av电影在线观看| 国产精品视频色| 欧美俄罗斯性视频| 久久视频在线视频| 国产91av在线| 亚洲成**性毛茸茸| 日韩小视频在线| 中文字幕最新精品| 久久久久久69| 成人欧美一区二区三区黑人孕妇| 欧美激情视频免费观看| 九九久久久久99精品| 中文字幕国内精品| 久久夜精品va视频免费观看| 一区二区三区高清国产| 欧美专区在线视频| 国产精品视频在线观看| 热re91久久精品国99热蜜臀| 久久欧美在线电影| 欧美精品中文字幕一区| 欧美最猛性xxxxx免费| 91青草视频久久| 91在线观看免费观看| 日本精品一区二区三区在线| 日韩精品免费在线观看| 亚洲精品中文字幕有码专区| 欧美激情一级欧美精品| 国产精品久久久久久av下载红粉| 91精品久久久久久久久久| 亚洲国产精品电影在线观看| 最近日韩中文字幕中文| 国产xxx69麻豆国语对白| 91精品国产91久久久| 精品亚洲一区二区| 日日噜噜噜夜夜爽亚洲精品| 亚洲一区中文字幕| 69av成年福利视频| 精品无人区太爽高潮在线播放| 欧美激情18p| 欧美激情成人在线视频| 色偷偷91综合久久噜噜| 欧美专区福利在线| 91经典在线视频| 日韩免费在线视频| 麻豆乱码国产一区二区三区| 国产一区二区日韩| 欧美一区二区大胆人体摄影专业网站| 色噜噜狠狠色综合网图区| 97福利一区二区| 亚洲欧洲偷拍精品| 欧美成人午夜剧场免费观看| 午夜精品久久久久久久久久久久久| 亚洲tv在线观看| 国产精品老牛影院在线观看| 色偷偷888欧美精品久久久| 国产精品久久久久不卡| 中文字幕自拍vr一区二区三区| 国产精品一区二区3区| 亚洲色图狂野欧美| 亚洲深夜福利在线| 91av中文字幕| 亚洲国产另类 国产精品国产免费| 久久人人爽人人爽爽久久| 欧美激情精品久久久久久黑人| 欧美午夜精品久久久久久久| 欧美高清在线播放| 亚洲欧美在线一区| 日本欧美国产在线| 国精产品一区一区三区有限在线| 欧美夫妻性生活xx| 日韩欧美中文免费| 日本一区二区三区在线播放| 欧美午夜电影在线| 国产中文日韩欧美| 亚洲人成网站色ww在线| 国产成人中文字幕| 日韩在线不卡视频| 日韩视频免费观看| 久久久国产精彩视频美女艺术照福利| 亚洲欧美激情另类校园| 日韩精品中文字幕在线| 国产精品欧美一区二区三区奶水| 欧美综合在线观看| 欧美性极品少妇精品网站| 午夜精品国产精品大乳美女| 啪一啪鲁一鲁2019在线视频| 亚洲欧洲免费视频| 久久久久国产精品www| …久久精品99久久香蕉国产| 欧美中文在线观看| 欧美亚洲国产日韩2020| 国产精品久久久久久婷婷天堂| 亚洲香蕉成人av网站在线观看| 午夜欧美大片免费观看| 国产精品视频中文字幕91| 中文字幕精品一区久久久久| 欧美另类99xxxxx| 国产精品白嫩初高中害羞小美女| 日韩美女免费观看| 国产有码在线一区二区视频| 久久免费精品视频| 欧美韩国理论所午夜片917电影| 中文字幕国产亚洲| 欧美亚洲日本黄色| 国产网站欧美日韩免费精品在线观看| 精品国产成人在线| 98午夜经典影视| 国产视频在线观看一区二区| 亚洲第五色综合网| 欧美有码在线观看视频| zzjj国产精品一区二区| 国产精品欧美日韩久久| 91精品视频播放| 国产在线精品一区免费香蕉| 日韩在线观看视频免费| 国产成人激情小视频| 欧美激情喷水视频| 国产精品久久一| 亚洲图片欧美午夜| 色偷偷亚洲男人天堂| 一区二区欧美日韩视频| 国自产精品手机在线观看视频| 亚洲性无码av在线| 亚洲国产精品网站| 亚洲午夜性刺激影院| 亚洲综合色av| 日本成人激情视频| 中文字幕精品一区久久久久| 91久久久久久久久| 国产精品嫩草影院一区二区| 日韩一区二区精品视频| 热久久免费视频精品| www国产亚洲精品久久网站| 萌白酱国产一区二区| 亚洲色图狂野欧美| 九色91av视频| 欧美日韩精品在线观看| 久久精品91久久香蕉加勒比| 欧美日韩中文字幕在线视频| 欧美精品福利在线| 亚洲最大av网站| 麻豆国产va免费精品高清在线| 色香阁99久久精品久久久| 久久久久99精品久久久久| 日本免费久久高清视频| 欧美日韩激情视频| 亚洲最大激情中文字幕| 亚洲激情在线观看视频免费| 日韩经典一区二区三区| 亚洲伊人久久大香线蕉av| 91香蕉电影院| www.欧美视频| 91在线播放国产| 亚洲人成在线免费观看|