闪回,就是将数据库的数据内容返回到一个指定时间点。例如,管理员发现错误的修改了数据,因此希望返回到误操作之前的时间点。我们可以使用前一天的备份数据,通过归档日志的时间点恢复来达到目的,但是这个过程时间较长。还可以使用闪回,通常这样的操作耗时在分钟级。闪回功能默认是关闭的,手工激活,
SQL> alter database flashback on; --打开
SQL> alter database flashback off; --关闭
功能打开后,自动在FAST_RECOVERY_AREA变量指定的路径下创建闪回日志文件。日志文件中记录的内容,正好与REDO相反。REDO记录所有的写操作,而闪回日志中记录的是写操作的反向操作,类似UNDO日志。反向操作,就是如何回退写操作。例如插入一条数据操作,它的反向操作就是删除这条数据。
闪回支持在几个不同的层面操作,例如数据库级别、表级别以及交易级别。
1) 数据库级别
将数据库置于mount状态下,
SQL> flashback database to timestamp to_date(’02-03-2025 12:05:22’,’dd-mm-yyyy hh24:mi:ss’);
闪回结束后,需要使用resetlogs参数打开数据库。
2) 表级别
问题是解决了,但是这个时间点之后的全部更新数据就都被删除了。有很多数据是正确写入的,我们还想要保留它。如果我们不想闪回整个数据库,只想闪回某一个表,这样可以将影响降低。
事先要打开表的ROW MOVEMENT功能,
SQL> alter table schema1.table1 enable row movement;
闪回一个表,数据库OPEN状态下操作,
SQL> flashback table schema1.table1 to timestamp to_date(’02-03-2025 12:05:22’,’dd-mm-yyyy hh24:mi:ss’);
有些表之前是有关联的,修改一个表的数据,关联的表会自动更新,这是触发器原理。例如交易记录明细的变化,会自动触发汇总表数据的变化。在回退一个表中的数据时,可以自动调用触发器,将关联的表中数据也进行回退。
SQL> flashback table order.test1 to timestamp to_date(’02-03-2025 12:05:22’,’dd-mm-yyyy hh24:mi:ss’) enable triggers;
3) 交易级别
严格意义上说,交易级别的闪回,不是备份恢复领域的技术。Oracle官方把它归类到SQL维护的范畴,因此在备份恢复文档中没有提及,也不建议备份管理员来操作,它应该由SQL开发人员来设计使用。详细内容请参考《Database Development Guide》文档。
如果从实际使用案例上来说,很少见到大型的、交易频繁的数据库中打开FLASHBACK功能,它既消耗资源,提供的功能也有很大局限。它的功能,主要面对的是DML级别的操作,如insert、delete、update等,在错误修改了数据后进行回退。但是它不支持DDL级别的操作,如DROP、TRUNCATE等,数据无法找回。主要原因是DML是事务级,会生成UNDO语句,而DDL是结构级,不会生成UNDO语句。从另外一个层面上来说,FLASHBACK LOG保存在FAST RECOVERY AREA,但是它的优先级低,如果FRA空间不足(参数文件中设置),旧的FLASHBACK LOG将被重复使用,旧的数据被覆盖掉。
CSDN视频课程:
https://edu.csdn.net/lecturer/8135?spm=1002.2001.3001.4144
947

被折叠的 条评论
为什么被折叠?



