Flashback query
从9I2开始可以在查询中使用as of 子句检索在给定时间戳或SCN时表的状态。
EG:insert into hr.employees_archive select * from hr.employees as of
timestamp systimestamp – interval ‘60’ minute
where hr.employees.employee_id not in (select employee_id from hr.employee);
这种称为“不合适恢复”(换句话说,将表或表的子集恢复到不同于初始位置的另一个位置)。这种方法的优点是能够根据需要进一步操作遗漏的行。使用CTAS进行不合适恢复的缺点是,不会自动重新构建约束和索引。
DBMS_FLASHBACK
实现FLASHBACK Query的另一种方法是使用程序包DBMS_FLASHBACK。DBMS_FLASHBACK程序包与FLASHBACK Query关键区别是 它在会话级别进行操作。而Query在对象级上操作。虽然在启用DBMS_FLASHBACK时不允许DML,但可以在启用它之前打开游标,从而允许将前一个时间点的数据插入或更新到当前时间点的库中。
过程 说明
DISABLE 禁用该会话的闪回模式
ENABLE_AT_SYSTEM_CHANGE_NUMBER 启用该会话闪回模式,指定SCN
ENABLE_AT_TIME -------------,使用最近于指定Timestamp的SCN
GET_SYTESM_CHANGE_NUMBER 返回当前SCN
SCN_TO_TIMESTAMP
TIMESTAMP_TO_SCN 返回最近于TIMESTAMPT值的SCN
用DBMS_FLASHBACK恢复数据
Exec dbms_flashback.enable_at_time(to_timestamp(sysdate – interval ‘20’ minute));
Select * from hr.employees --查看20分前操作的表数据
Eg:
Declare cursor del_emp is select * from hr.employees where employee_id in(195,196);
Del_emp_rec del_emp%rowtype;
Begin
Open del_emp;
Dbms_flashback.disable;
Loop
Fetch del_emp into del_emp_rec;
Exit when del_emp%notfound;
Insert into hr.employees values del_emp_rec;
End loop;
Commit;
Close del_emp;
End
Flashback table
Flashback table特性不仅能恢复表中进行在过去某时间点状态,而且也能恢复表的索引、触发器和约束,同时数据库保持联机,增加数据的可用性。Flashback table不可以用于备用数据库上,并且不可以重新构造所有的DDL操作。
Flash table table hr.employees to timestamp systimestamp – interval ‘20’ minute;
Flashback version query
Flashback version query 使用Versions between子句来为表分析指定SCN或时间戳的范围。当Versions between用于Flashback version query中时,大量伪列可用于帮助标识所做修改的SCN和时间戳,以及事务ID和在行上执行的操作类型。
伪列 说明
Versions_start{SCN|TIME} 在对行改动时的开始SCN或时间戳
Version_end{SCN|TIME} --------,如果这是NULL,则行版本仍为当前版本或已经删除了列
Versions_xID 创建行版本的事务的事务ID
Versions_operation 在行上执行的操作 I(插) D(删) U(改)
EG:select versions_startscn,versions_endscn,versions_xid,versions_operation,
Employee_ID,last_name,manager_ID,salary from hr.employees
Versions between scn 16733 and 16788
Where employee_ID in(156,157)
Flashback Transaction query
列名 |
说明 |
XID |
事务ID号 |
START_SCN |
事务中第一个DML的SCN |
Start_Timestamp |
事务中第一个DML的时间戳 |
Commit_Scn |
提交事务的SCN |
Logon_User |
拥有事务的用户 |
Undo_Change# |
撤销SCN |
Operation |
执行的操作 |
EG: select start_scn,commit_scn,login_user,operation,table_name,undo_sql
From flashback_transaction_query where xid=hextoraw(‘04000f00980300’);