一.闪回版本
-->闪回的两种方式
as of timestamp
as of scn
事实上,oracle在内部都是使用scn,即使你制定的是as of timestamp,oracle也会将其转换成scn
每隔5分钟,系统将产生一次系统时间标记与scn的匹配存入sys.smon_scn_time表,
该表中记录了最近1440个系统时间标记与scn的匹配记录,由于只有1440条记录,因此如果使用as of timestamp
的方式则只能flashback最近5天内的数据
对于timestamp和scn的记录还有一个需要注意的点
比如scn:339988,339989分别匹配13:52:00和13:57:00,则当你通过as of timestamp查询这两个时间点中间数据的话,oracle都会将其匹配为scn:339988到undo表空间去查找,也就是说在这个时间内,不管你制定的时间点是什么,查询返回的都是13:52:00这个时刻的数据
查看scn和timestamp的关系
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
二.闪回事务(flashback transation query)
三.闪回丢弃(flashback drop)
从oracle10g开始,每个表空间都会有一个叫做回收站的逻辑区域,当用户执行drop命令时,被删除的表和表的关联对象(
包括索引,约束,触发器,lob段,lob index段)不会被物理的删除,这些对象先转移到回收站中,这就给用户提供了恢复的可能
select * from dba_recyclebin;
flashback table t to before drop;
但是闪回丢弃有一些局限性,对于以下的表不再生效
1.存放在system表空间的表;
2.使用精细审计或虚拟私有数据库
3.建在字典管理表空间上的表
4.已经被手工清楚或自动清楚的表(drop purge)
以下的依赖对象不受保护
1.位图索引
2.物化视图日志
3.外键一致性约束
初始化参数recyclebin用于控制是否启用recyclebin
show parameter recycle
alter system set recyclebin=off;
启用禁用该功能
也可以用show recyclebin来查看recyclebin中的对象列表
select * from "BIN$KJWGtY30C/jgUwowqMATyw==$0";
直接查看该对象的内容
四.闪回表
能够恢复表或设置表到过去某个特定时间点而又不需要进行不完全恢复的
使用闪回表时,所有的相关对象都能得到恢复,特性如下
1.在线操作
2.恢复到指定时间点或scn的任何数据
3.自动恢复相关属性 如索引.触发器等
4.满足分布式的一致性
5.满足数据一致性,所有相关对象将自动一致
6.基于回滚数据实现 undodata
补充一个获取scn的方法,个人认为比较方便的有,但要注意是否有相应的权限
select current_scn from v$database;
select dbms_flashback.get_system_change_number from dual;
闪回表语法
flashback table to timestamp..
flashback table to scn..
局限性
1.不能对系统表做闪回
2.在执行ddl操作后不能闪回
3.闪回操作会写入alert日志文件
4.闪回操作会产生undo和redo数据
另外sys用户不支持闪回
由于flashback table也是使用undo tablespace的,如果要对表进行flashbak,必须允许表的rowmovement
alter table table_name row movement;
通过查询user_tables或者dba_tables可以查看表是否启用row movement
select row_movement from user-tables;
启用和禁用
alter table t enable/diable row movement
注意事项
1.基于undo的表恢复,ddl操作包括drop/modify列,move表,drop 分区,truncate table/partion,这些操作会使undo表空间里的撤销数据失效,对于执行过这些操作的表应用闪回会触发错误
另外一些表结构语句可能因表结构改变导致undo中重做记录无法应用,比如增加了约束,而flashback 查询出的记录已经不符合新建的约束条件,这个时候闪回也不会成功,要么暂时diable约束,要么通过适当逻辑,对要恢复的数据进行处理之后再进行恢复
2.flashback 对v$tables,x$tables等动态性能视图无效,但对dba_,user_等数据字典是有效的
3.基于undo的表恢复实际上是dml操作,会在被操作的表上加dml锁,因此还需要注意trigger对其的影响,默认情况下上回表执行的时候回自动diable掉与其操作表相差的trigger,如果希望在此期间trigger能够继续发挥作用,可以在flashback table后附加rnable trigger喜字句
是否起用自动管理的撤销表空间由二个初始化参数决定:
UNDO_MANAGEMENT:值为 AUTO 表示使用了自动撤销管理表空间,MANUAL 则表示
手动管理
UNDO_TABLESPACE:当 UNDO_MANAGEMENT 值为 AUTO 时,该参数用来指定当前
的 undo 表空间名称。
初始化参数undo_rentention吗,用来指定undo记录保存的最长时间,以秒为单位,默认为900,也就是15min,
但还是一句,不保证15min一定能够保证,也不是说15Min之后一定会被清除
Alter tablespace undotbs1 retention guarantee;
这种方法可以保证undo数据在制定时间内一定有效
六.闪回数据库
能够使数据库迅速回滚到以前的某个时间点或scn
但是
1.闪回数据库不能解决媒介故障
2.如果控制文件已被重建,不能闪回数据库
3.不能完成删除表空间的恢复
配置闪回数据库
1.配置闪回恢复区
要想使用闪回数据库,必须按使用flash ecovery area,因为flashback log只能保存在这里。要配置的两个参数,一个时代下,一个是位置
1) 更改闪回区大小:
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G
SCOPE=BOTH;
2) 更改闪回区路径:
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST=
' /u01/app/oracle/flashback/orcl/' SCOPE=BOTH;
2.数据库必须在归档模式下
在mount状态下
select name,current_scn,flashback_on from v$database;
alter database flashback on;
3.需要在mount状态下使用alter database flashback on启用
因为闪回数据库实际上是对数据库的一个不完全恢复操作,因此需要关闭数据库重启到mount状态
语法 flashback database to scn .. alter database open resetlogs
设置初始化参数:db_flashback_retention_target;
alter system set db_flashback_retention_target=1440 scope=both
该参数用来控制flash log数据保留的时间,1440即默认为1天
相关的视图
v$flashback_database_log 查看闪回数据库所能回退的最早时间
总结
闪回技术使得一些逻辑误操作不再需要归档日志和数据库备份进行时间点恢复,这些闪回技术,只有闪回数据库依赖于闪回日志,其他都是基于undo撤销数据,都与undo_rentention密切相关