闪回监控 闪回日志大小

简介: 闪回数据库的特性 Flashback Database 功能非常类似与RMAN的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态, 这个功能依赖于Flashback log 日志,而且比RMAN更快速、高效。

闪回数据库的特性 

Flashback Database 功能非常类似与RMAN的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态, 这个功能依赖于Flashback log 日志,而且比RMAN更快速、高效。 因此Flashback Database 可以看作是不完全恢复的替代技术。 但它也有某些限制:
1. Flashback Database 不能解决Media Failure, 这种错误RMAN恢复仍是唯一选择
2. 如果删除了数据文件或者利用Shrink技术缩小数据文件大小,这时不能用Flashback Database技术回退到改变之前的状态,这时候就必须先利用RMAN把删除之前或者缩小之前的文件备份restore 出来, 然后利用Flashback Database 执行剩下的Flashback Datbase。
3. 如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用Flashback Database。
4. 使用Flashback Database锁能恢复到的最早的SCN, 取决与Flashback Log中记录的最早SCN。

闪回数据库 的架构 
Flashback Database 整个架构包括一个进程Recover Writer(RVWR)后台进程,Flashback Database Log日志和Flash Recovery Area。一旦数据库启用了Flashback Database, 则RVWR进程会启动,该进程会向Flash Recovery Area中写入Flashback Database Log, 这些日志包括的是数据块的 " 前镜像(before image)", 这也是Flashback Database 技术不完全恢复块的原因。RVWR进程写入的是闪回数据库日志,详细流程图见下图。


[oracle@dg1 ~]$ ps -ef|grep rvw|grep -v grep
oracle    2665     1  0 08:53 ?        00:00:00 ora_rvwr_orcl

RVWR和LGWR的区别

假设T表C1列默认值为null,并进行了如下操作

时间点

作用的列 T(C1)的 SQL

RVWR

LGWR

09:00:00

Update T set c1=1;

改变前的值 null

改变前的值 null,改变后的值 1

09:10:00

Update T set c1=2;

改变前的值 1

改变前的值 1,改变后的值2

09:15:00

Update T set c1=3;

改变前的值 2

改变前的值 2,改变后的值3

09:20:00

Update T set c1=4;

改变前的值 3

改变前的值 3,改变后的值4

闪回日志和联机重做日志虽然作用相似 ,但他们还是有不少差异。 闪回日志不是循环使用的,联机重做日志是循环使用的。当事务修改了buffer cache中的数据块时,会将改变前的值和改变后的值以重做记录的形式保存在log buffer中,然后通过LGWR将重做记录写入联机重做日志中。但是在记录闪回日志时,只会将改变前的值保存在flashback buffer中,再由RVWR写入闪回日志中。
闪回时,从闪回日志的尾部向头部方向,依次取出闪回日志中的记录并应用在数据库上。而应用重做日志在进行实例恢复时,从闪回日志的头部向尾部方向依次取出重做记录并应用到数据库上。
比如当前时间
 09:20:00表T中C1列的值为4,当需要闪回到 09:10:00表T中C1为2的时候。从尾部应用日志开始,先取出C1=3这个值覆盖C1=4,之后继续取出C1=2覆盖C1=3。发现已经满足条件,故停止应用闪回日志。 
与闪回数据库相关的几个视图

1.v$flashback_database_log 
Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少,该视图就可以查看许多有用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点
Fashback_size: 记录了当前使用的Flash Recovery Area 空间的大小
Retention_target: 目标保存的实际(分钟)
Estimated_flashback_size: 根据策略对需要的空间大小的估计值
 
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.

SQL>  select OLDEST_FLASHBACK_SCN os,OLDEST_FLASHBACK_TIME ot,RETENTION_TARGET rt ,FLASHBACK_SIZE fs,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_log;
        OS        OT                                     RT         FS               EFS
----------        ------------------------             ----------   ----------          ---------
    858471   2011-03-23 12:19:20       1440   79970304    95920128

2.v$flashback_database_stat 
这个视图用来对Flashback log  空间情况进行更细粒度的记录和估计。 这个视图以小时为单位记录单位时间内数据库的活动量, Flashback_Data  代表 Flashback log 产生数量, DB_Date  代表数据改变数量, Redo_Date 代表日志数量,通过这 3 个数量可以反映出数据的活动特点,更准确的预计 Flash Recovery Area 的空间需求

SQL> select BEGIN_TIME bt,END_TIME et,FLASHBACK_DATA fd,DB_DATA dd,REDO_DATA rd,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_stat; 
BT                                     ET                               FD                 DD              RD            EFS
-------------------             -----------------------------      ------------    -------------     ----------      ----------
2011-03-24 20:50:40 2011-03-24 21:08:19    2727936    3760128     854016      0
2011-03-24 19:44:19 2011-03-24 20:50:40    5488640    8716288     2470400    93757440

3.v$flashback_database_logfile

该视图主要记录闪回日志的详细信息,NAME闪回日志的位置,FIRST_CHANGE#闪回日志中记录的最早的SCN,FIRST_TIME闪回日志中记录的最早时间

SQL> select * from v$flashback_database_logfile;

NAME                                                                    LOG#    THREAD#  SEQUENCE#      BYTES FIRST_CHANGE# FIRST_TIME
----------------------------------------------------------------- ---------- ---------- ---------- ---------- ------------- -------------------
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rhqmnl8_.flb            1          1         31    8192000        913156 2011-03-24 21:00:30
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rj46g7l_.flb            2          1         13    4096000        861743 2011-03-23 14:00:25
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rj7q75f_.flb            3          1         14    3981312        863845 2011-03-23 15:00:41
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rjc824j_.flb            4          1         15    3981312        865919 2011-03-23 16:00:57
/u01/app/flash_recovery_area/ORCL/flashback/o1_mf_6rjgrsmg_.flb            5          1         16    3981312        867909 2011-03-23 17:00:21
 
启用数据库闪回模式 
如果想启动FLASHBACK DATABASE的功能,您必须在MOUNT模式下,将数据库通过如下命令至于归档模式

SQL> alter database archivelog;
Database altered.

开启闪回模式

SQL> alter database flashback on;
Database altered.
 
关闭闪回执行可通过如下命令

SQL> alter database flashback off;
Database altered.

确认闪回是否开启

select name,current_scn,flashback_On from v$database
NAME                                   CURRENT_SCN         FLASHBACK_ON
---------------------------           ------------------------       ------------------------------                 
ORCL                                           0                              YES

与闪回数据库相关的几个参数

1. DB_RECOVERY_FILE_DEST_SIZE和 DB_RECOVERY_FILE_DEST 
要想使用Flashback Database, 必须使用Flash Recovery Area,因为Flashback Database Log只能保存在这里。 要配置的2个参数如下,一个是大小,一个是位置。如果数据库是RAC,flash recovery area 必须位于共享存储中。数据库必须处于archivelog 模式.
启用Flash Recovery Area:
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G SCOPE=BOTH; 
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/DBA/FB' SCOPE=BOTH; 
禁用Flash Recovery Area:
 
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' ;
 
对于Flash Recovery Area,Oracle 是这样建议的,flash recovery area 设置的越大,flashback database 的恢复能力就越强,因此建议flash recovery area 能够放的下所有的数据文件,增量备份,以及所有尚未备份的归档文件,当然还有它自己产生的flashback logs。
在数据库运行过程中,oracle 自动向该区域写入文件,当剩余空间不足15%的时候,它就会在alert 中增加警告,提示你空间不足。但此时不会影响数据库的正常运转,直到所有空间统统被用掉之后,oracle 首先尝试删除寻些过期的文件,冗余文件或备份过的文件以及闪回日志,如果这些做完了,还是没有空闲空间的话,数据库就被hang住了。

2. DB_FLASHBACK_RETENTION_TARGET: 
该参数用来控制flashback log 数据保留的时间,或者说,你希望flashback database 能够恢复的最早的时间点。默认值是1440,单位是minute,即24 小时,需要注意的是该参数虽然未直接指定flash recovery area大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。

SQL>alter system set db_flashback_retention_target=1440 scope=both; 
启用闪回数据库
 

数据库的Flashback Database功能缺省是关闭的,要想启用这个功能,就需要做如下配置。

启用归档模式

SQL> alter database archivelog;
Database altered.

开启闪回模式

SQL> alter database flashback on;
Database altered.

关闭闪回执行可通过如下命令

SQL> alter database flashback off;
Database altered.

闪回数据库实际操作

1、确认开启归档模式 
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app
Oldest online log sequence     1
Next log sequence to archive   4
Current log sequence           4

2.确认开启闪回 

SQL> select flashback_on from v$database;
FLASHBACK_ON                                                                    
------------------------------------------------------                          
YES                                                                     
3.确认闪回日志的存放位置和最大容量 
SQL> show parameter db_recovery
NAME                                       TYPE                                      VALUE     
                                              
------------------------------------      ---------------------------------    -----------------------------------              
db_recovery_file_dest             string                                     /u01/app/flash_recovery_area          
db_recovery_file_dest_size    big integer                            2G                

闪回数据库

查询当前时间点

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS')                                                                                                                                                                
---------------------------------------------------------                                                                                                                                               
2011-03-24 09:40:10    
                                                                                                                                                              
查询当前SCN
SQL> select current_scn from v$database;
CURRENT_SCN                                                                                                                                                                                            
-----------                                                                                                                                                                                            
 905962  
                                                                                                                                                                                 
删除HR用户
SQL> drop user hr cascade;
User dropped.

进行闪回数据库

SQL> startup mount;
ORACLE instance started.
Total System Global Area  373293056 bytes                                                                                                                                                               
Fixed Size                  1219496 bytes                                                                                                                                                               
Variable Size             163578968 bytes                                                                                                                                                               
Database Buffers          205520896 bytes                                                                                                                                                               
Redo Buffers                2973696 bytes                                                                                                                                                               
Database mounted.

基于时间点的闪回 
SQL> flashback database to timestamp to_timestamp('2011-03-24 09:40:10','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
基于SCN的闪回 
SQL> flashback database to scn 905962;
Flashback complete.

打开数据库: 
在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
1). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
2). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

下面以只读方式打开确认是否正确闪回
SQL> alter database open read only;
Database altered.
SQL> conn hr/hr;
Connected.


SQL> select count(*) from user_tables;
  COUNT(*)
----------
        26

以RESETLOGS方式打开数据库

SQL> alter database open resetlogs;

闪回数据库需要注意的几点:

1.一旦关闭闪回数据库,flashback recovery area中的闪回日志将自动全部删除

2.即便以resetlogs打开数据库,当前闪回日志里的内容仍然保留,仍然可以继续进行闪回以restlogs方式打开数据库。之所以考虑以read only放是打开数据库,主要是因为以resetlog方式打开数据库后,用户即可操作数据库,无法校验闪回的准确性。另外,当闪回数据库与DATA GUARD结合后,当主库发生逻辑损坏,我们可以闪回备库,然后以read only方式打开备库,将数据从备库中导出后导入到主库中,这样将对数据和业务的影响减小到最小。

3.如果闪回数据库的时间点之间进行了控制文件的恢复或重建,数据文件的收缩,或删除了某个表空间,则闪回将失败。

4.闪回日志在出现空间压力的情况下,oracle会自动删除闪回日志,则有可能导致无法闪回到指定的时间点。如果希望闪回到指定的时间点,可进行如下操作

SQL> create restore point must_to_flashback guarantee flashback database;

这样我们就给当前时间点取 must_to_flashback这个名字,确保能闪回到该时间点上 
5.闪回删除 只能用于非系统表空间和本地管理的表空间
6. 对象的参考约束、索引不会被恢复,指向该对象的外键约束需要重建。
7. 对象能否恢复成功,取决与对象空间是否被覆盖重用。
8. 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba 手工介入重新创建。
9. 对于Recycle Bin中的对象,只支持查询.

闪回删除 
Flashback Drop 是从Oracle 10g 开始出现的, 用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle Bin(表空间回收站),这个功能和windows的回收站非常类似。
Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空。
从Oracle 10g 开始, 每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop命令时, 被删除的表和表的关联对象( 包括索引, 约束,触发器,LOB段,LOB index 段) 不会被物理删除, 这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。
初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭,如:

SQL> alter system set recyclebin=off;
SQL> alter system set recyclebin=on;
SQL> alter session set recyclebin=off;
SQL> alter session set recyclebin=on;

禁用后删除的对象将直接删除,不会写到Recycle中,当然在删除时,指定purge 参数,表也将直接删除,不会写到recyclebin中。

SQL> drop table test1; 
Table dropped.
SQL> drop table uk_czm purge;
Table dropped.

可以看到test1删除并被放入回收站中而uk_czm没有放入回收站 
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1            BIN$nzam0J++vbPgQAB/AQARTg==$0 TABLE        2011-03-24:16:56:22

查看recyclebin中的对象

SQL>select object_Name,original_name from recyclebin
OBJECT_NAME                                        ORIGINAL_NAME
-------------------------------------------------- ------------------
BIN$nzam0J++vbPgQAB/AQARTg==$0                     TEST1
查看对象的相信内容 
SQL> select * from "BIN$nzam0J++vbPgQAB/AQARTg==$0";
        ID NAME
---------- ------------------------------
         1 AA
         2 BB
         3 CC

表空间的Recycle Bin 区域只是一个逻辑区域,而不是从表空间上物理的划出一块区域固定用于回收站,因此Recycle Bin是和普通对象共用表空间的存储区域,或者说是Recycle Bin的对象要和普通对象抢夺存储空间。当发生空间不够时,Oracle会按照先入先出的顺序覆盖Recycle Bin中的对象。也可以手动的删除Recycle Bin占用的空间。
1). 
Purge tablespace tablespace_name : 用于清空表空间的Recycle Bin
2). Purge tablespace tablespace_name user user_name
 : 清空指定表空间的Recycle Bin中指定用户的对象
3). 
Purge recyclebin : 删除当前用户的Recycle Bin中的对象
4).
 Purge dba_recyclebin : 删除所有用户的Recycle Bin中的对象,该命令要sysdba权限
5). 
Drop table table_name purge :  删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。
6). 
Purge index recycle_bin_object_name : 当想释放Recycle bin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。 因为索引是可以重建的。

SQL> create table flash_drop(id int);
Table created.
SQL> drop table FLASH_DROP;
Table dropped.
SQL> create table flash_drop(id int);
Table created.
SQL> drop table FLASH_DROP;
Table dropped.
SQL> create table flash_drop(id int);
Table created.
SQL> drop table FLASH_DROP;
Table dropped.
SQL> create table flash_drop(id int);
Table created.

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FLASH_DROP       BIN$nzoFsXt1rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:45
FLASH_DROP       BIN$nzoFsXt0rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:40
FLASH_DROP       BIN$nzoFsXtzrUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:56:22

使用原有的表名称来清空回收站中的表,默认清空回收站中最早的同名表

SQL> purge table FLASH_DROP;
Table purged.

可以看到  2011-03-24:19:56:22”也就是最早的“ FLASH_DROP”被清除了 
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FLASH_DROP       BIN$nzoFsXt1rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:45
FLASH_DROP       BIN$nzoFsXt0rUPgQAB/AQAKww==$0 TABLE        2011-03-24:19:59:40

执行闪回删除操作

SQL> flashback table flash_drop to before drop;
flashback table flash_drop to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object

由于数据库中已经重新创建了flash_drop表,故需加上rename to选项 
使用原有的表名称来闪回回收站中的表,默认闪回回收站中最晚的同名表

SQL> flashback table flash_drop to before drop rename to flash_1;
Flashback complete.

可以看到  2011-03-24:19:59:45” 也就是最晚的“ FLASH_DROP”被闪回了 
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                                 OBJECT TYPE           DROP TIME
----------------                  ---------------------------------------------        -------------------------- ------------------------------
FLASH_DROP       BIN$nzoFsXt0rUPgQAB/AQAKww==$0     TABLE                     2011-03-24:19:59:40


使用回收站中的对象名称可明确指定需要删除或闪回的表 
SQL> purge table "BIN$nzoFsXt0rUPgQAB/AQAKww==$0";
SQL> flashback table "BIN$nzoFsXt0rUPgQAB/AQAKww==$0" to before drop;

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
存储 Prometheus 监控
Prometheus vs. ELK Stack:容器监控与日志管理工具的较量
随着容器化技术的广泛应用,容器监控与日志管理成为了关键任务。本文将对两种常用工具进行比较与选择,分别是Prometheus和ELK Stack。Prometheus是一款开源的监控系统,专注于时序数据的收集和告警。而ELK Stack则是一套完整的日志管理解决方案,由Elasticsearch、Logstash和Kibana三个组件组成。通过比较它们的特点、优势和适用场景,读者可以更好地了解如何选择适合自己需求的工具。
|
4月前
|
Kubernetes 监控 容器
k8s学习-CKA真题-监控Pod日志
k8s学习-CKA真题-监控Pod日志
78 0
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【2月更文挑战第29天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的提升,有效的监控和日志管理变得至关重要。本文将探讨构建高效 Kubernetes 集群监控系统的策略,以及实施日志聚合和分析的最佳实践。通过引入如 Prometheus 和 Fluentd 等开源工具,我们旨在为运维专家提供一套完整的解决方案,以保障系统的稳定性和可靠性。
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践
【2月更文挑战第31天】 在微服务架构日益普及的今天,容器编排工具如Kubernetes已成为部署、管理和扩展容器化应用的关键平台。然而,随着集群规模的扩大和业务复杂性的增加,如何有效监控集群状态、及时响应系统异常,以及管理海量日志信息成为了运维人员面临的重要挑战。本文将深入探讨 Kubernetes 集群监控的最佳实践和日志管理的高效策略,旨在为运维团队提供一套系统的解决思路和操作指南。
27 0
|
2月前
|
存储 监控 关系型数据库
ELK架构监控MySQL慢日志
ELK架构监控MySQL慢日志
|
2月前
|
消息中间件 存储 监控
利用Scala编写公司内部监控软件的实时日志监控模块
在当今的软件开发领域,监控是确保系统稳定性和性能的关键一环。随着公司业务的不断扩展,我们迫切需要一套高效、可靠的实时日志监控系统,以及能够自动提交数据到网站的解决方案。本文将介绍如何利用Scala编写公司内部监控软件的实时日志监控模块,并探讨如何自动将监控到的数据提交到网站。
156 2
|
3月前
|
Prometheus 监控 Cloud Native
Prometheus VS ELK Stack:容器监控与日志管理工具的比较与选择
在容器化时代,有效的容器监控与日志管理工具对于确保应用程序的可靠性和可维护性至关重要。本文将比较两个主流工具,Prometheus和ELK Stack,探讨它们在容器监控和日志管理方面的特点、优势和适用场景,帮助读者做出明智的选择。
|
4月前
|
SQL 存储 监控
使用CloudLens for SLS监控Project资源配额最佳实践
本文主要介绍如何使用CloudLens for SLS中全局错误日志、监控指标做Project 资源配额的水位监控 、超限监控 以及 如何提交资源配额提升申请。
79337 19
使用CloudLens for SLS监控Project资源配额最佳实践
|
5月前
|
SQL 监控 关系型数据库
给Mysql加语句监控日志
给Mysql加语句监控日志
64 0
|
5月前
|
监控 Java
游戏服务器的内存监控日志
游戏服务器的内存监控日志
60 0