摘要
Oracle闪回技术是由一组功能组成,支撑查看数据库以前状态和来回读取数据,而无需备份还原数据库。使用此技术可帮助用户分析错误并从错误中进行恢复。
使用闪回技术:
- 查看数据的以前状态
- 来回读取数据
- 协助用户执行错误分析和恢复
########
闪回查询:查询过去某个时间点存在的已提交数据。带有as of 子句的select 命令通过时间戳或者SCN 引用过去的某一时间。
闪回版本查询:查看在特定时间间隔内提交的历史数据。使用select 命令的versions between 子句。
闪回事务处理查询:查看在事务处理级进行的所有数据库更改。从用户误操作中进行恢复的可能解决方法包含以下几个:
闪回事务处理恢复:回退特定的事务处理及其丛书事务处理
闪回表:将表读回到其某一时间的内容,但是不影响其他数据对象。
闪回删除:通过将删除了的表以及其从属对象从回收站还原到数据库,撤销删除该表。
闪回数据库:将数据库返回到一个过去的时间或某个SCN 。
一、 闪回主要应用场景
如何开启闪回:
a.数据库是归档模式
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /oracle/oradata/arch
Oldest online log sequence 7
Next log sequence to archive 9
Current log sequence 9
如果没有开启归档,则必须开启。
b.数据库已开启闪回
--确认数据库是否开启闪回
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
NO
如果没有开启闪回,则必须开启
--如果没有则手动开启
SQL> alter system set db_recovery_file_dest='/oracle/oradata/fra' scope=spfile;
SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=4g scope=spfile;
SQL> shutdown immediate
SQL> startup mount
SQL> alter database flashback on;
SQL> alter database open
--再次查看闪回是否开启
SQL>select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
--闪回区空间使用情况查询
SQL> select * from v$flash_recovery_area_usage;
1. 闪回查询
闪回查询:查询过去某个时间点存在的已提交数据。带有as of 子句的select 命令通过时间戳或者SCN 引用过去的某一时间。
数据来源:undo data
如果保留历史数据的undo data 被覆盖,就无法获得历史数据,也就是说受undo_retention 保留时间影响;
SQL> show parameter undo_reten
NAME TYPE VALUE
---------------- ----------- -----------
undo_retention integer 10800
工作原理:一致性读机制
闪回查询分为两种:
闪回时间点查询(Flashback query )
闪回版本查询(Flashback Version query )
1.1 闪回时间点查询
--查询指定时间点的行
SQL>select * from hr.EMPLOYEES as of timestamp to_timestamp('2020-07-05 21:36:37','YYYY-MM-DD HH24:MI:SS');
--查询指定SCN 的数据
SQL>select * from hr.JOB_HISTORY as of scn 1079029;
1.2 查询版本查询
闪回版本查询用于查询一段时间范围内表的数据。
SQL>select location from mytable1 versions between timestamp (systimestamp - interval '10' minute) and maxvalue where id=1;
2. 闪回表
数据来源:undo 数据
工作原理:将表里的数据会退某个时间点,例如回退到误删除数据之前的时间点,这个过程中, 数据库仍然可用,如果闪回表所需要的undo 数据,保留的时间超过了初始化参数undo_retention 所指定的值,从而导致该undo 数据块被其他事务覆盖,就不能恢复到指定的时间点了。
1) 被闪回的表必须启用行移动功能
alter table frankshi enable row movement;
2) 执行闪回表命令的用户必须有FLASHBACK ANY TABLE 权限或在被闪回表上有FLASHBACK 对象权限;
3) FLASHBACK TABLE 属于ddl 命令,自动提交;
--将test 表闪回到6 分钟之前
SQL> flashback table frankshi to timestamp (systimestamp - interval '6' minute);
--执行闪回到具体的时间
FLASHBACK TABLE TABLE_NAME
TO TIMESTAMP TO_TIMESTAMP('2013-10-17 09:30:00', 'YYYY-MM-DD HH:MI:SS');
--将 test 表闪回到 SCN 为 1085789 的时候
SQL> flashback table frankshi to scn 1085789;
注意 :
1. 闪回表是作为一个独立事务存在的,在闪回期间,整个表会被锁定,不能执行其他的dml 操作;
2. 统计信息不能被闪回;
3. 当前的索引和依赖的对象会被维护;
4. 闪回表的操作不能对以下情况进行闪回:
a. 无法闪回系统表
b. 不能跨越ddl 操作
5. 闪回会产生相应的undo 和redo 数据
4. 闪回删除
将某些误删除的表,恢复到删除前的状态:
数据来源:表空间的回收站机制;
工作原理: 当一个表被删除之后,不会被骂上覆盖,只是在其占用的空间上标记了删除;
删除的表将会出现在回收站,但是名字回变成‘BIN$qbQLAzUSRejgU0MfqMBqzQ==$0 ’ 这种形式;
只要没有被覆盖数据就能回来。
即使表空间是自动能够扩展的,也是先覆盖掉删除的数据。
1) 查看当前的回收站机制是否开启(默认开启的)
2) 删除机制
drop table table_name; --这样的删除方式,会实现回收站机制,可能实现闪回drop的;
drop table table_name purge; --彻底删除,不会进入回收站的数据字典,无法实现闪回drop;
3) 删除test 表
SQL> drop table frankshi;
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$qbU/6DG0R0rgU0MfqMBvWg==$0 TABLE
4) 其他显示方法
a) 查看当前的recyclebin
b) 通过数据字典查询
SQL> select object_name,original_name,operation,type,droptime from user_recyclebin;
5) 闪回drop
SQL> flashback table frankshi to before drop;
SQL> flashback table frankshi to before drop rename to test; --闪回的同时,修改表的名字
SQL> purge table "BIN$qbQLAzUSRejgU0MfqMBqzQ==$0";--删除垃圾表
SQL> purge tablespace users; --删除users表空间中所有的回收站对象
SQL> purge recyclebin; --清空回收站
删除一个表,对应的约束和索引也都删除掉;
闪回表的时候,对应的约束和索引也都回来 ,但是名字回不来了,是一个很乱的名字;
当两个表有相互的主外键关系的时候,要删除表之前的主外键关系,然后再删除表,这时在使用闪回技术的就不能恢复主外键关系!
5. 闪回数据库
数据来源:闪回日志
工作原理:闪回数据库是由RVWR 后台进程负责、需要闪回日志和闪回区。闪回数据库的实现机理是闪回日志,当数据库配置了闪回数据库,闪回日志会自动生成。数据库一旦发现数据有变化就会将变化前的数据写入到闪回日志中,当必要的时候执行闪回数据库就会闪回到数据修改之前的状态。
闪回数据库的限制:
1 )重建控制文件
2 )删除表空间和删除数据文件
3 )数据文件大小的修改
4 )nologging 模式
5 )如果要实现闪回数据库功能,需要开启FLASHBACK_ON
(1) 闪回数据库的相关进程以及闪回日志存储区域
RVWR:
[oracle@shijw ~]$ ps -ef | grep ora_ | grep rvwr
oracle 18113 1 0 Jul05 ? 00:00:11 ora_rvwr_orcl
闪回日志存放在闪回恢复区(如果没有设置闪回恢复区,需要事先设置闪回恢复区)
设置闪回恢复区的方法:
开启FRA 只需要设置两个参数
DB_RECOVERY_FILE_DEST
DB_RECOVERY_FILE_DEST_SIZE
FRA:Oracle 自动管理,当闪回恢复区空间不足时进行自动管理,减少了手工维护。
[oracle@shijw flashback]$ pwd
/oracle/oradata/fra/ORCL/flashback
[oracle@shijw flashback]$ ls -rtl
total 256040
-rw-r----- 1 oracle oinstall 52436992 Jul 6 19:00 o1_mf_hj4kcbvg_.flb
-rw-r----- 1 oracle oinstall 52436992 Jul 6 22:00 o1_mf_hj4pwtpl_.flb
-rw-r----- 1 oracle oinstall 52436992 Jul 7 08:10 o1_mf_hj611w7p_.flb
-rw-r----- 1 oracle oinstall 52436992 Jul 7 21:00 o1_mf_hj6cmm61_.flb
-rw-r----- 1 oracle oinstall 52436992 Jul 8 03:40 o1_mf_hj4kc7v1_.flb
闪回日志保留时长,默认一天(单位分钟)
SQL> show parameter db_flashback_retention_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
(2) 闪回数据库演示
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1204690
SQL> truncate table frankshi.REGIONS;
Table truncated.
将数据库闪回到scn :1204690
闪回数据库需要到mount 状态下
SQL> shutdown immediate --首先关闭数据库
SQL> startup mount --启动到mount状态;
SQL> flashback database to scn 1204690;--闪回操作
SQL> alter database open resetlogs; --open数据库,以resetlogs的方式open
注意 当然只是一张表数据丢失,没有必要闪回数据库,闪回数据丢失的表即可。
二、12c 闪回新特性
Oracle 12c 以上支持 CDB 与 PDB 数据库的闪回
PDB 级别闪回:
先决条件:
1 )你必须有 SYSDBA , SYSBACKUP 或者 SYSDG 系统权限。
2 )如果您已连接到多租户容器数据库(CDB ):
闪回一个CDB ,须连接到root ,必须有 SYSDBA , SYSBACKUP 或者 SYSDG 系统权限。
闪回一个PDB ,须连接到root ,必须被授予 SYSDBA , SYSBACKUP 或者 SYSDG 系统,或者连接需要闪回的pdb ,须有 SYSDBA , SYSBACKUP 或者 SYSDG 系统权限,通常在该PDB 中本地授予。
必须为数据库准备好快速恢复区。除非将数据库闪回到强制闪回点。
此外:
1 )数据库必须在 ARCHIVELOG 模式下运行。
2 )必须使用当前控制文件安装数据库,但不能打开数据库。控制文件不能备份或重新创建。
3 )数据库不得包含任何在线表空间
三、19c 闪回新特性
1. 闪回主数据库时闪回备用数据库
在主数据库上执行闪回操作时,可以自动闪回Oracle Data Guard 设置中的备用数据库。
在主数据库上执行闪回操作时,备用数据库不再与主数据库同步。在早期版本中,需要执行某些步骤以将备用数据库与主数据库同步。此功能引入了一个新参数,当对主数据库执行闪回操作时,该参数可使备用数据库自 动闪回。这样可以减少时间,精力和人为错误,从而加快同步速度并减少恢复时间目标(RTO )。
1. 案例背景
某个时间点客户反馈数据库存在连不上的情况。且本地sqlplus 也无法登陆。
2. 排查过程
数据库连接不上首先第一时间想到排查数据库alert 日志,发现以下信息:
*************************************************************
Unable to allocate flashback log of 1946 blocks from
current recovery area of size 104857600 bytes.
Recovery Writer (RVWR) is stuck until more space
is available in the recovery area.
Unable to write Flashback database log data because the
recovery area is full, presence of a guaranteed
restore point and no reusable flashback logs.
Thu Aug 20 14:59:33 2020
*************************************************************
分析日志发现是闪回空间不足,这时候有两个思路:1 、如果能正常登录数据句,清除强制闪回点;2 、如果不能正常登录数据库,则启动到mount 删除强制闪回点。
查询闪回信息代码如下:
SQL> select name,scn,GUARANTEE_FLASHBACK_DATABASE,STORAGE_SIZE,TIME from v$restore_point;
NAME SCN GUA STORAGE_SIZE TIME
-------------------- ---------- --- ------------ ---------------------------------
GOOD_DATA4 8198310 YES 104857600 20-AUG-20 02.54.57.000000000 PM
RESTORE_POINT_TEST 8195440 NO 0 20-AUG-20 02.28.55.000000000 PM
删除相关闪回点,即可解决,代码如下:
SQL> drop restore point GOOD_DATA4;
3. 案例总结
遇到此类故障,一般有两个处理思路:1 、扩大闪回空间;2 、删除强制闪回点
一般来说闪回空间都是提前规划好,很多时候没有空间可扩,所以在数据库日常维护中,如果生产库开启了闪回功能,要特别注意闪回空间使用率以及是否存在强制闪回点。
其他参考:
https://blog.csdn.net/m0_37996629/article/details/127763165