能否从Oracle表中恢复删除的行?我的数据存储在名为CCO的模式下的一个叫做MANUAL_TRANSACTIONS的表中。我不小心删除了一些50万行,并且已经提交了。现在我想要恢复它们。我正在使用Oracle 11g R2版本。谢谢。
能否从Oracle表中恢复删除的行?我的数据存储在名为CCO的模式下的一个叫做MANUAL_TRANSACTIONS的表中。我不小心删除了一些50万行,并且已经提交了。现在我想要恢复它们。我正在使用Oracle 11g R2版本。谢谢。
您可以使用Oracle Flashback Query来恢复详细信息。 您可以查询表在删除之前的时间点的内容,以了解丢失了哪些数据,并在适当的情况下将丢失的数据重新插入到数据库中。 以下是样例查询:
select * from MANUAL_TRANSACTION as of timestamp to_timestamp('28-APR-2014 12:30:00', 'DD-MON-YYYY HH:MI:SS') where ' clause based on your deleted data';
来源: http://docs.oracle.com/cd/B19306_01/backup.102/b14192/flashptr002.htm
答案已经给出,只是我从上面学到的。
FLASHBACK只能由DBA执行(我猜测),但我们可以使用以下查询:
Insert into MANUAL_TRANSACTIONS
(SELECT * FROM MANUAL_TRANSACTIONS AS OF
TIMESTAMP TO_TIMESTAMP('2018-07-23 06:41:59', 'YYYY-MM-DD HH:MI:SS'));
或者您可以使用此查询获取一天的记录
Insert into MANUAL_TRANSACTIONS
(SELECT * FROM MANUAL_TRANSACTIONS AS OF
TIMESTAMP TO_TIMESTAMP('2018-07-23', 'YYYY-MM-DD'));
select * from MY_TABLE as of timestamp to_timestamp('04-MAY-2017 12:30:00', 'DD-MON-YYYY HH:MI:SS') where ID=1822904; --- 12Hr Clock
select * from MY_TABLE as of timestamp to_timestamp('04-MAY-2017 13:30:00', 'DD-MON-YYYY HH24:MI:SS') where ID=1822904;
如果您有备份和Oracle 12c,您可以使用表时间点恢复
(PITR):
RECOVER TABLE 'SCHEMA'.'TAB_NAME'
UNTIL TIME xxxxyyy
AUXILIARY DESTINATION '/u01/aux'
REMAP TABLE 'SCHEMA'.'TAB_NAME':'TAB_NAME_PREV';
此时的数据将可用:
SELECT * FROM SCHEMA.TAB_NAME_PREV;
插入到表名中(选择自SYSDATE-4/24时间戳的TABLE_NAME表中的所有内容)
我知道这个回答有些晚了,在长时间搜索如何在Oracle中恢复和还原表格后,我终于找到了一个好的方法,通过使用restore point
来进行还原,根据Pro Oracle Database 12C Administration一书,在对表格进行任何操作之前,您可以使用以下语句使用restore point
:
CREATE RESTORE POINT <your_key_point_name>;
如果要使用还原点恢复表,则可以使用以下方法:
FLASHBACK TABLE <[your_schema.]your_table_name> TO RESTORE POINT <your_key_point_name>;
除了以上关于使用 FLASHBACK
进行恢复的答案,忘记考虑了两个关键点:
FLASHBACK
回收站模式才能使用FLASHBACK
进行任何行恢复之前,必须启用表格中的行移动(使用 ALTER TABLE <[your_schema.]your_table_name> enable ROW MOVEMENT
)。根据Oracle文档 link 所述:在您使用 Flashback Table 之前,必须确保在将要回滚或返回到以前状态的表上启用了行移动。
有一些选项:
闪回查询
create table before_delete as select * from Table as of TIMESTAMP XX;
如果启用了Oracle补充日志,则可以使用Logminer获取删除语句的撤消SQL
-- 切换日志文件以获得最小的重做活动 alter system switch logfile;
-- 挖掘最后写入的归档日志
exec dbms_logmnr.add_logfile('archivelog/redologfile', options => dbms_logmnr.new);
exec dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog);
select operation, sql_redo from v$logmnr_contents where seg_name = 'EMP';
Insert into MANUAL_TRANSACTIONS
(SELECT * FROM MANUAL_TRANSACTIONS AS OF
TIMESTAMP TO_TIMESTAMP('2014-04-27 11:59:59 PM', 'YYYY-MM-DD HH:MI:SS PM'))
FLASHBACK TABLE <TABLE_NAME> TO TIMESTAMP(TO_DATE('27-APR-2014 23:59:59','DD-MON-YYYY HH24: MI: SS'));
将表中的数据恢复到指定时间(前提是表未被截断)。
在您的情况下:
FLASHBACK TABLE MANUAL_TRANSACTIONS TO TIMESTAMP(TO_DATE('27-APR-2014 23:59:59','DD-MON-YYYY HH24: MI: SS'));