博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

DBA1 第十七章:执行闪回

Posted on 2011-09-13 14:35  little健健  阅读(283)  评论(0编辑  收藏  举报

概览

  • 传统的恢复技术速度比较慢
    • 必须还原整个数据库或文件(而不仅仅是错误的数据)
    • 必须检查数据库日志中的每项更改
  • 闪回技术的速度比较快
    • 按行和事务处理对更改建立索引
    • 只还原更改的数据
  • 闪回命令易于操作
    • 不涉及复杂的多步骤过程
  • 何时使用
  • 闪回任何错误
    • 闪回数据库通过还原自先前某个时间点以来所做的所有更改,将数据库恢复到较早的时间点。
    • 闪回表可将表恢复到过去的某个时间点,而不必从备份进行还原。
    • 闪回删除可还原意外删除的表。

闪回数据库

  • 概览
    • 其作用类似于数据库的倒回按钮
    • 用户造成了错误--->数据库逻辑损坏--->倒回(闪回)--->数据库倒回至正常状态
  • 缩短还原时间
    • Oracle 数据库会
    • 定期将数据块的“前像”记录在闪回数据库日志中。为了快速将数据文件更改回退到捕获
    • 闪回日志的时间(就在所需目标时间之前),可以重用块图像。然后,应用重做日志文件
    • 中的更改来填充间隔
  • 注意事项
    • 闪回数据库操作完成后
      • 在只读模式下验证是否使用了正确的目标时间或 SCN
      • 使用 RESETLOGS 参数以允许进行更新
  • 限制
    • 不能在下列情况下使用闪回数据库
      • 已还原或重新创建了控制文件
      • 表空间已删除
      • 数据文件已发生收缩(必须先脱机,才能执行闪回操作)
  • 启用闪回数据库
    • 维护--->恢复设置

闪回表

  • 概览
    • 闪回表可将表恢复到特定的时间点。
    • 闪回表是一个可原地完成的操作。
    • 数据库保持联机
    • 必须成功闪回所有表,否则会回退整个事务处理
    • 可将一个或多个表恢复到特定的时间点,而不需要还原备份
    • 从还原表空间检索数据以执行闪回表操作
    • 可以授予 FLASHBACK 对象权限和 FLASHBACK ANY TABLE 系统权限,以允许表所有者以外的人员闪回此表。
    • 必须对要执行闪回操作的表启用行移动
      • em  管理---->表--->编辑-->选项--->启动行移动
      • sql*plus  alter table employees enable row movement
  • 执行闪回表
    • em
    • SQL*PLUS  
      • FLASHBACK TABLE hr.employees TO TIMESTAMP
        TO_TIMESTAMP(
        '2005-05-05 05:32:00',
        'YYYY-MM-DD HH24:MI:SS');

          

  • 注意事项
    • FLASHBACK TABLE 命令可作为单个事务处理执行,以获取 DML 互斥锁。
    • 不会闪回受影响对象的统计信息
    • 会保留所有现有索引
    • FLASHBACK TABLE 语句会写入到预警日志文件
    • 闪回表操作
      • 不能对系统表执行
      • 不能跨多个 DDL 操作
      • 会生成还原和重做数据

闪回删除

  • 使用
    • SQL*PLUS
      • DROP TABLE employees;  ---删除表employees
      • flashback employees to before drop  --从回收站中闪回employees表
    • EM
    • 查看回收站内容
      • dba_recyclebin视图
  • 注意事项
    • 闪回删除不适用于:
      • 驻留在 SYSTEM 表空间中的表
      • 驻留在字典管理表空间中的表
      • 使用细粒度级审计或虚拟专用数据库的表
      • 已清除的表,无论是手动清除的,还是在空间压力下自动清除的
    • 以下相关对象不受保护
      • 位图联接索引
      • 实体化视图日志
      • 引用完整性约束条件
      • 在删除表前删除的索引

闪回时间浏览

  • 闪回查询:查询特定时间点的所有数据。
    • 示例
      • UPDATE employees SET salary = 
        (
        SELECT salary FROM employees
        AS OF TIMESTAMP TO_TIMESTAMP
        (
        '2005-05-04 11:00:00', 'yyyy-mm-dd hh24:mi:ss')
        WHERE employee_id = 200)
        WHERE employee_id = 200

          

  • 闪回版本查询:查看两个时间之间行的所有版本以及更改了行的事务处理。
    • 示例
      • SELECT versions_xid, salary FROM employee   --VERSIONS_XID 是返回行对应版本的事务处理标识符的伪列。
        VERSIONS BETWEEN TIMESTAMP t1 and t2
        WHERE employee_id = 200;

          

    • 注意事项
      • VERSIONS 子句不能用于查询 外部表,临时表,固定表,视图
      • VERSIONS 子句不能跨多个 DDL 命令
      • 会过滤掉段收缩操作
  • 闪回事务处理查询:查看事务处理做的所有更改。
    • 查看FLASHBACK_TRANSACTION_QUERY视图
    • 注意事项
      • DDL 被视为字典更新
      • 删除的对象以对象编号的形式显示
      • 删除的用户以用户标识符的形式显示