1. 错误的delete,update,insert一条记录,并且commit
2. 错误地删除了一个表: drop table
3. 查询某个表的历史记录(所有已经提交了的历史记录)
四、常用的闪回类型
1. 闪回表
2. 闪回错误的增删改操作
3.查询闪回
五、闪回已删除的表
以下操作模拟删除scott用户中的表a,然后闪回。
SQL>connect scott/tiger
SQL> select * from cat;(or:select table_name from user_tables;)
TABLE_NAME TABLE_TYPE
------------------------------ -----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
A TABLE
SQL> drop table a;
表已删除。
SQL> select * from cat;
TABLE_NAME TABLE_TYPE
------------------------------ -----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
BIN$CXoDVvQJS/auf5fztisvmg==$0 TABLE
在上面显示中有BIN开头的表,其实它们是回收站中被删除的表。
显示回收站中被删除的表
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
A BIN$CXoDVvQJS/auf5fztisvmg==$0 TABLE 2012-05-23:13:29:43
闪回被删除的表A
SQL>flashback table a to before drop;
注意:
如果使用以下语句删除表将无法闪回。
SQL> drop table a PURGE;
六、闪回错误的dml操作
闪回错误的DML操作的表,实际上是将表中的数据快速恢复到过去的一个是焦点或者系统改变号SCN上。实现表的闪回,需要使用到与撤销表空间相关的undo信息,通过show parameter undo命令可以了解这些信息。
用户对表数据的修改操作,都记录在撤销表空间中,这为表的闪回提供了数据恢复的基础。例如,某个修改操作在提交后被记录在撤销表空间中,保留时间为900秒,用户可以在这900秒的时间内对表进行闪回操作,从而将表中的数据恢复到修改之前的状态。
SQL> conn system/jsj
已连接。
SQL> show parameters undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
如果闪回两个小时之内的DML操作,则要修改undo_retention参数值为7200秒;
SQL> alter system set undo_retention=7200;
系统已更改。
SQL> show parameters undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------
undo_management string AUTO
undo_retention integer 7200
undo_tablespace string UNDOTBS1
案例:修改scott用户的员工表emp,不小心使得所有员工的工资都为10000,那么该如何恢复回原来的工资数据呢?
具体步骤如下:
修改员工工资数据为10000:
SQL>connect scott/tiger;
SQL>update emp set sal=10000;
使用带有versions子句的查询语句查询versions_xid(事物号)和相关信息,SCN是当数据库更新后,由DBMS自动维护去累积递增的一个数字。
SQL>select versions_xid,empno,ename,sal
From emp
Versions between scn minvalue and maxvalue
Where empno=7900;
提交DML操作
SQL>commit;
再出查看versions_xid(事物号)和相关信息,注意与步骤2显示结果的区别。
SQL>select versions_xid,empno,ename,sal
From emp
Versions between scn minvalue and maxvalue
Where empno=7900;
使用数据字典flashback_transaction_query中获取以上步骤提交事物的DML操作和恢复工资原来值所需要的SQL命令(undo_sql),其中,xid为步骤4查询结果中的versions_xid。
SQL> conn system/jsj
SQL>select operation,undo_sql
From flashback_transaction_query
Where xid=hextoraw('060015006C010000');
获取第3步操作所提交的事物所对应的scn号,假设获取的scn号为1189481。
SQL>select operation,start_scn
From flashback_transaction_query
Where xid=hextoraw('060015006C010000');
在闪回之前,将要闪回表的行移动功能打开,Oracle默认是关闭的。
SQL>alter table scott.emp enable row movement;
假设第6步操作所提交的事物所对应的scn号为1189481,现在恢复到该scn号所对应的状态,即恢复回修改工资之前的状态。
SQL>flashback table scott.emp to scn 1189481;
查询是否恢复成功。
SQL>select * from scott.emp;
七、闪回数据库
不罗嗦直接给案例:
SQL> show user
USER 为 "SYS"
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 31
下一个存档日志序列 33
当前日志序列 33
SQL> SHOW PARAMETER DB_RECOVERY_FILE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string C:\oracle\product\10.2.0/flash
_recovery_area
db_recovery_file_dest_size big integer 2G
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 100664676 bytes
Database Buffers 62914560 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> ALTER DATABASE FLASHBACK ON;//注:如果归档没用启用flashback区的不能打开的
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> show parameter db_flashback_retention_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
SQL> alter system set db_flashback_retention_target=2880;
系统已更改。
SQL> show parameter db_flashback_retention_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 2880
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
会话已更改。
SQL> select sysdate from dual;
SYSDATE
-------------------
2013-06-26 22:39:53
SQL> set time on
22:40:02 SQL> SELECT CURRENT_SCN FROM V$DATABASE; //数据库没打开的情况下scn为0
CURRENT_SCN
-----------
1210823
22:41:33 SQL> drop user scott cascade;
用户已删除。
22:44:05 SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
22:49:34 SQL> STARTUP MOUNT EXCLUSIVE
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 104858980 bytes
Database Buffers 58720256 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
22:49:52 SQL> FLASHBACK DATABASE TO TIMESTAMP(TO_TIMESTAMP('2013-06-26 22:39:53','YYYY-MM-DD HH24:MI:SS'));
闪回完成。
22:51:57 SQL> ALTER DATABASE FLASHBACK off;
数据库已更改。
22:53:33 SQL> alter database open resetlogs;
数据库已更改。
22:54:20 SQL> conn scott/tiger
已连接。
22:54:39 SQL> select * from cat;
TABLE_NAME TABLE_TYPE
------------------------------ -----------
BONUS TABLE
SALGRADE TABLE
BIN$XAiN1M2YQVqfnsKPBgtGyA==$0 TABLE
BIN$As3gME+tSY6gGc4ISkPpgg==$0 TABLE
A TABLE
DEPT TABLE
EMP TABLE
已选择7行。