闪回
闪回配置
- 开启归档
alter database archivelog;
- 配置闪回区
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定可在多长时间内闪回数据库,单位为分钟,默认1440分钟(1天),实际取决于闪回区大小
SQL> alter system set db_recovery_file_dest_size=50G scope=both;
SQL> alter system set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area' scope=both;
SQL> alter system set db_flashback_retention_target=2880 scope=both;
- 开启闪回
SQL> alter database flashback on;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
- 闪回日志大小
SQL> select * from v$recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES CON_ID
----------------------- ------------------ ------------------------- --------------- ----------
CONTROL FILE 0 0 0 0
REDO LOG 0 0 0 0
ARCHIVED LOG 0 0 0 0
BACKUP PIECE .04 0 1 0
IMAGE COPY 0 0 0 0
FLASHBACK LOG .78 0 2 0
FOREIGN ARCHIVED LOG 0 0 0 0
AUXILIARY DATAFILE COPY 0 0 0 0
闪回使用
闪回功能:
闪回数据库某一时刻,闪回数据库(flashback database)
使用闪回表将表内容还原到过去的特定时间点,闪回表(flashback table)
从删除表中进行恢复,闪回删除(flashback drop)
使用闪回查询查看截止到任一时间点的表内容,闪回查询(flashback query)
使用闪回版本查询查看某一行在一段时间内的各个版本,(flashback version query)
使用闪回事务查询查看事务处理历史记录或行,闪回事务查询(flashback transcation query)
闪回级别 | 闪回场景 | 闪回技术 | 对象依赖 | 影响数据 |
数据库 | 表截断、逻辑错误、其他多表意外事件 | 闪回DATABASE | 闪回日志、undo | 是 |
DROP | 删除表 | 闪回DROP | 回收站(recyclebin) | 是 |
表 | 更新、删除、插入记录 | 闪回TABLE | 还原数据,undo | 是 |
查询 | 当前数据和历史数据对比 | 闪回QUERY | 还原数据,undo | 否 |
版本查询 | 比较行版本 | 闪回Version Query | 还原数据,undo | 否 |
事务查询 | 比较 | 闪回Transaction Query | 还原数据,undo | 否 |
归档 | DDL、DML | 闪回Archive | 归档日志 | 是 |
闪回相关视图和常用语句
V$database
这个视图可以查看是否启用了Flashback database功能
SQL> select flashback_on from v$database;
V$flashback_database_log
Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少,该视图就可以查看许多有用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点
Flashback_size: 记录了当前使用的Flash Recovery Area 空间的大小
Retention_target: 系统定义的策略
Estimated_flashback_size: 根据策略对需要的空间大小的估计值
SQL> select oldest_flashback_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh24:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es from v$flashback_database_log;
SQL> select oldest_flashback_scn, to_char(oldest_flashback_time,'yy-mm-dd hh24:mi:ss'), retention_target,flashback_size, estimated_flashback_size from v$flashback_database_log;
OLDEST_FLASHBACK_SCN TO_CHAR(OLDEST_FL RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- ----------------- ---------------- -------------- ------------------------
9618372 22-07-11 10:18:22 2880 419430400 553009152
V$flashback_database_stat
这个视图用来对Flashback log 空间情况进行更细粒度的记录和估计。
这个视图以小时为单位记录单位时间内数据库的活动量:
Flashback_Data 代表Flashback log产生数量,
DB_Date 代表数据改变数量,
Redo_Date代表日志数量,
通过这3个数量可以反映出数据的活动特点,更准确的预计Flash Recovery Area的空间需求
v$recovery_area_usage
恢复区的使用情况
selecct * from v$recovery_area_usage;
常用语句
(1)查看数据库状态
SQL> select NAME,OPEN_MODE ,DATABASE_ROLE,CURRENT_SCN,FLASHBACK_ON from v$database;
(2)获取当前数据库的系统时间和SCN
SQL> select to_char(systimestamp,'yyyy-mm-dd HH24:MI:SS') as sysdt , dbms_flashback.get_system_change_number scn from dual;
(3)查看数据库可恢复的时间点
SQL> select * from V$FLASHBACK_DATABASE_LOG;
(4)查看闪回日志空间情况
SQL> select * from V$flashback_database_stat;
(5)SCN和timestamp装换关系查询
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
(6)查看闪回restore_point
select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;
(7)scn转timestamp
select timestamp_to_scn(to_timestamp('2022-07-11 15:19:00', 'YYYY-MM-DD HH24:MI:SS')) from v$database;
SCN转换成时间
select scn_to_timestamp(current_scn) from v$database;
时间转换成SCN
select timestamp_to_scn(sysdate) from v$database;
闪回数据库
语法:
FLASHBACK [STANDBY] DATABASE
{TO [SCN|TIMESTAMP]
闪回数据库是通过使用一类被称为闪回数据库日志的日志文件来实施的。oracle数据库会定期将数据块的“前像”记录在闪回数据库日志中。为了快速将数据文件更改回退到捕获闪回日志的时间(就在所需目标时间之前),可以重用块前像。然后,应用重做日志文件中的更改来填充间隔。在快速恢复区中会自动创建和管理闪回数据库日志。
闪回数据库:是当出现逻辑错误时,能够将整个数据库回退到出错前的那个时间点上。比如:用户截断了表(truncate),系统管理员误删除了用户,用户错误的执行了某个批处理任务,或者该批处理任务的脚本编写错误,使得多个表的数据发生混乱.
闪回数据库的日志文件不是由传统的Log Writer (LGWR)进程写入,而是由一个称为RecoVery WRiter (RVWR)的新进程写入,闪回日志文件由RCWR进程在恢复区中自动创建和维护。实现闪回数据库的基础是闪回日志,只要我们配置了闪回数据库,就会自动创建闪回日志。这时,只要数据库里的数据发生变化,oracle就会将数据被修改前的旧值保存在闪回日志里,当我们需要闪回数据库时,oracle就会读取闪回日志里的记录,并应用到数据库上,从而将数据库回退到历史的某个时间点上。
一般步骤
- 关闭数据库
- 启动到mount状态
- 闪回数据库
flashback database to timestamp to_timestamp('2020-11-2 :57:02','yyyy-mm-dd hh24:mi:ss');
flashback database to SCN 2241813; - 以read only 方式打开,验证数据,如果不够理想,可以重新使用闪回
- 验证数据
- 以resetlogs 方式打开数据库
闪回数据库限制
已还原或重新创建了控制文件
已删除了表空间
已收缩了数据文件
Flashback Database 不能解决Media Failure, 这种错误RMAN恢复仍是唯一选择。
非归档模式
闪回示例
确认好时间点后进行闪回
闪回到过去时间点:闪回需要在Mount状态下进行,可以指定Timestamp/SCN/Sequence进行闪回。
shutdown immediate;
startup mount;
flashback database to timestamp to_timestamp('2022-07-11 13:29:00','yyyy-mm-dd hh24:mi:ss');
flashback database to SCN 9647277;
以read only 方式打开,验证数据,如果不够理想,可以重新使用闪回
alter database open read only;
select OPEN_MODE from v$database;
验证数据是否正确
以resetlogs 方式打开数据库
alter database open resetlogs;
select * from v$log
select resetlogs_id from v$archived_log group by resetlogs_id;
闪回总结
闪回数据库:减少还原时间
闪回数据库比使用还原文件和重做日志文件的传统时间点恢复的速度要更快。随着数据库规模的增加,通过还原所有数据文件来执行传统的时间点恢复所需的时间长度变得不太现实。使用闪回数据库时,因为不要需要还原数据文件,所以恢复数据库的时间与需要回退的更改数目成比例。
在不能使用闪回数据库功能的情况下,必须使用不完全恢复操作将数据库返回到特定时间。
闪回数据库操作完成后,可在只读模式下打开数据库,验证是否使用了正确的目标时间或系统更改号(SCN)。如果没有,可以再次闪回数据库,或者通过执行恢复操作来前滚数据库。因此,要撤销闪回数据库操作,必须向前恢复数据库。
闪回数据库操作完成后,必须使用以下一种方法打开数据库:
· 在只读模式下验证是否使用了正确的目标时间或SCN
· 使用RESETLOGS 参数才允许进行更新
优点:
闪回技术由于只能处理更改数据,所以从根本上改变了恢复技术。使用这个技术时,从错误中恢复花费的时间等于制造错误所花费的时间。
当闪回技术使用时,它与介质恢复相比,在易用性、可用性和还原时间方面有明显的优势。
闪回数据库使用闪回日志执行闪回。闪回删除使用回收站。其他所有功能都使用还原数据。
复原点
复原点是手动创建的一个时间点,数据库可以闪回到创建的该复原点。
普通复原点:只是在闪回或恢复操作中为指定以前的SCN或时间点提供方便。但不保证数据库在所有情形下都保留成功执行闪回数据库操作所需的闪回数据库日志。
创建普通复原点:CREATE RESTORE POINT point_name;
有保证的复原点:保证可以把数据库倒退到由复原点指定的SCN或时间点.
创建有保证的复原点:CREATE RESTORE POINT point_name GUARANTEE FLASHBACK DATABASE;
删除复原点:DROP RESTORE POINT point_name;
查看还原点
通过查看v$restore_point视图
创建复原点注意事项:
1.创建复原点必须打开归档模式
2.创建复原点可以不打开闪回
3.创建复原点若闪回没打开数据库需为装载状态
4.在闪回数据库处于关闭状态时, 创建第一个可靠还原点需要装载模式(且FLASHBACK_ON状态为RESTORE POINT ONLY)
创建复原点
SQL> CREATE RESTORE POINT storepoint_1 GUARANTEE FLASHBACK DATABASE;
利用复原点闪回数据库(mount下):
FLASHBACK DATABASE TO RESTORE POINT storepoint_1;
open resetlogs
闪回drop
用于恢复用户误删除的对象(包括表,索引等),这个技术依赖于Tablespace Recycle Bin(表空间回收站),这个功能和windows的回收站非常类似。
Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空。Flashback Drop 是基于Tablespace RecycleBin 来实现恢复的。
1 查看回收站是否开启:
初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭。
show parameter recyclebin
2 开启、关闭回收站
ALTER SYSTEM SET recyclebin = ON;
ALTER SESSION SET recyclebin = ON;
ALTER SYSTEM SET recyclebin = OFF;
ALTER SESSION SET recyclebin = OFF;
3 回收站内容
show recyclebin;
SELECT * FROM RECYCLEBIN;
SELECT * FROM USER_RECYCLEBIN;
SELECT * FROM DBA_RECYCLEBIN;
4 清空回收站
purge dba_recyclebin;
purge recyclebin;
purge table test
purge index test_index
5 闪回删除的表
create table t1 as select * from dba_objects where rownum<100;
select count(1) from user_recyclebin;
select object_name,original_name from user_recyclebin;
drop table t1;
FLASHBACK TABLE t1 TO BEFORE DROP RENAME TO t1_recovery ;
show recyclebin;
6 Flashback Drop 需要注意的地方:
1). 只能用于非系统表空间和本地管理的表空间
2). 对象能否恢复成功,取决与对象空间是否被覆盖重用。
3). 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,
因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,
闪回表
语法:
FLASHBACK TABLE [schema.]<table_name>
TO
{
[BEFORE DROP [RENAME TO TABLE] |
[SCN | TIMESTAMP] expr [ENABLE|DISABLE] TRIGGERS]
}
其中:[ENABLE|DISABLE] TRIGGERS],表示触发器恢复以后的状态,默认是disable
闪回表就是对表的数据做回退,回退到之前的某个时间点,其利用的是undo的历史数据,与undo_retention设置有关,默认1440分钟。
SYS用户不支持闪回,Flashback Table是使用UNDO tablespace的内容来实现对数据的回退。如果想要对表进行flashback,必须允许表的row movement.
示例:
alter table scott.t1 enable row movement;
flashback table scott.t1 to timestamp to_timestamp('2020-07-11 16:20:00','yyyy-mm-dd hh24:mi:ss');
alter table scott.t1 disable row movement;
总结:
基于undo 的表恢复,需要注意DDL 操作的影响。
修改并提交过数据之后,对表做过DDL 操作,包括:drop、modify 列, move 表, truncate table/partition,drop table 等这些操作会令undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query会触发ORA-01466 错误。
基于undo 的表恢复,flashback table 实际上做的也是dml 操作。
闪回查询
实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。
同样可以使用SCN 或者timestamp。
select timestamp_to_scn(to_date('2022-07-11 15:00:00','YYYY-MM-DD HH24:MI:SS')) from dual;
Flashback Query
Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据
查看过去的数据:
select * from t1 as of timestamp sysdate-2/1440;
select * from t1 as of timestampto_timestamp('2022-07-11 11:00:00','YYYY-MM-DD hh24:mi:ss');
select * from t1 as of scn 2747244;
注意:flashback query 对v$tables,x$tables 等动态性能视图无效,dba_*,all_*,user_*等 数据字典是有效的。
该特性也完全支持访问远端数据库,比如select * from t_1@dblink as of scn 98900。
Flashback version Query
相对于Flashback Query 只能看到某一点的对象状态,Flashback Version Query可以看到过去某个时间段内,记录是如何发生变化的。
根据这个历史,DBA就可以快速的判断数据是在什么时点发生了错误,进而恢复到之前的状态。
伪列 ORA_ROWSCN. 所谓的伪列,就是假的,不存在的数据列,用户创建表时虽然没有指定,但是Oracle为了维护而添加的一些内部字段,这些字段可以像普通文件那样的使用。
最熟悉的伪列就是 ROWID, 它相当于一个指针,指向记录在磁盘上的位置。ORA_ROWSCN 是Oracle 10g 新增的,暂且把它看作是记录最后一次被修改时的SCN。
Flashback Version Query 就是通过这个伪列来跟踪出记录的变化历史。
语法如下:
SELECT .....FROM tablename VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND end} --start,end可以是时间也可以是scn
Flashback Version Query伪列说明:
versions_start{scn|time} 版本开始的scn或时间戳
versions_end{scn|time} 版本结束scn或时间戳,如果有值表明此行后面被更改过是旧版本,如果为null,则说明行版本是当前版本(即versions_operation值为D)。
versions_xid 创建行版本的事务ID
ersions_operation 在行上执行的操作(I=插入,D=删除,U=更新)
示例:
SQL> create table sp_t(name varchar2(20));
SQL> insert into sp_t values('1');
SQL> insert into sp_t values('2');
SQL> insert into sp_t values('3');
SQL> select ora_rowscn, name from sp_t;
ORA_ROWSCN NAME
---------- ------------------------------
9658985 1
9658985 2
9658985 3
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SELECT versions_xid,
versions_startscn,
versions_endscn,
DECODE(versions_operation, 'I', 'Insert', 'U', 'Update', 'D', 'Delete', 'Original') "Operation",
NAME
FROM sp_t versions BETWEEN TIMESTAMP to_timestamp('2022-07-11 15:19:00', 'YYYY-MM-DD HH24:MI:SS') AND to_timestamp('2022-07-11 15:20:00', 'YYYY-MM-DD HH24:MI:SS');
闪回事务查询(开启附加日志)
闪回事务查询应该说是一种诊断工具,帮助识别数据库发生的事务级变化,可以用于事务审计的数据分析,可以识别在一个特定时间段发生的变化,可以对数据库表进行事务级别的恢复
注意:12.2 C CDB环境不支持
Flashback Transaction Query也是使用UNDO信息来实现。利用这个功能可以查看
某个事务执行的所有变化,它需要访问flashback_transaction_query 视图,这个视图的XID列代表事务ID,利用这个ID可以区分特定事务发生的所有数据变化。
Flashback Transaction Query实际上是查询的数据字典flashback_transaction_query。可以根据flashback_transaction_query 的undo_sql列值返回数据以前版本。
SELECT xid,
operation,
commit_scn,
undo_sql
FROM flashback_transaction_query
WHERE xid IN (SELECT versions_xid FROM sp_t versions BETWEEN scn 9659390 AND 9659512);
闪回数据归档
Oracle 11g推出一个新特性:Oracle Flashback Data Archive.
该技术与之前的Flashback的实现机制不同,通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo区别开来,这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响undo策略。并且可以根据需要指定哪些数据库对象需要保存历史变化数据,而不是将数据库中所有对象的变化数据都保存下来,这样可以极大地减少空间需求。Flashback Data Archive并不是记录数据库的所有变化,而只是记录了指定表的数据变化。所以,Flashback Data Archive是针对表对象的保护,是Flashback Database的有力补充。
1 闪回数据归档区
闪回数据归档区是闪回数据归档的历史数据存储区域,在一个系统中,可以有一个默认的闪回数据归档区,也可以创建其他许多的闪回数据归档区域。每一个闪回数据归档区都可以有一个唯一的名称。同时,每一个闪回数据归档区都对应了一定的数据保留策略。闪回数据归档区是一个逻辑概念,是从一个或者多个表空间中拿出一定的空间,来保存表的修改历史,这样就摆脱了对Undo撤销数据的依赖,不利用undo就可以闪回到归档策略内的任何一个时间点上。
select * from dba_FLASHBACK_ARCHIVE;
select * from dba_FLASHBACK_ARCHIVE_TS;
select * from dba_FLASHBACK_ARCHIVE_TABLES;
2 Flashback archive的后台进程
Oracle为Flashback data archive特性专门引入了一个新的后台进程FBDA,
用于将追踪表(traced table,也就是将指定使用flashback data archive的table)
的历史变化数据转存到闪回归档区。
3 Flashback archive 的限制条件
1)Flashback data archive只能在ASSM的tablespace上创建
2)Flashback data archive要求必须使用自动undo管理,即 undo_management 参
数为auto
**4 创建FDA **
create tablespace fda_tbs1 datafile ' /u01/app/oracle/oradata/orcl/datafile/fda_tbs1' size 100M;
create tablespace fda_tbs2 datafile ' /u01/app/oracle/oradata/orcl/datafile/fda2.dbf' size 100M;
创建一个默认的Flashback Archive,数据保留期为1个月
create flashback archive default fla1 tablespace fda_tbs1 retention 1 month;
create flashback archive fla2 tablespace fda_tbs2 retention 10 day;
ALTER FLASHBACK ARCHIVE FLA2 SET DEFAULT;
ALTER FLASHBACK ARCHIVE FLA1 ADD TABLESPACE TBS_DATA2;
ALTER FLASHBACK ARCHIVE FLA1 REMOVE TABLESPACE TBS_DATA2;
ALTER FLASHBACK ARCHIVE FLA1 MODIFY RETENTION 1 MONTH;
ALTER FLASHBACK ARCHIVE FLA1 PURGE ALL;
ALTER FLASHBACK ARCHIVE FLA1 PURGE BEFORE TIMESTAMP(SYSTIMESTAMP - INTERVAL '1' DAY);
DROP FLASHBACK ARCHIVE FLA2;
5 FBDA会产生两个内部表
对某一个表使用FBDA后,我们可以根据视图dba_flashback_archive_tables找出其中一个内部表SYS_FBA_HIST_XXX。当然我们知道他是用来存储所有的在这个表上发生过的数据变化。还有另一个内部表也被使用,这个表叫做SYS_FBA_TCRV_XXX。
SYS_FBA_HIST_XXX是存放发生过的transaction的数据更改的前镜像。
SYS_FBA_TCRV_XXX则是存放transaction的信息。
6 Flashback Data Archive的表支持以下的DDL 操作
1)Adds, drops, renames, or modifies a column
2)Adds, drops, or renames a constraint
3)Drops or truncates a partitionor subpartition operation
4)TRUNCATE TABLE statement
5)RENAME statement that renames a table
-- 启动Flashback Data Archive的表上的一些DDL 操作可能触发ORA-55610的错误,
这些DDL 如下:
(1)ALTER TABLE statement that moves or exchanges a partition
or subpartition operation
(2)DROP TABLE statement
7 使用闪回数据归档
闪回数据归档区创建完成以后,就可以指定特定的表,使其对应到特定的数据归档区。
把表指定到对应的数据归档区有两种方法:
一是在创建的时候直接指定归档区,一种是对现有的表指定一个归档区。注意,如果不指定归档区的名称,则指定到默认归档区,否则,就属于指定的数据归档区。
例子:
授权:
grant flashback archive on fla1 to user_name;
grant flashback archive on fla2 to user_name;
grant select any transaction to user_name;
grant flashback archive administer to user_name;
1)create table wzx_date(a int) flashback archive;
2)alter table t1 flashback archive ;
3)alter table t1 no flashback archive;
4) alter table t1 no flashback archive fla2;
select * from wzx_date as of timestamp to_timestamp('2022-07-11 15:19:00', 'YYYY-MM-DD HH24:MI:SS');
闪回PDB
在Oracle Database 12.1中,闪回数据库操作仅限于 CDB ,Oracle Database 12.2支持 CDB 与 PDB 数据库的闪回(RMAN下进行闪回恢复)
12.2.0.1起默认本地undo
RMAN> alter pluggable database my_pdb close;
RMAN> flashback pluggable database my_pdb to scn 3018760;
RMAN> alter pluggable database my_pdb open read only;
RMAN> alter pluggable database my_pdb open resetlogs;
如果使用的shared undo模式下 PDB 闪回数据库,语法有点不同,就是需要制定辅助实例的位置。有点类似12c的特性RECOVER TABLE
RMAN> flashback pluggable database pdb_name to scn the_scn auxiliary destination '/XXX/auxiliary';
RMAN> flashback pluggable database pdb_name to restore point restore_point auxiliary destination '/XXX/auxiliary';