Skip to content

Oracle数据闪回(删除的数据、更新的数据)

  • 查询指定时间的数据快照

    sql
    -- 查询执行过的sql语句,确定快照时间
    SELECT R.FIRST_LOAD_TIME,R.SQL_TEXT,R.* FROM V$SQLAREA R 
    WHERE R.SQL_TEXT LIKE '%当时执行的sql语句部分片段%' ORDER BY R.FIRST_LOAD_TIME DESC
    -- PS:如果报错 ORA-00942: table or view does not exist,说明是用户没有查询相关的v$视图的权限,解决办法如下
    -- 给用户授予所有权限
    grant select  any dictionary to 用户
    -- 这个权限是最低的要求,但是可以访问到v$相关视图
    grant select_catalog_role to 用户
    -- 收回权限
    revoke select_catalog_role from user
    
    -- 查询指定时间的数据快照
    SELECT * FROM 表名 AS OF TIMESTAMP 
    TO_TIMESTAMP('2025-03-06 12:00:00', 'yyyy-mm-dd hh24:mi:ss')
    
    -- 查询当前时间20分钟之前的数据快照
    SELECT * FROM 表名 AS OF TIMESTAMP SYSDATE - 20 / 1440
    -- PS:1440咋来的呢?一天的时间是 60(分) x 24 = 1440,SYSDATE是以天为单位,所以 SYSDATE - 20 / 1440 就是距离当前时间20分钟前的时间
  • 恢复数据

    sql
    -- 1.启动表的row movement特性
    ALTER TABLE 表名 ENABLE ROW MOVEMENT
    
    -- 2.闪回指定时间的快照
    FLASHBACK TABLE 表名 TO TIMESTAMP 
    TO_TIMESTAMP('2025-03-06 12:00:00','yyyy-mm-dd hh24:mi:ss')
    
    -- 3.关闭表的row movement功能
    ALTER TABLE 表名 DISABLE ROW MOVEMENT
    
    -- PS:如果不确定具体的数据删除/修改时间,在没有太多操作这个表的情况下,闪回的时间可以稍微提前一点

Oracle表闪回(不小心drop的)

  • drop的表不一定能恢复,前提是oracle开启了回收站功能,或者回收站没有被清空

  • 恢复表

    1. 查询oracle回收站表

      sql
      select * from recyclebin ORDER BY CREATETIME DESC

      image-20250306155702772

    2. 找到ORIGINAL_NAME为被删除的表的记录的OBJECT_NAME,然后恢复,记得OBJECT_NAME要用双引号包裹

      sql
      FLASHBACK TABLE "BIN$YAuvlQWzQA+YBLx0RbotCQ==$0" TO BEFORE DROP

参考文档

MIT版权,未经许可禁止任何形式的转载