Oracle闪回技术之闪回数据库
Oracle闪回技术包括
1.闪回数据库
2.闪回查询、事务和表
3.闪回删除
4.闪回数据归档
闪回数据库
可以将数据库回退到过去的某一时刻,效果等同于不完整恢复.他将丢失在闪回点之后的所有数据,因为他必须使用resetlogs打开数据库.
它可以恢复一些逻辑错误,比如update语句忘记了where过滤条件,导致整个表的数据被修改.
闪回数据库不能撤销物理损坏,而只能恢复用户错误造成的逻辑错误.
启用闪回数据库,修改的块的镜像会不时的从数据库缓冲区复制到SGA内的闪回缓冲区,由恢复写入器(Recovery Writer,RVWR)将闪回缓冲区写入磁盘和闪回日志.闪回日志记录的是完整块镜像的日志.
闪回数据库从性能考虑,并不会将所有块的变化写入闪回日志.
假设有一个数据块A,每十分钟改变一次.那么从10点到11点,改变了6次,但是很可能只有两次变更写入了闪回日志.
假设数据块A,10:00和10:30的变更写入了闪回日志,而现在需要将数据库闪回至10:15.
闪回数据库首先会找到块A在10:00变更的完整镜像,然后应用redolog,将数据块A的变更推到10:15.
这个恢复的方式虽然和RMAN不完整恢复相似,但是闪回数据库更加方便和快捷.
假设有一个凌晨4点的RMAN备份,如果在上午11点发生了用户错误,使用RMAN不完整恢复,恢复到10:30.这实际上是将数据库所有的块(凌晨4点的版本)应用redolog向前推进至10:30
而闪回数据库则不同,闪回日志只记录发生变化的块.按照上面的例子,只需要在闪回日志中找到10:30之前的最近一个数据块的版本,应用redolog即可.所以闪回数据库相对于RMAN不完全恢复有如下的优点
1.只恢复有变化的数据块(RMAN需要恢复所有的数据块)
2.从最近的一个数据块版本恢复(按照上面的例子,闪回数据库很可能从10:20的一个数据块开始恢复,而RMAN不完全恢复统统是从凌晨4点的数据块开始恢复)
配置闪回数据库
1.开启归档模式,并确认闪回区
开启归档模式的命令如下:
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
2.设置闪回保留目标时间
由db_flashback_retention_target参数控制,单位为分钟,默认是1440(一天)
设置为两天
alter system set db_flashback_retention_target=2880 scope=both;
3.重启数据库,启用闪回日志记录
shutdown immediate;
startup mount;
alter database flashback on;
alter database open;
4.确认开启了闪回日志
select flashback_on from v$database;
有两个视图可以查看闪回的信息
set linesize 300;
select * from v$flashback_database_log;
select * from v$flashback_database_stat;
闪回缓冲区大小不受DBA控制,但是可以查看
select * from v$sgastat where name=‘flashback generation buff‘;
使用闪回数据库恢复
1.创建实验表
创建时间在22:14左右
2.模拟失误的用户操作.
用户错误的truncate了表
3.执行闪回数据库
SQL> shutdown abort;
SQL> startup mount;
然后闪回数据库到发生事故的时间点左右.
flashback database to timestamp
to_timestamp(‘2015-01-19 22:13:00‘,‘yyyy-mm-dd HH24:mi:ss‘);
然后以只读方式打开数据库,确认数据
SQL> alter database open read only;
当然,此时实验表尚未创建
SQL> select table_name from user_tables;
no rows selected
继续前推
shutdown abort;
startup mount;
recover database until time ‘2015-01-19 22:15:00‘;
alter database open read only;
可以看到数据已经回来了
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
T
SQL> select count(*) from t;
COUNT(*)
----------
999
SQL>
这时候,就可以以resetlogs打开数据库,闪回数据库完成
shutdown abort;
startup mount;
alter database open resetlogs;
这里需要注意两点
1.一旦确认了恢复的时间点,并以resetlogs方式打开数据库,则该时间点之后的数据统统丢失.不能恢复了
2.闪回数据库需要归档日志,也就是说闪回目标保留时间(db_flashback_retention_target)要小于等于归档日志保留时间.
否则,归档日志因为备份策略的原因被删除,则不能保证闪回数据库的效果.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。