新聞中心
oracle誤刪數(shù)據(jù)恢復(fù)方法小結(jié)
如果用戶誤刪/更新了數(shù)據(jù)后,作為用戶并沒有什么直接的方法來進行恢復(fù),他們必須求助DBA來對數(shù)據(jù)庫進行恢復(fù),到了Oracle9i,這一個難堪局面有所改善。Or()acle
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)治多,十年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
9i中提供了一項新的技術(shù)手段--閃回查詢,用戶使用閃回查詢可以及時取得誤操作前的數(shù)據(jù),并可以針對錯誤進行相應(yīng)的恢復(fù)措施,而這一切都無需DBA干預(yù)
因為一時手賤,生產(chǎn)上的數(shù)據(jù)被我給delete掉了。
用的是delete語句,然后很迅速的還給commit了
下面這兩個語句:
ALTER
TABLE
tablename
ENABLE
row
movement
;
flashback
table
tablename
to
timestamp
to_timestamp('2012-09-13
13:00:00','yyyy-mm-dd
hh24:mi:ss');
記得大概是兩點半左右運行的delete---commit;
具體執(zhí)行流程我們可從以下幾個示例圖中體會;
1.原表記錄
$
sqlplus
eygle/eygle
SQL*Plus:
Release
10.1.0.2.0
-
Production
on
Wed
Mar
30
08:52:04
2005
Copyright
(c)
1982,
2004,
Oracle.
All
rights
reserved.
Connected
to:
Oracle
Database
10g
Enterprise
Edition
Release
10.1.0.2.0
-
64bit
Production
With
the
Partitioning,
OLAP
and
Data
Mining
options
SQLselect
count(*)
from
t1;
COUNT(*)
----------
9318
2.誤刪除所有記錄
并且提交更改。
SQLdelete
from
t1;
9318
rows
deleted.
SQLcommit;
Commit
complete.
SQLselect
count(*)
from
t1;
COUNT(*)
----------
3.獲得當(dāng)前SCN
如果能夠確切知道刪除之前SCN最好,如果不知道,可以進行閃回查詢嘗試.
SQLselect
dbms_flashback.get_system_change_number
from
dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
10671006
SQLselect
count(*)
from
t1
as
of
scn
10671000;
COUNT(*)
----------
SQLselect
count(*)
from
t1
as
of
scn
10670000;
COUNT(*)
----------
9318
我們看到在SCN=10670000時,數(shù)據(jù)都在。
4.恢復(fù)數(shù)據(jù).
SQLinsert
into
t1
select
*
from
t1
as
of
scn
10670000;
9318
rows
created.
SQLcommit;
Commit
complete.
SQLselect
count(*)
from
t1;
COUNT(*)
----------
9318
其它網(wǎng)友用的教程
進行數(shù)據(jù)庫操作,delete后面一定要加where”。今天無意中在網(wǎng)上看到了關(guān)于oracle誤刪除數(shù)據(jù)恢復(fù)的一條信息,發(fā)現(xiàn)的確很好使,下面就我的測試向大家匯報下。
1.
select
*
from
t_viradsl2
t
//查詢t_viradsl2中所有的數(shù)據(jù),可以看到三條數(shù)據(jù)
2.
delete
t_viradsl2
//刪除t_viradsl2中所有的數(shù)據(jù),三條數(shù)據(jù)消失
3.
select
*
from
t_viradsl2
t
//無數(shù)據(jù)。
4.
insert
into
t_viradsl2
select
*
from
t_viradsl2
as
of
timestamp
to_Date('2011-01-19
15:28:00',
'yyyy-mm-dd
hh24:mi:ss')
//已將誤刪除數(shù)據(jù)插入表中
5.
select
*
from
t_viradsl2
t
//又會看到三條數(shù)據(jù)。
我們來分析下第四步,注意這句:
select
*
from
t_viradsl2
as
of
timestamp
to_Date('2011-01-19
15:28:00',
'yyyy-mm-dd
hh24:mi:ss'),什么意思呢,
找到t_viradsl2在2011-01-19
15:28:00這個時間點的所有數(shù)據(jù),既然找到了,你想怎么操作都可以了。
在此分享給大家
oracle數(shù)據(jù)庫誤操作把表刪除了,怎么找回?
一:表的恢復(fù)\x0d\x0a\x0d\x0a 對誤刪的表,只要沒有使用PURGE永久刪除選項,那么從flash back區(qū)恢復(fù)回來希望是挺大的。一般步驟有:\x0d\x0a\x0d\x0a1、從flash back里查詢被刪除的表\x0d\x0a\x0d\x0a select * from recyclebin\x0d\x0a\x0d\x0a2.執(zhí)行表的恢復(fù)\x0d\x0a\x0d\x0a flashback table tb to before drop,這里的tb代表你要恢復(fù)的表的名稱。\x0d\x0a\x0d\x0a二:表數(shù)據(jù)恢復(fù)\x0d\x0a\x0d\x0a 對誤刪的表記錄,只要沒有truncate語句,就可以根據(jù)事務(wù)的提交時間進行選擇恢復(fù),一般步驟有:\x0d\x0a\x0d\x0a1、先從flashback_transaction_query視圖里查詢,視圖提供了供查詢用的表名稱、事務(wù)提交時間、UNDO_SQL等字段。\x0d\x0a\x0d\x0a 如:select * from flashback_transaction_query where \x0d\x0atable_name='TEST';\x0d\x0a\x0d\x0a 2、執(zhí)行表記錄恢復(fù)\x0d\x0a\x0d\x0a 一般先根據(jù)時間進行查詢,查詢語句模式為select * from tb as of timestamp \x0d\x0ato_timestamp(time,'yyyy-mm-dd hh24:mi:ss'); tb指表名稱,time指某個時間點\x0d\x0a\x0d\x0a 如select * from scott.test as of timestamp to_timestamp('2009-12-11 \x0d\x0a20:53:57','yyyy-mm-dd hh24:mi:ss');\x0d\x0a\x0d\x0a 若有數(shù)據(jù),恢復(fù)極為簡單了,語句為flashback table tb to timestamp \x0d\x0ato_timestamp(time,'yyyy-mm-dd hh24:mi:ss');\x0d\x0a\x0d\x0a 如flashback table scott.test to timestamp to_timestamp('2009-12-11 \x0d\x0a20:47:30','yyyy-mm-dd hh24:mi:ss');\x0d\x0a\x0d\x0a注意:alter table testvarchar enable row movement;\x0d\x0a\x0d\x0a 這個命令的作用是,允許Oracle 修改分配給行的rowid。在Oracle \x0d\x0a中,插入一行時就會為它分配一個rowid,而且這一行永遠(yuǎn)擁有這個rowid。閃回表處理會對EMP \x0d\x0a完成DELETE,并且重新插入行,這樣就會為這些行分配一個新的rowid。要支持閃回就必須允許Oracle 執(zhí)行這個操作
誤刪除了delete oracle中數(shù)據(jù)表記錄,沒備份要怎么恢復(fù)
利用oracle提供的閃回方法,如果在刪除數(shù)據(jù)后還沒做大量的操作(只要保證被刪除數(shù)據(jù)的塊沒被覆寫),就可以利用閃回方式直接找回刪除的數(shù)據(jù)
具體步驟為:
*確定刪除數(shù)據(jù)的時間(在刪除數(shù)據(jù)之前的時間就行,不過最好是刪除數(shù)據(jù)的時間點)
*用以下語句找出刪除的數(shù)據(jù):select * from 表名 as of timestamp to_timestamp('刪除時間點','yyyy-mm-dd hh24:mi:ss')
*把刪除的數(shù)據(jù)重新插入原表:
insert into 表名 (select * from 表名 as of timestamp to_timestamp('刪除時間點','yyyy-mm-dd hh24:mi:ss'));注意要保證主鍵不重復(fù)。
如果表結(jié)構(gòu)沒有發(fā)生改變,還可以直接使用閃回整個表的方式來恢復(fù)數(shù)據(jù)。
具體步驟為:
表閃回要求用戶必須要有flash any table權(quán)限
--開啟行移動功能
·alter table 表名 enable row movement
--恢復(fù)表數(shù)據(jù)
·flashback table 表名 to timestamp to_timestamp(刪除時間點','yyyy-mm-dd hh24:mi:ss')
--關(guān)閉行移動功能 ( 千萬別忘記 )
·alter table 表名 disable row movement
oracle如何恢復(fù)誤刪的表記錄數(shù)據(jù)?
oracle如何恢復(fù)誤刪的表記錄數(shù)據(jù),解決辦法:
從flash back里查詢被刪除的表select * from recyclebin
執(zhí)行表的恢復(fù)flashback table ?tbName ?to before drop;這里的tbName代表你要恢復(fù)的表的名稱。
先從flashback_transaction_query視圖里查詢,視圖提供了供查詢用的表名稱、事務(wù)提交時間、UNDO_SQL等字段。
一般先根據(jù)時間進行查詢,查詢語句模式為select * from tb as of timestamp to_timestamp(time,'yyyy-mm-dd hh24:mi:ss'); tb指表名稱,time指某個時間點。
這個命令的作用是,允許Oracle 修改分配給行的rowid。
在Oracle 中,插入一行時就會為它分配一個rowid,而且這一行永遠(yuǎn)擁有這個rowid。
閃回表處理會對EMP 完成DELETE,并且重新插入行,這樣就會為這些行分配一個新的rowid。
要支持閃回就必須允許Oracle 執(zhí)行這個操作。
oracle 誤刪除表的幾種恢復(fù)方法
誤刪數(shù)據(jù)(delete)的話,可以在undo空間找到最近的數(shù)據(jù)(根oracle設(shè)置的undo大小有關(guān))一般剛刪除的還是有機會找到的,自己根據(jù)SQL修改時間饑渴
SELECT?*
FROM?表名?AS?OF?TIMESTAMP?to_date('2018-07-19?08:01',?'yyyy-mm-dd?HH24:mi')
WHERE?可以帶條件;
如果是誤刪表(drop)的話。需要在回收站是否啟用,查看回收站中表
select?object_name,original_name,partition_name,type,ts_name,createtime,droptime?from?recyclebin;
flashback?table?表名?to?before?drop;
--或
flashback?table?"BIN$b+XkkO1RS5K10uKo9BfmuA==$0"?to?before?drop;
中間這一串BIN…… 是在回收站表中找到對應(yīng)的名字
名稱欄目:oracle誤刪表怎么辦,oracle刪除表怎么恢復(fù)
本文來源:http://www.dlmjj.cn/article/hsipji.html