【问题标题】:Recovering deleted Records恢复已删除的记录
【发布时间】:2013-02-26 07:07:38
【问题描述】:

我意外地删除了表中的一些行并进行了提交。现在 我想恢复它们。

我使用的数据库是 Oracle 11g R2。

我使用以下查询来获取已删除的记录:

SELECT * FROM MY_TABLE AS OF TIMESTAMP ('13-MAR-11 8:50:58','DD-MON-YY HH24: MI: SS')

但是在执行时会报错:

Error at Command Line:3 Column:75
Error report:
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:

但我无法找出这个查询中的问题。

有人可以帮忙吗?

【问题讨论】:

    标签: oracle oracle11g data-recovery


    【解决方案1】:

    这需要一个实际的时间戳(或日期),您传递的是一对值。

    试试:

    SELECT * FROM MY_TABLE
    AS OF TIMESTAMP TO_DATE('13-MAR-11 08:50:58','DD-MON-YY HH24:MI:SS')
    

    (您的时间格式说明符也不正确,并且与您的日期字符串不匹配。)

    【讨论】:

    • 这就像一个魅力......非常感谢你。我还有一个小问题。假设我执行两次删除操作,每次提交后。那么我可以到达第一个删除点吗?或者我只能走到最后一个删除点?
    • 你可以回到之前的几个提交。主要因素是回滚提交所需的撤消块是否仍然存在于撤消表空间中。您应该查看 undo_retention 参数和 Flashback Query 文档(以及 Flashback Database,甚至是 Total Recall 以获得更极端的方法)。
    【解决方案2】:

    例如:

        SELECT * FROM EMP AS OF TIMESTAMP 
       TO_TIMESTAMP('2005-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
       WHERE name = 'JOHN';
    

    但闪回查询可能会因 ORA-1555 失败,其他选项:

    日志矿工

    如果启用了 Oracle 补充日志,您可以为您的删除语句获取 undo sql

    -- switch again logfile to get a minimal redo activity alter system switch logfile;
    
    -- mine the last written archived log 
    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';
    

    Oracle PRM-DUL

    PRM-DUL 将是最后一个选项。即使 Oracle 块中已删除的行块总是只是用已删除掩码标记行标志,该行块仍然可以通过扫描 Oracle 数据块来读取。 PRM-DUL 可以扫描整个表,找出标记为已删除的每条记录/行并写入平面文件。

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 2013-12-05
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多