oracle如何查找谁删除了数据_一文看懂Oracle是如何闪回数据库的?

概述

之前其实有提到闪回的一些概念,里面比较重要的其实是闪回数据库、闪回查询、闪回drop,今天单独对闪回数据库做一下介绍,帮助大家理解下这块内容。


01

闪回数据库的特性

Flashback Database 功能非常类似与RMAN的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态, 这个功能依赖于Flashback log 日志,而且比RMAN更快速、高效。 因此Flashback Database 可以看作是不完全恢复的替代技术。 但它也有某些限制:

1. Flashback Database 不能解决Media Failure, 这种错误RMAN恢复仍是唯一选择

2. 如果删除了数据文件或者利用Shrink技术缩小数据文件大小,这时不能用Flashback Database技术回退到改变之前的状态,这时候就必须先利用RMAN把删除之前或者缩小之前的文件备份restore 出来, 然后利用Flashback Database 执行剩下的Flashback Datbase。

3. 如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用Flashback Database。

4. 使用Flashback Database锁能恢复到的最早的SCN, 取决于Flashback Log中记录的最早SCN。


02

闪回数据库 的架构

Flashback Database 整个架构包括一个进程Recover Writer(RVWR)后台进程,Flashback Database Log日志和Flash Recovery Area。一旦数据库启用了Flashback Database, 则RVWR进程会启动,该进程会向Flash Recovery Area中写入Flashback Database Log, 这些日志包括的是数据块的 " 前镜像(before image)", 这也是Flashback Database 技术不完全恢复块的原因。RVWR进程写入的是闪回数据库日志。

bf153aacb690da0f40951f999bee6657.png
$ ps -ef|grep rvw|grep -v grep
16fd9290760ca7b6761518df7d3386ae.png

03

RVWR和LGWR的区别

假设T表C1列默认值为null,并进行了如下操作

752237e0cfd6ebc7a1ec8a4627a0a278.png

闪回日志和联机重做日志虽然作用相似 ,但他们还是有不少差异。 闪回日志不是循环使用的,联机重做日志是循环使用的。当事务修改了buffer cache中的数据块时,会将改变前的值和改变后的值以重做记录的形式保存在log buffer中,然后通过LGWR将重做记录写入联机重做日志中。但是在记录闪回日志时,只会将改变前的值保存在flashback buffer中,再由RVWR写入闪回日志中。

闪回时,从闪回日志的尾部向头部方向,依次取出闪回日志中的记录并应用在数据库上。而应用重做日志在进行实例恢复时,从闪回日志的头部向尾部方向依次取出重做记录并应用到数据库上。

比如当前时间 09:20:00表T中C1列的值为4,当需要闪回到 09:10:00表T中C1为2的时候。从尾部应用日志开始,先取出C1=3这个值覆盖C1=4,之后继续取出C1=2覆盖C1=3。发现已经满足条件,故停止应用闪回日志。


04

与闪回数据库相关的几个视图

1.v$flashback_database_log

Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少,该视图就可以查看许多有用的信息。

Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点

Fashback_size: 记录了当前使用的Flash Recovery Area 空间的大小

Retention_target: 目标保存的实际(分钟)

Estimated_flashback_size: 根据策略对需要的空间大小的估计值

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';SQL> select OLDEST_FLASHBACK_SCN os,OLDEST_FLASHBACK_TIME ot,RETENTION_TARGET rt ,FLASHBACK_SIZE fs,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_log;
cec7f1c63cac8ff6ec62891328c0924c.png

2.v$flashback_database_stat

这个视图用来对Flashback log 空间情况进行更细粒度的记录和估计。 这个视图以小时为单位记录单位时间内数据库的活动量, Flashback_Data 代表 Flashback log 产生数量, DB_Date 代表数据改变数量, Redo_Date 代表日志数量,通过这 3 个数量可以反映出数据的活动特点,更准确的预计 Flash Recovery Area 的空间需求

SQL> select BEGIN_TIME bt,END_TIME et,FLASHBACK_DATA fd,DB_DATA dd,REDO_DATA rd,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_stat; 
eee79550a42e3135464cc3b1bb7eca5a.png

3.v$flashback_database_logfile

该视图主要记录闪回日志的详细信息,NAME闪回日志的位置,FIRST_CHANGE#闪回日志中记录的最早的SCN,FIRST_TIME闪回日志中记录的最早时间

SQL> select * from v$flashback_database_logfile;
e1df310263ee2629e3328b5eb64e5a2c.png

05

启用数据库闪回模式

如果想启动FLASHBACK DATABASE的功能,您必须在MOUNT模式下,将数据库通过如下命令至于归档模式

SQL> alter database archivelog;Database altered.

开启闪回模式

SQL> alter database flashback on;Database altered. 

关闭闪回执行可通过如下命令

SQL> alter database flashback off;Database altered.

确认闪回是否开启

select name,current_scn,flashback_On from v$database;
a1fbc85139865b50f86ba75f93287fe9.png

06

与闪回数据库相关的几个参数

1. DB_RECOVERY_FILE_DEST_SIZE和 DB_RECOVERY_FILE_DEST

要想使用Flashback Database, 必须使用Flash Recovery Area,因为Flashback Database Log只能保存在这里。 要配置的2个参数如下,一个是大小,一个是位置。如果数据库是RAC,flash recovery area 必须位于共享存储中。数据库必须处于archivelog 模式.

启用Flash Recovery Area:

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G SCOPE=BOTH; SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/XXX' SCOPE=BOTH; 

禁用Flash Recovery Area:

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' ; 

对于Flash Recovery Area,Oracle 是这样建议的,flash recovery area 设置的越大,flashback database 的恢复能力就越强,因此建议flash recovery area 能够放的下所有的数据文件,增量备份,以及所有尚未备份的归档文件,当然还有它自己产生的flashback logs。

在数据库运行过程中,oracle 自动向该区域写入文件,当剩余空间不足15%的时候,它就会在alert 中增加警告,提示你空间不足。但此时不会影响数据库的正常运转,直到所有空间统统被用掉之后,oracle 首先尝试删除寻些过期的文件,冗余文件或备份过的文件以及闪回日志,如果这些做完了,还是没有空闲空间的话,数据库就被hang住了。

2. DB_FLASHBACK_RETENTION_TARGET:

该参数用来控制flashback log 数据保留的时间,或者说,你希望flashback database 能够恢复的最早的时间点。默认值是1440,单位是minute,即24 小时,需要注意的是该参数虽然未直接指定flash recovery area大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。

SQL>alter system set db_flashback_retention_target=1440 scope=both; 
0d680b0f2f391dbabda20e254b705740.png

07

闪回数据库需要注意的几点

1.一旦关闭闪回数据库,flashback recovery area中的闪回日志将自动全部删除

2.即便以resetlogs打开数据库,当前闪回日志里的内容仍然保留,仍然可以继续进行闪回以restlogs方式打开数据库。之所以考虑以read only放是打开数据库,主要是因为以resetlog方式打开数据库后,用户即可操作数据库,无法校验闪回的准确性。另外,当闪回数据库与DATA GUARD结合后,当主库发生逻辑损坏,我们可以闪回备库,然后以read only方式打开备库,将数据从备库中导出后导入到主库中,这样将对数据和业务的影响减小到最小。

3.如果闪回数据库的时间点之间进行了控制文件的恢复或重建,数据文件的收缩,或删除了某个表空间,则闪回将失败。

4.闪回日志在出现空间压力的情况下,oracle会自动删除闪回日志,则有可能导致无法闪回到指定的时间点。如果希望闪回到指定的时间点,可进行如下操作

SQL> create restore point must_to_flashback guarantee flashback database;

这样我们就给当前时间点取 must_to_flashback这个名字,确保能闪回到该时间点上

5.闪回删除 只能用于非系统表空间和本地管理的表空间

6. 对象的参考约束、索引不会被恢复,指向该对象的外键约束需要重建。

7. 对象能否恢复成功,取决与对象空间是否被覆盖重用。

8. 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba 手工介入重新创建。

9. 对于Recycle Bin中的对象,只支持查询.


当你开启flashback_on后Oracle会自动在FRA目录增加一个flash_recover_area的目录,用来写闪回日志,切记不能直接rm -rf删除,只能通过关闭flashback_on来手动清理。后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

c8f6caba1c6be2535f12a4ac4de4fbb3.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值