1. 程式人生 > >記一次使用flashback恢復資料

記一次使用flashback恢復資料

週五晚十點多,同事突然來電稱操作CMS後臺的時候不小心刪除了很多記錄(其實應該是這個CMS的邏輯問題),大概瞭解了情況以後,能初步判斷為p_web表的2萬多條資料被delete了,事發時間大概在9:30左右,這種場景幾乎就是“專門”為flashback而設的了。

於是馬上翻開書找到flashback那節書,先鄙視一下自己,以前所學的都還給書本了。

確認一下可以flashback的極限是多少

select
    min(start_timestamp) 
from
    flashback_transaction_query 
where
    table_name='P_WEB'
    and table_owner='CMS'


由於p_web表資料量不大,還不到100M,趕緊做個“備份”,免得突然犯渾把剩下的2萬多條記錄都整丟了,那就可以跳樓了:結果是前天的下午3點,比預期中的時間要長很多啊。

create table p_web_bad
as
select * from p_web;
create table p_web_20100507_0920 
as
select
    * 
from
    p_web 
as of timestamp to_date('2010-05-07 21:20:00','yyyy-mm-dd hh24:mi:ss');

使用flashback query將9:20的資料放在一個p_web_20100507_0920表裡面,讓同事看看效果先:

其實我也是笨,脫離了表現層的資料能看出什麼呢?除了“感覺”上是正確的一點說服力也沒有。

同事說這個資料沒問題。為了進一步確定事發的準確時間點,使用flashback transaction query 將自8:30以來的所有undo操作列出,這樣可以找出什麼時候開始刪除的了。

create table p_web_undo_20100507_2030 
as
select
    start_timestamp,operation,undo_sql 
from
    flashback_transaction_query 
where
    table_name='P_WEB'
    and table_owner='CMS'
    and start_timestamp>to_date('2010-05-07 20:30:00','yyyy-mm-dd hh24:mi:ss')
order by
    start_timestamp desc
flashback table p_web 
    to timestamp to_date('2010-05-07 21:38:00','yyyy-mm-dd hh24:mi:ss');

經過一個簡單的查詢從start_timestamp 能查出是21:39:04開始刪除的,只要將flashback到21:38:00問題就OK了啦。

此時,報了一個錯:

ORA-08189: cannot flashback the table because row movement is not enabled
alter table p_web enable row movement;

小問題,enable row movement 就是了

我再閃(flashback):

flashback table p_web 
    to timestamp to_date('2010-05-07 21:38:00','yyyy-mm-dd hh24:mi:ss');
ora-01555 snapshot too old

shit!竟然出現了flashback的剋星:

明明前面查到可以flashback的時間很長的啊,莫非是前面幾個大create table把undo內容刷走了,這也太快了吧@[email protected]

先不管了,我同事還在著急的等待,雖然沒有催我,但是“弄丟”資料的心情我很清楚。

幸好前面建立了一個p_web_undo_20100507_2030表,裡面有一對undo的sql,可以將被delete的資料再insert回去。

於是寫了個簡單的過程做這件事:

declare
    v_undo_sql varchar2(4000);
    CURSOR cur is select substr(undo_sql,1,length(undo_sql)-1) --將undo_sql最後那個分號去掉
    from p_web_undo_20100507_2030 where operation='DELETE'; 
    BEGIN
    open cur;
    loop
        fetch cur into v_undo_sql;
        EXIT when cur%NOTFOUND; 
        execute immediate v_undo_sql;
        --dbms_output.put_line(v_undo_sql);
    END LOOP;
    CLOSE cur;
END delete_state ;


經過“漫長”的等待,終於將誤刪的資料恢復回來了。

經過這次資料恢復讓我認識到:

1。雖然掌握了基本概念,但是熟練程度還不夠,體現在臨急翻書上。

2。實際操作經驗欠缺,整個過程實際上沒多少東西,但是卻足足折騰了一個半小時。

3。前瞻性不足,這個資料庫是我維護的,對於誤操作刪除資料這種問題應該要有所覺悟,就這個問題而言,我做的措施僅僅是擴大了undo表空間。

總的來說,就是太嫩了。

執行如下語句即可:

alter database add supplemental log data;

相關推薦

hadoop大資料叢集生產事故

陸續對原有的hadoop、hbase叢集做了擴容,增加了幾個節點,中間沒有重啟過,今天早上發現一個hregionserver服務停止了,就先啟動服務,沒想到啟動之後一直有訪問資料的出錯,嘗試對整個hbase叢集進行重啟出現了下面的錯誤: $ start-hbase.sh master running

誤刪資料

js中 0、' '、FALSE是等價的,null 和 undefined等價,那有沒有考慮過0 和 null什麼時間會等價呢,我用血淋淋的教訓告訴你; 業務場景是這樣的: 現在需要設定一個代理人,在員工請假有事時可以由此代理人提供服務;在設定代理人時,會把該員工所有許

impdp匯入資料時的ORA-31696錯誤

今天幫一同事從一個dump檔案中匯入資料到測試庫中,結果死活出現ORA-31696的錯誤: [[email protected]]$ impdp pebank/pebank directory=dumpdir dumpfile=mcj123.1011.dmp

斷電恢復ORA-01033錯誤

客戶的電腦因為頻繁斷電,造成orcle無法連線,報ORA-01033:oracle初始化或者關閉錯誤. 按照傳統方法 進入cmd sqlplus sys/[email protected] as sysdba 可以連線.關閉資料庫 shutdown imm

Mybatis+Oracle, 資料多且日期間隔大時, 查詢非常慢解決過程

前兩天發現一個sql在專案執行時查詢時間的很長, 但sql在PLSql中查詢時只要1s左右, 以下是原sql:SELECT MAX(data) DATA_VALUE FROM (     SELECT A.FREEZE_TIME, SUM(A.AP * T2.add_att

自動恢復的支付故障

故障描述 作為一個老牌OTA公司,公司早些年訂單主要來源是PC網站和呼叫中心。我在入職公司大約半年後,遇到一次非常詭異的故障。有一天早上,大概也是這個季節,陽光明媚,程式猿剛起床,洗洗涮涮,準備去迎接初戀般的工作日,卻突然收到一大堆報警,線上訊息佇列大量積壓;當然,我還是一如既往的非常勤奮地在9點之前就到公

使用flashback恢復資料

週五晚十點多,同事突然來電稱操作CMS後臺的時候不小心刪除了很多記錄(其實應該是這個CMS的邏輯問題),大概瞭解了情況以後,能初步判斷為p_web表的2萬多條資料被delete了,事發時間大概在9:30左右,這種場景幾乎就是“專門”為flashback而設的了。 於是馬上翻

MySQL資料誤刪-恢復體驗

資料誤刪了怎麼辦?本文也許能給您一定的提示。 一、檢視日誌 資料無意中發現不見了,怎麼辦? 也許首先想到的是去查日誌,找到問題原因,但是這個時間有可能會比較長,並且線上的業務在這段時間會收到影響。 因此,先不要去管什麼原因,首先應該做的第一件事情應當是資料恢復,保證正常的業務不受影響,而後再回過來查詢原

有驚無險的Linux資料恢復過程

問題階段 起因: 昨天晚上思路不是很清晰(上了一天班回來有點蒙),還是強忍著疲憊想搞事情,結果悲劇了… … 本來想拿SD卡做一張linux燒錄卡,燒錄指令碼是很久以前寫的,有git記錄,一直不成功,就回退了幾次提交,然後執行的時候沒有給指令碼傳參(/dev

從阿里雲的rds恢復備份資料到自建資料庫

阿里雲上的文件:https://help.aliyun.com/knowledge_detail/41817.html?spm=5176.7854039.2.1.AJe3Eg 這裡主要記錄下遇到的問題。 安裝mysql,apt-get install  mysql-serv

MySQL刪庫的資料恢復

昨天因為不可描述的原因,資料庫直接被 drop database刪除。在第一時間停止資料庫服務和Web服務,備份MySQL資料目錄下的所有檔案之後,開始走上資料恢復之路。 第一次幹這種事,各種不得法。因為我們既沒有備份,也沒有開啟binlog,連innod

rm -rf之後的資料恢復操作

縮所有的2016年的bsssvc日誌tar -Jcvf bsssvc.log.2016.tar.xz bsssvc.log.2016*一條命令解決,接下來刪除原有的bsssvc.log.2016*rm -rf bsssvc.log.2016*就是這條命令,自己害自己啊,連同b

揪心的MySQL資料恢復過程

先說下背景,公司其中一個專案所有服務都部署在客戶的機房內,機房較小,沒有UPS。其中一個MySQL例項(單機,無主從,windows server 2008,MySQL5.6.19)存放大量的日誌資料,每天幾十G的資料,定期清除(儲存大概四個月的資料),由於硬碟

誤刪除系列三:有道筆記資料恢復過程

1. 環境: 三個有道雲筆記客戶端分別是windows7、iphone、MAC   2. 事件發生過程: 今天早上在win7的有道雲筆記下記錄一些筆記時,出現誤刪除操作,當時我使用的是它的markdown模組進行記錄操作,剛好一個文件記錄了我一週一些學習過程的筆記,就在某一個時刻敲鍵盤時,

TokuMX數據庫集群恢復

關鍵詞 安裝路徑 bsp -a 連接 sys cfg and 安排 中午在昏睡中接到電話,服務器擴容後數據庫啟動不了了,於是不假思索的想到了TokuMX需要關閉對透明大頁的使用才可以正常啟動,而這點恰巧大家都不是很清楚,在這裏寫下關閉的shell: echo never

openstack 雲主機熱遷移失敗與恢復過程

openstack 遷移失敗 背景:最近把openstack上的所有機器的磁盤逐一重新分區,之前是兩塊磁盤用RAID1,但是ceph已經配置了3份副本,這樣相當於存6份副本了,目前磁盤資源不太夠。機器用的是HP P440ar的陣列卡,支持建立不同模式的邏輯卷,所以把磁盤分區修改為RAID1系統盤+RA

mysql數據庫刪除恢復的案例

mysql 數據恢復 linux emmmmm 今天晚上十一點有個朋友說他的數據庫刪除了。是昨天刪除的。我就日了mmp 了數據庫不做備份的??????????what fuck 那就登陸服務器看看吧看到還有一個4 月22 號的。那麽就新建一個數據庫導入進去唄導入導入之後改下源代碼看看能不能訪問e

測試環境Hbase數據備份恢復以及恢復後部分表無法刪除的問題處理

localhost mkdir folder max 一個表 任務 spa file config 一、Hbase數據備份恢復說明:因為測試環境要修改hadoop配置文件hdfs-site.xml的參數hdfs.rootdir修改前的配置 <property>

驚險的檔案恢復經歷Eclipse saved my day

事情起因 事情的起因是這樣的:為了替換掉程式碼中某個常量的值,我使用了sed命令,本來以前用得好好的,這次討巧嘗試了一種新的方法,結果因為對sed不夠了解,又沒有經過試驗,想當然地對程式碼檔案進行了處理,結果就悲劇了——所有被處理過的檔案內容都被清空了。 峰迴路轉 怎麼鬱悶,

Oracle資料故障排除過程

前天在Oracle生產環境中,自己的儲存過程執行時間超過1小時,懷疑是其他job執行時間過長推遲了自己job執行時間,遂重新跑job,發現同測試環境的確不同,運行了25分鐘。 之後準備在測試環境中製造同數量級的資料進行分析,寫了大概如下的儲存過程, create or replace PROCEDU