【数据库】一文读懂FLASHBACK闪回技术

699 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

一、概述

  • recyclebin:一块区域,用来临时保存被删除的对象
  • flashback query:查找对应数据的在undo表空间的数据
  • Temporal Validity Support:
  • flashback table:同样基于undo数据恢复对象到某一个时间点,只能针对DML,需要开启行移动
  • flashback database:闪回数据库整个架构包括一个进程(rvmr),一段存储空间(flash recovery area),一种日志(flashback database log)。数据块的”前镜像“存储在闪回日志中(flashback database log)
  • flashback transaction:12c不支持了,Flash Transaction Query可以利用xid来获得回滚的sql statement。用户可以根据需要利用这些undo sql来回滚数据。所以 Flash Transaction Query 实际上是 Flash versions query 的扩展,通常会配合使用。
  • flashback data archive:单独存放表的还原数据,使数据能保留更长时间

二、回收站recyclebin

2.1原理

drop时,主键、索引一并被删除。相关的表、索引等改名字,数据所占用空间被标识为可用空间(对应关系写入回收站),但并不马上删除。后续新数据会覆盖删除的表的空间 1.png

2.2从回收站还原表

  • 还原删除的表和相关对象
  • 如果多个回收站条目具有相同原始名称,则:
  • 使用系统生成的唯一名称来还原特定版本
  • 使用原始名称时,还原的表遵循后进先出LIFO的原则
  • 重命名原始名称(如果当前正在使用该名称) FLASHBACK TABLE <table_name> TO BEFORE DROP [RENAME TO <new_name>];
    FLASHBACK TABLE <recyclebin_name> TO BEFORE DROP;//使用recyclebin name指定闪回表 默认闪回第一条(后进来的那一条)

2.3查询回收站

SQL>select owner,original_name,object_name,type,ts_name,droptime,related,space from dba_recyclebin where can_undrop='YES';

SQL>show recyclebin;

2.4回收站自动回收空间

2.png

2.5手动回收空间PURGE

PURGE {table <table_name>|INDEX <index_name>}
PURGE TABLESPACE <ts_name> [USER <user_name>]
清理整个回收站:PURGE [USER_|DBA_] RECYCLEBIN

2.6不使用回收站

DROP TABLE <table_name> PURGE;
表空间及其包含对象都删除:DROP TABLESPACE <ts_name> [INCLUDING CONTENTS];
用户及其包含对象都删除::DROP USER <user_name> [CASCADE];

三、闪回查询

3.1原理

查找对应数据的在undo表空间的数据
select employee_id,salary from employeesas of timestamp&lt;T1|scn号>where employee_id=200; 3.png 4.png

3.2基础语法

1、查询当前时间和scn号

SQL>select to_char(sysdate,'mm/dd/yyyy hh24:mi:ss') from dual;
需要权限
SQL>select current_scn from v$database;
不需要权限
获取数据库当前SCN
SQL>select dbms_flashback.get_system_change_number from dual;

2、更改数据后闪回查询

SQL>select * from test as of TIMESTAMP to_timestamp(''11/19/2017 08:44:14','mm/dd/yyyy hh24:mi:ss');
SQL>select * from test as of scn 185324;

3、闪回行版本查询(时间段)

SQL>select version_xid,name,versions_operation from test versions between scn 1043959 and 1044367;

3.3Temporal Validity Support

在不增加列的情况下可以实现时间有效性的的判断
建表时指定:
period for student_module_period (start_date, end_date) 查询时使用:as of period for student_module_period to_date('12-feb-2013','dd-mon-yyyy') 列别名
或者versions period for student_module_period between to_date('12-feb-2013','dd-mon-yyyy') and to_date('06-jan-2014','dd-mon-yyyy') sm

四、闪回表

4.1原理

1、特性
  • 闪回表可将表恢复到特定的时间点,而不需要还原备份
  • 闪回表是一个原位操作
  • 数据库保持联机
  • 从还原表空间检索数据后即可执行闪回表操作 只能针对DML
2、前提条件
  • 需要对特定表具有FLASHBACK ANY TABLE或FLASHBACK对象权限
  • 需要对要闪回的表具有INSERT、SELECT、DELETE和ALTER权限
  • 必须对要执行闪回操作的表启用行迁移,alter table test enable row movement;
3、注意事项
  • FLASHBACK TABLE命令作为单个事务处理执行,要求获取DML排他锁
  • 不闪回统计信息
  • 保留当前索引和相关对象
  • 闪回表操作: 不能对系统表执行 不能跨DDL操作 会生成还原和重做数据

4.2基础语法

1、启动表的行移动功能

SQL>alter table test enable row movement;

2、闪回表

删除表记录
SQL>delete from test;
SQL>commit;

闪回表
SQL>flashback table test TO TIMESTAMP to_timestamp(''11/19/2017 08:44:14','mm/dd/yyyy hh24:mi:ss');
SQL>flashback table test TO SCN 185324;

五、闪回数据库

5.1原理

1、特性

作用类似于数据库的倒带按钮可以在用户造成了逻辑数据损坏的情况下使用 5 1.png FLASHBACK DATABASE

2、体系结构

6.png 闪回数据库整个架构包括一个进程(rvmr),一段存储空间(flash recovery area),一种日志(flashback database log)。数据块的”前镜像“存储在闪回日志中(flashback database log)
闪回日志(flashback database log):记录怎样做回退
闪回缓冲区(flash recovery area):当启用flashback database,则sga中会开辟一块新区域作为闪回缓冲区,大小由系统分配
rvwr进程:rvwr进程将闪回缓冲区的内容写入到闪回日志中,注意闪回日志不同于redo log,闪回日志在redo log基础之上生成,是完整数据块映像的日志。redo log则是变化的日志。闪回日志不能复用,也不能归档。闪回日志使用循环写方式。

5.2基础语法

1、配置闪回数据库

查看配置 select log_mode,flashback_on,force_logging from v$database;

LOG_MODE         FLASHBACK_ON  FORCE_LOGGING
------------------------------------------------------
NOARCHIVELOG   NO                  NO

1、配置快速恢复区
2、设置保留目标
3、启用闪回数据库
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP MOUNT
SQL>ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=2800 SCOPE=BOTH;
SQL>ALTER DATABASE FLASHBACK ON;
SQL>ALTER DATABASE ARCHIVELOG;
SQL>ALTER DATABASE FORCE LOGGING;

SQL>ALTER DATABASE OPEN;

2、闪回示例
RMAN>FLASHBACH DATABASE TO TIME "TO_DATE('2017-05-27 03:00:36','YYYY-MM-DD HH24:MI:SS')";
RMAN>FLASHBACK DATABASE TO scn 3078796;
RMAN>FLASHBACK DATABASE TO SEQUENCE=233 THREAD=1;

SQL>FLASHBACH DATABASE TO TIMESTAMP (SYSDATE-1/24);
SQL>FLASHBACK DATABASE TO scn 3078796;
SQL>FLASHBACK DATABASE TO RESTORE POINT b4_load;

5.3 闪回数据库注意事项

  • 要在MOUNT状态下闪回数据库

  • 闪回数据库操作完成后,打开数据库: 在只读模式下验证使用的目标时间或scn正确无误 使用resetlogs操作以允许执行DML

  • 闪回和恢复是对立的

  • 以下情况不能使用闪回数据库操作: 控制文件已还原或已重新创建
    表空间已删除
    数据文件的大小已被减小

  • 使用TO BEFORE RESETLOGS子句闪回至上一RESETLOGS操作前的那一刻

5.4 监视闪回数据库

要针对保留目标监视容量 查看快速恢复区的磁盘限额
select estimated_flashback_size,flashback_size from v$flashback_database_log;

确定当前闪回窗口
select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log;

监视闪回数据库日志中的事件记录
select * from v$flashback_database_stat;

5.5 restore point

      保证还原点可确保在任何时间通过执行FLASHBACK DATABASE命令都可以闪回到该SCN CREATE RESTORE POINT before_upgrade GURARANTEE FLASKBACK DATABASE;

要使用保证还原点,数据库必须满足以下先决条件:

  • COMPATIBLE初始化参数必须设置为10.2或更大值
  • 数据库必须运行在ARCHIVELOG模式下
  • FLASHBACK DATABASE需要使用从还原时间点开始的归档重做日志
  • 必须配置快速恢复区

5.6 resetlog

resetlog的作用
(1)将重做日志的序列号设为1
(2))一般以该子句打开数据库后,要立即备份数据库,因为这个子句会使数据库以前的备份不能用.
(3)在重做日志当前日志组出现错误时,要以该子句打开数据库.该子句会重新设置重做日志文件的状态.(redo log失效)
(4)让数据库系统归档初始化,重新生成归档文件.

5.7 针对单个PDB数据库进行闪回

12C新特性 实验步骤:
1、连接PDB,准备测试数据
PDB数据库:
alter session set container=sales;
Drop table t1;
shutdown immediate

2、在根容器中闪回PDB
根容器中:
FLASHBACK PLUGGABLE DATABASE sales TO SCN 3078796;
ALTER PLUGGABLE DATABASE sales open RESETLOGS;

六、 闪回事务

6.1原理

      能够撤销一个或多个事务的修改,其功能由一个名为DBMS_FLASHBACK.TRANSACTION_BACKOUT的存储过程实现。该存储过程的工作原理是自动分析重做日志,挖掘出变更前的值用以构建撤销SQL(Undo SQL),然后执行撤销SQL最后达到撤销事务的目的。为了该功能可以正常使用,至少需要事先启用主键补充日志。另外,为了能够跟踪外键依赖还需要启用外键补充日志。
12C不支持了

6.2实验

1、创建一个测试用户
create user testuser identified by 123;
grant dba to testuser;

2、先决条件
①需要附加的日志数据
SQL>alter database add supplemental log data;
SQL>alter database add supplemental log data(primary key) columns;
②用户具备dbms_flashback包的执行权限
SQL>grant execute on dbms_flashback to testuser;
③用户具有select any transaction权限
SQL>grant select any transaction to testuser;

3、创建表和测试数据
create table flash_test2(empno varchar2(20),salary number);
insert into  flash_test2 values('1',1000);
commit;

4、更改数据并commit
update flash_test2 set salary=salary*3;
commit;
update flash_test2 set salary=salary*1.1 where empno='1';
commit;

5、查询15分钟内提交的事务号
select distinct_xid,commit_scn
from flashback_transaction_query
where table_name='FLASH_TEST2'
and commit_timestamp>systimestamp-interval '15' minute
order by commit_scn;

6、查看还原SQL
select UNDO_SQL from flashback_transaction_query where commit_scn=1025983;

七、闪回归档

7.1原理

      单独存放表的还原数据,使数据能保留更长时间。

      当为一个表启用Flashbackup Data Archive 会创建另外一张表(和其他几个对象),可用于存储行的所有先前的版本,如果愿意可以永远的存储他们,当针对表提交了DML操作后,一个称为flashback data archive(FBDA)的后台进程将捕捉必须的数据,并将他们保存到归档文件中(这里的归档文件?的是flashback data archive的归档文件),因此可以使用flashback data archive回溯到多年以前。

      在创建flashback data archive 时可以执行时间限制,FBDA可以保存该时间点之前所有的数据,过期后的数据会自动删除,FDBA负责在归档中创建对象,根据需要使用行来填充。并清除超过有效期的数据。

7.2实验

1、创建表空间
create tablespace guidang datafile '/u01/app/test/dbf' size 200m;

2、创建闪回归档,指定表空间和保留时间
create flashback archive default abcd tablespace guidanng retention 30 day;

3、指定某张表使用闪回归档
alter table test flashback archive abcd;
取消:alter table test no flashback archive;

4、查看闪回归档
select * from dab_flashback_archive;

5、清除闪回归档数据
Alter flashback archive abcd purge before timestamp/scn …;