闪回技术、备份恢复与优化
- 闪回技术:当一个表被删除时,它并不是真的被删除了而只是被放到了回收站(recyclebin)里面,只要表还在回收站里,它就可以被重新恢复(闪回)回来。该回收站被放在表所在的表空间,Oracle并不保证所有删除的表都能闪回成功。因为当用户在某个表空间上创建一个新表(或需要磁盘空间)时,Oracle首先使用空闲的磁盘空间,如果没有足够的磁盘空间,Oracle将使用回收站的磁盘空间。因此在创建表空间时最好留出足够的磁盘空间以方便日后进行恢复工作。
要想使用闪回,需要将recyclebin设置为on。 - 查看recyclebin
show parameter bin;
alter system set recyclebin=off; 闪回关闭
alter system set recyclebin=on; 闪回打开 - 查看scott用户下的所有表和视图
select * from cat; - 闪回相关命令
show recyclebin; //显示回收站中被删除的表
purge table t_dept; //彻底从回收站清楚表
purge recyclebin; //清除回收站中所有的表
drop table 表名 purge; //删除表时如果不需要进入回收站,而直接删除
-
闪回技术只能保护非系统表空间中的表,而且这些表还必须存放在本地管理的表空间中,尽管在一个表被删除时,依赖于该表的绝大多数对象也收到回收站的保护,但是位图连接索引、引用完整性约束等并不受到回收站的保护。
-
Oracle利用还原段中的数据进行DML误操作的恢复。需要设置 undo_retention参数,该参数的单位是秒,表示一个事务提交之后,该事务的数据至少是要在还原段中保留该参数所定义的时间。
1)查看undo_retention参数的当前值
show parameter undo_retention;
2)设置undo_retention参数
alter system set undo_retention=7200;
注意:闪回技术并不能保证两个小时之内提交的DML操作一定能恢复,因为还原表空间没有足够的空间时Oracle仍然会使用undo_retention参数要求保留的磁盘空间,即这部分空间中的数据有可能被覆盖掉。另外,该参数是针对整个数据库上所有的事务的。如果数据库上的DML操纵非常频繁,将该参数设的太大可能会消耗过多的磁盘空间。 -
通过实例演示闪回技术
1)创建表t_emp,将员工的工资全部改为9999;
update t_emp set sal=9999;
2)查看刚刚所做的DML操作的versions_xid和相关信息
select versions_xid,empno,ename,sal from t_emp versions between scn minvalue and maxvalue where empno=7900;
3)没有提交事务之前,versionx_xid的值为空
4)获取闪回信息
col operation for a10;
col undo_sql for a80;
select operation,undo_sql from flashback_transaction_query where xid=hextoraw('0200020089010000');
5)获得所提交的事务所对应的SCN号
select operation,start_scn from flashback_transaction_query where xid=hextoraw('0200020089010000');
6)开启表的行移动功能,Oracle默认是关闭的
alter table scott.t_emp enable row movement;
7)使用闪回命令将scott用户的t_emp恢复到SCN号为1123927;
flashback table scott.t_emp to scn 1123927;
8)使用闪回命令将该表恢复到DML操作提交之前的某个时间,to_timestamp('2013-02-01 17:35:00','YYYY-MM-DD HH:MI:SS');
flashback table scott.t_emp to timestamp to_timestamp('15:22','hh24:mi');