15、闪回技术应用
闪回技术的应用原理:当一个表被删除时,它并不是真的被删除了,而只是被放到了回收站(recyclebin)里,只要这个表还在回收站里,它就可以被重新恢复(闪回)回来。该回收站被放在表所在的表空间,Oracle并不保证所有的删除都能够闪回成功,因为当表空间的没有足够的存储空间时,Oracle将使用回收站的磁盘空间。因此在创建表空间时最好留出足够的磁盘空间,这样才会方便以后数据的闪回。
一、 与闪回技术应用相关的设置
1、 设置回收站(recyclebin)
SQL>conn system/pw@orcl //查看回收站的状态
SQL>show parameter bin;
//设置回收站状态为应用状态(ON) SQL>alter system set recyclebin=on; //查看回收站中的内容 SQL>show recyclebin; //清空回收站
SQL>purge recyclebin;
//清空回收站中特定的对象,如表dept1 SQ>purge table dept1;
//删除表时不想把其放到回收站里时,而是彻底删除 SQL>drop table dept1 purge; 2、 将数据库设置成归档模式
//查看数据库的归档状态 SQL>archive log list; //设置为归档模式 SQL>startup mount;
SQL>alter database archivelog;
3、 设置闪回恢复区(Flash recovery area)
//查看闪回恢复区目标目录情况
SQL>show parameter db_recovery_file; //设置闪回恢复区目标目录
SQL>alter system set db_recovery_file_dest=’c:\\oracle\\product\\ 10.2.0\\flash_recovery_area’; //设置闪回恢复区大小
SQL>alter system set db_recovery_file_dest_size=2g; //停用闪回恢复区,就是将db_recovery_file_dest置空 SQL>alter system set db_recovery_file_dest=’’; 4、 设置被闪回被保留的时间
//查看当前闪回保留的时间
SQL>show parameter db_flashback_retention_target; //重新设置闪回保留的时间(单位:分钟)
SQL>alter system set db_flashback_retention_target=7200;
5、 启动数据库闪回设置
//查看数据的闪回状态
SQL>select name,flashback_on from v$database; //将数据库启动到mount状态 SQL>startup mount;
//设置数据库闪回状态(ON)
SQL>alter database flashback on; //设置数据库闪回状态OFF
SQL>alter database flashback off;
注意:只要我们将其设置为off后,闪回恢复区的内容都会被自动删除。
二、 闪回数据库操作
//假设误删除了一个用户cl SQL>set time on;
21:35:08 SQL>drop user cl cascade;
//删除后,发现删除的不对,按时间闪回恢复 SQL>shutdown immediate
SQL>startup mount; //闪回数据库时要设置数据库为mount状态
SQL>flashback database to timestamp to_date(‘2009-10-23 21:35:08’,’yyyy-mm-dd hh24:mi:ss’); //查询闪回的结果
SQL>alter database open read only; //防止闪回的不正确,将数据库暂时设置为只读状态 SQL>select username from dba_users; 查询得知闪回无误后,将数据库打开 SQL>shutdown immediate; SQL>startup mount
SQL>alter database open resetlogs; //resetlogs参数一般在不完全恢复时使用。 数据库闪回完成。
在这里我们要注意,我们闪回时,也可以根据SCN来闪回 SQL>flashback database to scn 217623132; //SCN的获取
SQL>select dbms_flashback.get_system_change_number from dual; //获取当前Oracle的SCN
SQL>select ora_rowscn from table_name; //获取每个表的每行所拥有的SCN
SQL>select timestamp_to_scn(systimestamp-interval ‘1’ Hour) from dual; //一小时前的SCN
前面我们提到Flash_recovery_area如果空间不够时,会自动删除闪回日志,从而导致闪回日志不足而不能闪回到某个指定的时间点。这样我们如果希望必须能够闪回到某个指定的时间点(当然这个时间点会受到db_flashback_recovery_target的限制),而不允许Oracle自动删除所需要的闪回日志的话,我们可以通过执行以下命令实现: SQL>create restore point must_back_to_this_point guarantee flashback database; 这样后面的操作即使失败了,我们也可以回复到这个时间点。 三、 闪回表删除
1、删除用户test中的表t //查看用户下的所有表 SQL>select * from cat; //删除表t
SQL>drop table t;
//查询删除表t后,用户所有表的状态 SQL>select * from cat;
发现表t不见了,但是多出一条记录:
BIN$b/573f5EQxydlUlr3rJkzw = =$0 //这是一条被删除的表在回收站里的表现形式 2、闪回这个被删除的表 //知道原来的表名的闪回方法
SQL>flashback table t to before drop; //不知道原来的表名的闪回方法
SQL>flashback table “BIN$b/573f5EQxydlUlr3rJkzw = =$0” to before drop;
四、 闪回表数据删除
所谓闪回表,就是将表里的数据回退到历史上的某一个时间点,比如回退到用户误删除数据之前的时间点,从而将误删除的数据恢复过来。这时候数据库处于可用状态。 闪回表利用的是undo表空间里记录的数据被改变前的值,因此受undo_retention的限制,除非指定了retention guarantee选项。 由于在闪回表时,会引起数据表中的数据的移动,因此要定义数据行的移动性: SQL>alter table t1 enable row movement; 1、 删除表t1中的数据
SQL>show parameter undo_retention;
SQL>alter system set undo_retention=7200; SQL>set time on;
21:49:00SQL>delete from t1; 2、 闪回表数据
SQL>flashback table t1 to timestamp to_date(‘2009-10-23 21:49:00’,’yyyy-mm-dd hh24:mi:ss’);
查询表数据,表明闪回成功
五、 闪回版本查询
六、 闪回事务查询