Table of Contents
前言
Oracle 闪回是一种数据恢复技术,具有恢复时间快,不需要使用备份文件,可以直接在数据库恢复到删除前的状态,但如果数据文件有损坏,则必须使用介质恢复。
闪回具有以下三种级别:
- 数据库级闪回(用于 trucate table 后或者 drop user 等操作后)
- 表级闪回(用于 drop table 后或者 需要还原某个时间点的表的数据)
- 事务级闪回(用于还原 commit 事务提交的回溯)
闪回的使用场景
- 误操作恢复: 对表或数据的误删除、误更新可以通过闪回技术恢复到正确的状态。
- 查询历史数据: 在不需要额外备份的情况下,可以通过闪回查询快速访问历史数据。
- 恢复到特定时间点: 在发生灾难性故障或需要回滚到某个特定时间点时,使用闪回技术可以快速恢复数据库。
- 事务回滚: 对于错误的事务,DBA可以使用闪回事务回滚数据,并恢复数据库的正常状态。
闪回数据库
oracle 的闪回除了可以闪回表,还可以闪回整个数据库,可以使数据库回到过去的某一个状态,但在生产环境 DataGuard 中,一般主库不使用闪回,只在备库中开启闪回数据库。这是由于开启闪回数据库后,需要存储大量的闪回日志数据,闪回日志会消耗大量的磁盘空间,尤其是在主库上,数据库的事务非常活跃,产生的闪回日志数据量可能会非常庞大。如果主库存储空间不足,可能会导致性能下降或磁盘空间不足。日志的写入和管理可能会影响数据库的响应时间和吞吐量。
查看是否开启闪回数据库:
--查看是否开启闪回数据库
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 |