闪回原理测试(二)(r11笔记第23天)

    对于闪回部分,Oracle本身提供了非常多相关的特性,我个人对于闪回数据库这个特性最为喜爱,尤其是应用再Data Guard环境中,真是一大杀器。

    而对于DML的闪回部分其实也相对比较容易理解,毕竟就是原操作的逆操作,之前通过logminer的方式来读取redo来间接得以印证。Oracle闪回原理-Logminer解读redo(r11笔记第17天)

    但是对于DDL的闪回,这个特性真是非常强悍了。比如一个truncate操作,它的逆操作改怎么定义,就很难去界定了。当然这个里面肯定有一些很有意思的实现方式值得好好玩味。

    我简单测试了truncate和delete的操作,虽然步骤简单,但是是带着特定的眼光来审视这个过程。

    我们来创建一些数据,先创建200万的数据压压惊。

SQL> create table test_fb as select level object_id,'obj_'||level object_name from dual connect by level <=2000000;
Table created.

然后持续插入一些数据,目的是保证这个表的数据量足够大。

SQL> insert into test_fb select *from test_fb;
2000000 rows created.
SQL> /
4000000 rows created.
SQL> /
8000000 rows created.
SQL> select count(*)from test_fb;
  COUNT(*)
----------
  16000000
SQL> commit;
Commit complete.数据准备工作就这些,简单看看对应的段,会发现段的大小在近400M的样子。

SQL> select segment_name,bytes/1024/1024 size_MB from user_segments where segment_name='TEST_FB';
SEGMENT_NAME                      SIZE_MB
------------------------------ ----------
TEST_FB                               384虽然看起来不是特别大的段,不过已经能够说明问题了。我们开启闪回数据库的功能。

alter database flashback on;这个时候查看闪回区,会发现突然多出了两个闪回日志。

[oracle@newtest flashback]$ ll
total 102420
-rw-r--r-- 1 oracle oinstall      171 Aug 21 20:37 a.sql
-rw-r----- 1 oracle oinstall 52436992 Dec 24 22:34 o1_mf_d5x1vjlb_.flb
-rw-r----- 1 oracle oinstall 52436992 Dec 24 22:34 o1_mf_d5x1vjvc_.flb可以理解这是一个初始化的过程。因为从alert日志可以看到启动了RVWR进程,SGA里面其实也分配了闪回区的缓存.
Sat Dec 24 22:34:24 2016
 alter database flashback on
Starting background process RVWR
Sat Dec 24 22:34:24 2016
RVWR started with pid=37, OS id=21314
Flashback Database Enabled at SCN 192530049424
Completed:  alter database flashback on这个时候数据库标示,闪回数据库是基于某一个SCN的。
下面我们来做一个truncate操作,为了让闪回的过程看起来自然一些,我们就创建一个还原点,毕竟基于SCN,基于时间戳还是有些取巧的感觉。

create restore point fb_recover_trunc guarantee flashback database;

对于还原点更多的信息可以联系v$restore_point来查看,其实从数据字典里查看,这部分信息也会清晰不少。

 col NAME for a20
 col TIME for a35
 set lines 200
 col STORAGE_SIZE for a50
 SELECT NAME, SCN, TIME, DATABASE_INCARNATION# DI,GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE/1024/1024/1024
 FROM V$RESTORE_POINT
 WHERE GUARANTEE_FLASHBACK_DATABASE='YES';
NAME                                       SCN TIME                                        DI GUARAN STORAGE_SIZE/1024/1024/1024
---------------- ----------------------------- ----------------------------------- ---------- ------ ---------------------------
FB_RECOVER_TRUNC                  192530049487 24-DEC-16 10.35.16.000000000 PM             10 YES                     .048828125

这个过程,闪回日志没有大小的任何变化,但是闪回日志的时间戳会发生变化,证明是在持续更新。
我们来操作truncate,这个操作绝对是很多数据库灾难的源头。

truncate table test_fb;

但是操作完成之后查看闪回日志,竟然还是没有任何大小的变化。
可见truncate的操作,在闪回日志中不会记录逆操作的信息,这个应该是在其它的地方来做的。

我们来开启闪回数据库,尝试闪回到指定的还原点

shutdown immediate;
startup mount

从启动日志可以清晰的看到,SGA里面是分配了60多M的flashback generation buffer.

Successful mount of redo thread 1, with mount id 806293483
Allocated 63749952 bytes in shared pool for flashback generation buffer
Starting background process RVWR
Sat Dec 24 22:38:39 2016
RVWR started with pid=23, OS id=21403开始闪回到指定的还原点

flashback database to restore point fb_recover_trunc;这个时候闪回日志还是没有任何大小的变化。不过数据库日志需要格外关注。

Sat Dec 24 22:39:17 2016
flashback database to restore point fb_recover_trunc
Flashback Restore Start
Flashback Restore Complete
Flashback Media Recovery Start
 started logmerger process
Parallel Media Recovery started with 24 slaves
Sat Dec 24 22:39:18 2016
Recovery of Online Redo Log: Thread 1 Group 3 Seq 11412 Reading mem 0
  Mem# 0: /U01/app/oracle/oradata/newtest2/redo03.log
Incomplete Recovery applied until change 192530049488 time 12/24/2016 22:35:16
Flashback Media Recovery Complete
Completed: flashback database to restore point fb_recover_trunc

这段日志很宝贵,可以看到是几个阶段,restore,media recovery,其中恢复的过程中是使用logmerger来处理的。这些个过程是后续进行分析的重要内容了。
为了简单验证,我们启动数据库至read only状态

alter database open read only;确认无误,后续的操作就是启动数据库,纠结的部分还是到来是,是一个resetlogs的操作。

shutdown immediate
startup mount
alter database open resetlogs;在主库上还是有些纠结,所以我喜欢在备库上来玩闪回数据库。
整个resetlogs的过程会重置redo.
但是闪回日志的大小依旧不会有任何的变化。
听起来闪回日志的作用还是不大明显,如果你做了DML的操作,那这个过程的影响就会放大数倍。

当前的这个测试表数据量在1600万。

SQL> select count(*)from test_fb;
  COUNT(*)
----------
  16000000

我们做一个大动作,闪回1000万数据。

SQL> delete from test_fb where rownum<10000000;
9999999 rows deleted.

这个过程会持续一些时间,可以看到后台的redo非常忙,切换了近90次。
而闪回日志是否很忙呢,这下终于忙起来了,而且非常忙,生成了非常多的闪回日志。

[oracle@newtest flashback]$ ll
total 2446012
-rw-r--r-- 1 oracle oinstall       171 Aug 21 20:37 a.sql
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:49 o1_mf_d5x1vjlb_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:49 o1_mf_d5x1vjvc_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:49 o1_mf_d5x2qv3h_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:49 o1_mf_d5x2r454_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:50 o1_mf_d5x2rf6s_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:50 o1_mf_d5x2rm8d_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:50 o1_mf_d5x2rwb0_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:50 o1_mf_d5x2s5co_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:50 o1_mf_d5x2sgfb_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:50 o1_mf_d5x2sngx_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:50 o1_mf_d5x2sxjk_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:50 o1_mf_d5x2t6l6_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:51 o1_mf_d5x2thmt_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:51 o1_mf_d5x2toof_.flb
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:51 o1_mf_d5x2tyq2_.flb
-rw-r----- 1 oracle oinstall 104865792 Dec 24 22:51 o1_mf_d5x2v4rn_.flb
-rw-r----- 1 oracle oinstall 209723392 Dec 24 22:52 o1_mf_d5x2vfvm_.flb
-rw-r----- 1 oracle oinstall 389283840 Dec 24 22:53 o1_mf_d5x2vx2o_.flb
-rw-r----- 1 oracle oinstall 453705728 Dec 24 22:54 o1_mf_d5x2wyhs_.flb
-rw-r----- 1 oracle oinstall 560545792 Dec 24 22:53 o1_mf_d5x2yxz0_.flb

而且尤其值得关注的是,后面生成的闪回日志不是按照原有的50M而是逐步递增的节奏。
如果你继续使用truncate的方式清理数据,闪回日志的大小还是没有任何的变化。这应该不是巧合,也是故弄玄虚,flashback restore,flashback media recovery这些需要关注,后台进程RVWR来维护整个闪回数据库的过程,自有它的道理。

时间: 2024-09-06 08:19:14

闪回原理测试(二)(r11笔记第23天)的相关文章

Oracle闪回原理测试(三)(r12笔记第16天)

 对于Oracle的闪回,很多朋友也问过问,到底是怎么玩的?如果自己做过一些闪回数据库的操作,就会发现这个功能非常强悍.   Flashback DML的操作其实还蛮容易理解的,但是Flashback DDDL那可就是另外一个level了,我们大概了解一下MySQL里面的闪回就会发现,真要实现无缝的全闪回,确实有很多的细节和场景需要考虑.而Oracle作为一个成熟的商业软件,是不希望我们了解很多底层的细节的,用着好就行,所以如果你想得到一些闪回更细节的东西,这个渠道就非常的窄,我们之前也测试了两

MySQL 闪回原理与实战

DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护,并不适合快速回滚.也有团队利用LVM快照来缩短恢复时间,但快照的缺点是会影响mysql的性能. MySQL闪回(flashback)利用binlog直接进行回滚,能快速恢复且不用停机.本文将介绍闪回原理,给出笔者的实战经验,并对现存的闪回工具作比较.   开胃菜 某天,小明因种种原因,误删了大批线

Oracle闪回原理-Logminer解读redo(r11笔记第17天)

说到闪回日志,我们都知道闪回日志中记录的都是逆操作,那么就有两个问题需要解释了. 闪回日志和回滚段保存的数据有什么差别? 如果做了truncate操作,闪回日志是怎么记录的,怎么能够通过闪回恢复数据. 第一个问题是一个同学问的,第二个问题是我偶然想起来的,当然这两个问题还是蛮有意思.我们的目标就是解释清楚下面的两个问题.     当然要深刻理解这个问题,一个重要的部分就是得先明白redo的基本情况. 借用大师Jonathan Lewis的话说,Oracle里面最重要的特性是在V6提出的改变向量,

分分钟搭建MySQL Group Replication测试环境(r11笔记第83天)

   最近看了下MySQL 5.7中的闪亮特性Group Replication,也花了不少做了些测试,发现有些方面的表现确实不赖.当然要模拟这么一套环境还是需要花不少的功夫的,一般来说都是3个节点的环境,实际中要找这样的环境也不是很容易.我们怎么快速模拟呢.一种方式就是在一台服务器上搭建多实例.    这样一来,服务器的问题就解决了,下面要解决的问题就要艰巨的多了,那就是部署环境.    可以看到各路博客中都有了详细的解释,而官方文档中对于搭建过程也花了不少的额篇幅来解释,每一个步骤,每个操作

insert导致的性能问题大排查(r11笔记第26天)

今天开发的同学小窗口消息给我,向我咨询一个ORA错误的问题. 错误代码是ORA-30036,使用oerr ora 30036查看,由于是undo空间无法扩展导致. 这是一个统计业务的数据库,而且平时的负载其实并不高,确实有一些奇怪.首先排除了大事务导致的原因,查看数据库日志,和开发同学沟通,没有发现相关的错误信息. 所以第一感觉这是一个偶然发生的情况,不过开发的这位同学貌似碰到了问题,他说从应用端抛出了ORA-30036的错误. java.sql.BatchUpdateException:ORA

性能-关于Oracle闪回的问题

问题描述 关于Oracle闪回的问题 请问Oracle闪回的数据是否可以按照时间设置多少小时内可闪回? 还是Oracle闪回的数据只能设置数据量的大小? 另:Oracle闪回空间的设置对数据库性能有哪些方面的影响? 解决方案 Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复.闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行.事务.表和数据库范围.使用闪回特性,您可以查询以前的数据版本,还可以执行更改分析和自助式修复,以便在保持数据库联机的同时从逻

闪回区报警引发的性能问题分析(r11笔记第11天)

自从有了Zabbix+Orabbix,很多监控都有了一种可控的方式,当然对于报警处理来说,报警是表象,很可能通过表象暴露出来的是一些更深层次的问题.这不又来一个,不看不知道,一看让自己着实吓了一跳. 首先是一个报警信息,可以看到是闪回区超过了报警的阈值,为了尽可能提前发现问题,我把阈值设置为了70%,和Oracle默认的80%有一些差别. ZABBIX-监控系统: ------------------------------------ 报警内容: archive_area_usage ----

关于闪回区溢出导致的数据hang(r11笔记第12天)

对于Oracle数据库的闪回区的设置,之前和一个同事和讨论过,总体来说有一些不同的意见. 首先这个闪回区是一个逻辑的概念,闪回区的大小不会严格依赖于磁盘空间的情况,比如磁盘空间目前剩余100G,但是你设置闪回区为200G是没有问题的. 如此一来,和只使用归档参数想比,这个闪回区似乎有一点问题,总体来说闪回区的管理还是比较方便的,可以监控管理闪回区中的归档,闪回日志,备份等的大小. 使用的视图为v$flash_recovery_area_usage,在11g做了简化,为v$recovery_are

闪回数据库不是“万金油”(r11笔记第73天)

    闪回数据库这个特性在很多Oracle DBA眼里就是鸡肋特性,因为谁会因为恢复数据而需要在主库闪回,最后可能丢掉更多的数据,这个观点没错.     但是如果是备库呢,这个特性就顺利成章的满足了绝大多数的恢复需求,无论你是truncate,还是一些drop table的操作都是可以轻而易举的恢复.所以更多的时候我们其实更偏爱于Data Guard基础上的这种数据恢复方式,而原本的逻辑备份exp,expdp,物理备份RMAN就显得有些臃肿了.      拿一个真实的小案例来说明,有一次因为数