闪回(Flashback)
SQL> /*
SQL> 错误操作:
SQL> 1. 错误的delete一条记录,并且commit
SQL> 2. 错误地删除了一个表: drop table
SQL> 3. 查询某个表的历史记录(所有已经提交了的历史记录)
SQL> 4. 错误地执行了一个事务
SQL>
SQL> 对应闪回的四种类型:
SQL> 1. 闪回表
SQL> 2. 闪回删除
SQL> 3. 闪回版本查询
SQL> 4. 闪回事务查询
SQL> 5. 闪回数据库
SQL> */
SQL> host cls
SQL> --闪回的时间参数
SQL> conn / as sysdba
已连接。
SQL> show user
USER 为 "SYS"
SQL> show parameters undo;
l闪回表,实际上是将表中的数据快速恢复到过去的一个是焦点或者系统改变号SCN上。实现表的闪回,需要使用到与撤销表空间相关的undo信息,通过show parameter undo命令可以了解这些信息。
l
l用户对表数据的修改操作,都记录在撤销表空间中,这为表的闪回提供了数据恢复的基础。例如,某个修改操作在提交后被记录在撤销表空间中,保留时间为900秒,用户可以在这900秒的时间内对表进行闪回操作,从而将表中的数据恢复到修改之前的状态。
NAME TYPE VALUE
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL> -- 将900秒改为20分钟
SQL> alter system set undo_retention=1200 scope=both;
系统已更改。
SQL> show parameters undo;
NAME TYPE VALUE
undo_management string AUTO
undo_retention integer 1200
undo_tablespace string UNDOTBS1
SQL> /*
SQL> scope的取值: session spfile(参数文件) both
SQL> */
SQL> --为scott授予闪回的权限
SQL> grant flashback any table to scott;
授权成功。
SQL> conn scott/tiger
已连接。
SQL> show user
USER 为 "SCOTT"
SQL> host cls
SQL> --第一种类型闪回:闪回表
SQL> create table flashback_table1
2 (fid number,fnamevarchar2(10));
表已创建。
SQL> insert into flashback_table1 values(&fid,'&fname');
输入 fid 的值: 1
输入 fname 的值: Tom
SQL> commit;
提交完成。
SQL> select * from flashback_table1;
FID FNAME
1 Tom
2 Mary
3 Mike
SQL> --记录当前的系统时间(SCN)
SQL> select sysdate 时间, timestamp_to_scn(sysdate) SCN fromdual;
时间 SCN
21-9月 -11 4354761
SQL> delete from flashback_table1 wherefid=2;
已删除 1 行。
SQL> commit;
提交完成。
SQL> select * from flashback_table1;
FID FNAME
---------- ----------
1 Tom
3 Mike
SQL> --执行闪回表
SQL> flashback table flashback_table1 toscn 4354761;
flashback table flashback_table1 to scn4354761
*
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表
SQL> select rowid,fid,fname fromflashback_table1;
ROWID FID FNAME
------------------ ---------- ----------