从oracle表中恢复已删除的行

时间:2014-04-28 06:59:21

标签: oracle

这可以从oracle表中恢复已删除的行吗?我的数据存储在MANUAL_TRANSACTIONS表中。模式名称是CCO。我不小心删除了表中的大约500万行并执行了提交。现在我想恢复它们。我正在使用Oracle 11g R2.Thanks

12 个答案:

答案 0 :(得分:10)

您可以使用Oracle闪回查询恢复详细信息。 您可以在删除之前查询表的内容,以找出丢失的数据,并在适当的情况下,将丢失的数据重新插入数据库中。 以下是示例查询:

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

答案 1 :(得分:4)

答案已经按照上面我所学的形式给出了。 闪回只能由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'));

答案 2 :(得分:2)

是的,您可以使用闪回查询。 Using Oracle Flashback Query (SELECT AS OF) 这假设撤销表空间足够大,具有足够的撤消保留。如果已释放撤消,则可能需要在克隆数据库中执行还原和恢复,并将数据复制到原始数据库。还要检查TSPITR,TableSpace Point In Time Recovery。只有当您的数据库以archivelog模式运行并且备份可用时,才能执行此操作。

答案 3 :(得分:2)

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 

以上查询对我有用。您甚至可以使用下面的查询

查找24小时的时间范围
select * from MY_TABLE as of timestamp to_timestamp('04-MAY-2017 13:30:00', 'DD-MON-YYYY HH24:MI:SS') where ID=1822904;

答案 4 :(得分:0)

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(7月7日(&#39; 27-APR-2014 23:59:59&#39;,&#39; DD-MON-YYYY HH24:MI:SS&#39;)); < / p>

答案 5 :(得分:0)

使用此查询

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'))

答案 6 :(得分:0)

有一些选择:

  1. 闪回查询

    从TIMESTAMP XX的表中创建table before_delete作为select *;

  2. Logminer如果启用了Oracle补充日志,则可以为删除语句获取undo sql

  3. - 再次切换logfile以获得最小的重做活动 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';
    
    1. Oracle PRM-DUL将是最后一个选项。即使删除了Oracle块中的行块,也只是标记了带删除掩码的行标志,行块仍然可以通过扫描Oracle数据块读取。 PRM-DUL可以扫描整个表格,找出标记为已删除的每个记录/行,并写出平面文件。

答案 7 :(得分:0)

你可以尝试的是:

  1. 闪回查询(可从oracle 10g获得)可能因ora-01555快照太旧而失败
  2. 重做logminer,我的重做,可能会找到undo sql
  3. prm-dul工具(oracle的商业恢复工具),可以扫描oracle块并找到甚至删除的行块

答案 8 :(得分:0)

请查看此视频,您将获得必要的详细信息

https://youtu.be/la-uHNTztFU

答案 9 :(得分:0)

如果你有备份和Oracle 12c,你可以使用Table Point In Time RecoveryPITR):

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;

答案 10 :(得分:0)

插入表名(SELECT * FROM TABLE_NAME TIMESTAMP(SYSDATE-4/24)

答案 11 :(得分:0)

根据Pro Oracle Database 12C Administration的书,在对如何在oracle中恢复和还原表进行了长时间的搜索之后,我知道这已经太迟了,我终于找到了一种使用restore point进行还原的好方法,您可以通过使用以下几行来对表执行任何操作:restore point

CREATE RESTORE POINT <your_key_point_name>;

对于具有还原点的恢复表,可以使用:

FLASHBACK TABLE <[your_schema.]your_table_name> TO RESTORE POINT <your_key_point_name>;

以上所有关于使用FLASHBACK进行恢复的答案都忘记了两个要点:

  1. 必须启用用于使用FLASHBACK的回收站模式
  2. 使用FLASHBACK进行任何行恢复之前,必须使用ALTER TABLE <[your_schema.]your_table_name> enable ROW MOVEMENT启用表中的行移动。根据oracle文档link

在使用闪回表之前,必须确保要在表上启用行移动以闪回或返回到先前的状态。