暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle闪回技术指南:闪回数据库、表与事务

Table of Contents

前言

Oracle 闪回是一种数据恢复技术,具有恢复时间快,不需要使用备份文件,可以直接在数据库恢复到删除前的状态,但如果数据文件有损坏,则必须使用介质恢复。

闪回具有以下三种级别:

  • 数据库级闪回(用于 trucate table 后或者 drop user 等操作后)
  • 表级闪回(用于 drop table 后或者 需要还原某个时间点的表的数据)
  • 事务级闪回(用于还原 commit 事务提交的回溯)

闪回的使用场景

  • 误操作恢复: 对表或数据的误删除、误更新可以通过闪回技术恢复到正确的状态。
  • 查询历史数据: 在不需要额外备份的情况下,可以通过闪回查询快速访问历史数据。
  • 恢复到特定时间点: 在发生灾难性故障或需要回滚到某个特定时间点时,使用闪回技术可以快速恢复数据库。
  • 事务回滚: 对于错误的事务,DBA可以使用闪回事务回滚数据,并恢复数据库的正常状态。

闪回数据库

oracle 的闪回除了可以闪回表,还可以闪回整个数据库,可以使数据库回到过去的某一个状态,但在生产环境 DataGuard 中,一般主库不使用闪回,只在备库中开启闪回数据库。这是由于开启闪回数据库后,需要存储大量的闪回日志数据,闪回日志会消耗大量的磁盘空间,尤其是在主库上,数据库的事务非常活跃,产生的闪回日志数据量可能会非常庞大。如果主库存储空间不足,可能会导致性能下降或磁盘空间不足。日志的写入和管理可能会影响数据库的响应时间和吞吐量。

image.png

查看是否开启闪回数据库:

--查看是否开启闪回数据库 SQL> select dbid,name,flashback_on from v$database; DBID NAME FLASHBACK_ON ---------- --------- ------------------ 1681292182 ORCL NO
复制

FLASHBACK_ON 的值为 NO,说明没有开启闪回数据库,如果需要开启,则需要执行以下步骤:

1、检查归档模式是否已打开

2、指定归档目录并确保系统存在该目录

3、启动数据库到 mount 模式

4、使用 alter database archivelog 启用归档

5、设置 db_flashback_retention 参数(默认值为:1440 分钟)

6、启动闪回数据库(前提是数据库为 mount 状态)(如果没有设置 db_recovery_file_dest,则需要先设置)

7、重新检查是否已启用闪回数据库

--检查归档模式是否已打开 sys@ORCL 22:50:18> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination /archivelog Oldest online log sequence 4103 Next log sequence to archive 4105 Current log sequence 4105 --db_flashback_retention 参数 sys@ORCL 22:50:31> show parameter db_flashback_retention; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_flashback_retention_target integer 1440 sys@ORCL 22:52:14> sys@ORCL 22:53:11> show parameter db_recovery_file_dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string db_recovery_file_dest_size big integer 0 sys@ORCL 22:56:08> sys@ORCL 22:56:08> alter system set db_recovery_file_dest='/home/oracle/u01/app/oracle/flashback_area' scope=spfile; System altered. Elapsed: 00:00:00.07 [oracle@testdb:/home/oracle]$ mkdir -p /home/oracle/u01/app/oracle/flashback_area sys@ORCL 22:58:21> alter system set db_recovery_file_dest_size=30g scope=spfile; System altered. sys@ORCL 22:52:14> alter database flashback on; Database altered.
复制
--重新查看是否开启闪回数据库 SQL> select dbid,name,flashback_on from v$database; DBID NAME FLASHBACK_ON ---------- --------- ------------------ 1681292182 ORCL YES
复制

sys@ORCL 22:52:14> alter database flashback on;
alter database flashback on
ERROR at line 1:
ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38709: Recovery Area is not enabled.

Elapsed: 00:00:00.03

复制

出现以上错误是因为没有设置 db_recovery_file_dest 参数,设置该参数与创建此路径后重启数据库就可以开启闪回数据库。

闪回数据库使用:

SQL>alter database flashback on SQL>flashback database to scn SCNNO; SQL>flashback database to timestamp to_timestamp('需要恢复的时间点','yyyy-mm-dd hh24:mi:ss');
复制

💡注意:不能使用闪回数据库有以下情形:

  • 表空间被删除
  • 数据文件被删除
  • 在闪回时间内重新创建了一个控制文件

闪回表

如果在删除数据(delete from table )后还没做大量的操作(前提是没超出空间限制) ,就可以利用闪回的方法直接找回删除的数据。其实就是将表里的数据退回到历史里的某一个时点。用以下语句找回删除的数据:

--闪回查询 select * from table_name as of timestamp to_timestamp('删除时间点','yyyy-mm-dd hh24:mi:ss'); --根据闪回查询,将删除的数据插入一个新表 insert into new_table select * from table_name as of timestamp to_timestamp('删除时间点','yyyy-mm-dd hh24:mi:ss');
复制

闪回删除

由于在删除表时(drop table ),没有直接清空表所占的块,只是将删除的表重命名,oracle 会把这些已删除的表的信息放到了回收站中,回收站里会记录删除后表的名字与删除前表的名字,只要不是回收站的空间不足或手工使用 purge 命令删除回收站的记录,我们都可以使用回收站里的数据进行恢复数据。

检查是否启用闪回删除,value 为 on ,说明已经启用闪回删除,如果没有启用闪回删除,则需要使用 alter system set recyclebin = on scope=both;

SQL> show parameter recyclebin; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ recyclebin string on SQL>
复制
--查出来的表名是重命名过的 select object_name,original_name,type,droptime from user_recyclebin; --如果记得原来的表名,则可以用下面的语句进行恢复 flashback table 原表名 to before drop; --如果不记得原来的表名,则使用回收站的表名进行恢复,然后再重命名 flashback table "回收站中的表名" to before drop rename to 新表名
复制

如果需要永久删除回收站中的某个对象,可以使用 purge table 命令,如下:

--清空表名为 test_table 的表 purge table test_table; --清空表空间名为 user_data 的表空间对应的表 purge tablespace user_data; --清空表空间名为 user_data 且用户名为 erp 的表 purge tablespace user_data user erp;
复制

总结

注意在开启数据库闪回时,需要先设置好 db_recovery_file_dest 参数,不然会出 ORA-38709: Recovery Area is not enabled错误。针对闪回的不同方式,可以将其分为以下情景:

对象类型 使用场景 使用闪回方式
数据库 trucate table 后或者 drop user 等操作后 flashback database
drop table 后 flashback drop
delete from table flashback table
回溯到之前某一个具体时点 flashback query
事务 回溯到之前某一个事务 flashback transaction
最后修改时间:2024-12-25 23:42:18
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论