Oracle Flashback特性(一)



Flashback Database使用Flash Recovery Area中的闪回日志代替UNDO表空间中的撤销实现闪回功能.

Flashback Drop是将删除的表放入表空间中一个虚拟回收站中保留,直到用户使用flashback table … to before drop 命令恢复表, 或清空回收站, 否则直到表空间新对象需要空间时.

在Oracle 10g和Oracle 11g得到进一步的扩充, DBA可以赋予用户系统和对象权限以允许修复出现的问题, 而无需DBA干涉.

如赋予SCOTT用户在指定表上执行Flashback操作和控制数据库中的事务元数据:

SQL> grant insert, update, delete, select on hr.employees to scott;
Grant succeeded.
SQL> grant insert, update, delete, select on hr.departments to scott;
Grant succeeded.
SQL> grant flashback on hr.employees to scott;
Grant succeeded.
SQL> grant flashback on hr.departments to scott;
Grant succeeded.
SQL> grant select any transaction to scott;
Grant succeeded.

闪回查询(Flashback Query)

至Oracle9i Release 2起, 可以利用select查询的as of子句获得给定时间点或SCN的表状态. 利用该功能可以找回已删除的记录或对表中的记录按不同的时间点进行比较.

删除表数据并通过闪回恢复数据例子:

SQL> delete from employees
  2  where employee_id in (195,196);

2 rows deleted

SQL> commit;

Commit complete

SQL> select employee_id, first_name, last_name from employees
  2  as of timestamp systimestamp – interval ’5′ minute
  3  where employee_id not in 
  4  (select employee_id from employees);

EMPLOYEE_ID FIRST_NAME      LAST_NAME
—————— ——————- ————————-
        195         Vance                Jones
        196         Alana                Walsh

DBMS_FLASHBACK

同Flashback Query, 区别是DBMS_FLASHBACK在会话级操作, Flashback Query在对象级操作.

当DBMS_FLASHBACK启用时DML操作不被允许, 但可以通过游标实现数据的插入和更新操作.

DBMS_FLASHBACK可用的程序
DISABLE: 禁用会话的Flashback模式
ENABLE_AT_SYSTEM_CHANGE_NUMBER: 为会话启用闪回模式, 指定SCN
ENABLE_AT_TIME: 为会话启用闪回模式, 指定接近于SCN的时间期
GET_SYSTEM_CHANGE_NUMBER: 返回当前的SCN
TRANSACTION_BACKOUT: 停止一个事务和所有依赖的使用事务名称或事务标志符(XIDs)的事务.

删除表数据并通过闪回恢复例子:

SQL> delete from hr.employees where employee_id in (195,196);

2 rows deleted

SQL> commit;

Commit complete

SQL> execute dbms_flashback.enable_at_time(to_timestamp(sysdate – interval ’30′ minute));

PL/SQL procedure successfully completed

SQL> select employee_id, last_name from hr.employees
  2  where employee_id in (195,196);

EMPLOYEE_ID LAST_NAME
———– ————————-
        195 Jones
        196 Walsh

SQL> declare
  2  cursor del_emp is  –保存删除数据的游标
  3  select * from hr.employees where employee_id in (195,196);
  4  del_emp_rec del_emp%rowtype;
  5  begin
  6  open del_emp;  –在闪回模式下打个游标
  7  dbms_flashback.disable;  –关闭闪回模式, 因此我们可以使用DML将恢复删除的数据
  8  loop
  9  fetch del_emp into del_emp_rec;
10  exit when del_emp%notfound;
11  insert into hr.employees values del_emp_rec;
12  end loop;
13  commit;
14  close del_emp;
15  end;
16  /

PL/SQL procedure successfully completed



发表评论