Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >闪回数据库的应用场景和测试

闪回数据库的应用场景和测试

作者头像
Alfred Zhao
发布于 2023-10-10 10:08:50
发布于 2023-10-10 10:08:50
39000
代码可运行
举报
运行总次数:0
代码可运行

如果是用户主生产环境,通常不会有用户会开启这个功能。

但如果是在ADG备库端,就会有不少客户选择开启这个功能,这可以有效补充误操作应急处置方法。

今天给某客户做技术支持的时候,在现场遇到一个蛮有意思的问题:

XTTS测试场景,库非常大,数据文件很多,远超db_files的默认值。

在表空间元数据导入阶段,因此中断报错退出,修改db_files参数后发现很多表空间数据文件已经存在,压力就比较大,还好找到了方法drop tablespace xxx including contents的方式,注意还不能是OMF管理的,否则即便不加including datafiles也会被删掉,那就麻烦了。。

如果能参考我之前写过的一篇《XTTS系列之一:U2L迁移解决方案之XTTS的使用》,会发现我通常会建议大家在这种关键测试节点前,都会做一个动作;

就是开启闪回数据库的基础上,创建强制还原点,这样有任何问题,直接闪回数据库到操作前状态即可。

这个动作非常简单,同时也为了顺便验证下在备库开启的步骤,我就在自己一套19c的ADG备库环境下验证下这个开启操作:

1.确认db_recovery_file_dest_size 和 db_recovery_file_dest 的设置值

我这里单实例设置到文件系统了,你也可以设置到ASM磁盘组中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> alter system set db_recovery_file_dest_size=100g scope=both;
System altered.

SQL> alter system set db_recovery_file_dest='/flash/fast_recovery_area' scope=both;
System altered.

2.开启闪回并确认状态

备库在应用的话,直接开启会报错ORA-01153,需要取消应用再开启闪回,开启闪回后再启动备库日志应用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--1.直接开启会报错ORA-01153:
SQL> select database_role, open_mode from v$database;

DATABASE_ROLE	 OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY READ ONLY WITH APPLY

SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-01153: an incompatible media recovery is active

--2.需要取消应用再开启:
SQL> recover managed standby database cancel;
Media recovery complete.
SQL> select database_role, open_mode from v$database;

DATABASE_ROLE	 OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY READ ONLY

SQL> alter database flashback on;

Database altered.

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

--3.开启闪回后再启动备库日志应用
SQL> recover managed standby database disconnect;
Media recovery complete.
SQL> select database_role, open_mode from v$database;

DATABASE_ROLE	 OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY READ ONLY WITH APPLY

3.创建一个强制还原点

比如这里建立 before_imp_xtts 强制还原点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> create restore point before_imp_xtts guarantee flashback database;
Restore point created.

SQL> select name from v$restore_point;
--确认有刚建立的restore point。

注意:如果是在备库创建,那也是需要先cancel日志应用才能创建的!

4.举例ADG备库创建还原点

比如举例在备库创建一个 before_truncate_t 强制还原点:

目前T表有9条数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> select count(*) from t;

  COUNT(*)
----------
	 9

在ADG备库创建还原点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> recover managed standby database cancel;
Media recovery complete.
SQL> create restore point before_truncate_t guarantee flashback database;

Restore point created.

开启应用后(19cADG实时应用不再需要指定using current logfile关键字),

主库此时去truncate T这张表,ADG备库查询已经实时同步被删除了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> recover managed standby database disconnect;
Media recovery complete.
SQL> select count(*) from t;

  COUNT(*)
----------
	 9

SQL> select count(*) from t;

  COUNT(*)
----------
	 0

如何闪回到before_truncate_t呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> flashback database to restore point before_truncate_t;
flashback database to restore point before_truncate_t
*
ERROR at line 1:
ORA-01153: an incompatible media recovery is active


SQL> recover managed standby database cancel;
Media recovery complete.
SQL> flashback database to restore point before_truncate_t;

Flashback complete.

SQL> select count(*) from t;
select count(*) from t
                     *
ERROR at line 1:
ORA-01219: database or pluggable database not open: queries allowed on fixed
tables or views only


SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> alter database open;

Database altered.

SQL> select count(*) from t;

  COUNT(*)
----------
	 9

还是要在停止应用日志的状态下,直接闪回数据库到指定的这个restore point,然后开库就可以看到被误操作的T表数据又回来了~

可能有人会问,除了计划内的测试,谁也不会在误操作之前去手工创建还原点,真实误操作场景如何进行闪回呢?

蛮好的问题,其实闪回可以基于时间进行的。

删除还原点,然后开启同步,又到了误操作场景,如何操作呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> drop restore point BEFORE_TRUNCATE_T;

Restore point dropped.

SQL> recover managed standby database disconnect;
Media recovery complete.
SQL> select count(*) from t;

  COUNT(*)
----------
	 0

可以查询闪回数据库的信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

SQL> SELECT * FROM V$FLASHBACK_DATABASE_STAT
  2  /

BEGIN_TIME	    END_TIME		FLASHBACK_DATA	  DB_DATA  REDO_DATA ESTIMATED_FLASHBACK_SIZE	  CON_ID
------------------- ------------------- -------------- ---------- ---------- ------------------------ ----------
2023-06-27 22:09:07 2023-06-27 22:51:28       25362432	  7741440	   0			    0	       0

--此时主库又插入一条数据,备库也同步了:
SQL>  select count(*) from t;

  COUNT(*)
----------
	 1

SQL> select TIMESTAMP_TO_SCN(to_timestamp('2023-06-27 22:51:28','yyyy-mm-dd hh24:mi:ss')) from dual;

TIMESTAMP_TO_SCN(TO_TIMESTAMP('2023-06-2722:51:28','YYYY-MM-DDHH24:MI:SS'))
---------------------------------------------------------------------------
								   58518875
注意:这个转换其实不够精确,3秒内的时间都被转换成同一个SCN。但这里的场景是足够用的;闪回到这个SCN,flashback database to scn 58518875;

SQL> recover managed standby database cancel;
Media recovery complete.
SQL> flashback database to scn 58518875;

Flashback complete.

SQL> alter database open;

Database altered.

SQL> select * from t;

no rows selected

SQL>

看T表又无数据了,相当于再没有任何还原点存在的情况下,可以直接闪回到某个时间,而这个时间可以是 V$FLASHBACK_DATABASE_STAT 查到时间范围区间内的任意时间。

真的是蛮强大的一个功能。

Tips:这里用到了时间和SCN的转换,其实Oracle很多场景都会用到SCN和时间的互相转换,可以记下:

  • 将SCN转换成时间戳,使用 SCN_TO_TIMESTAMP(scn_number)
  • 将时间戳转换成SCN,使用 TIMESTAMP_TO_SCN(timestamp)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--eg:将SCN转换成时间戳,使用 SCN_TO_TIMESTAMP(scn_number)
SQL> select SCN_TO_TIMESTAMP(58518875) from dual;

SCN_TO_TIMESTAMP(58518875)
---------------------------------------------------------------------------
27-JUN-23 10.51.27.000000000 PM

--eg:将时间戳转换成SCN,使用 TIMESTAMP_TO_SCN(timestamp)
SQL> select TIMESTAMP_TO_SCN(to_timestamp('2023-06-27 22:51:28','yyyy-mm-dd hh24:mi:ss')) from dual;

TIMESTAMP_TO_SCN(TO_TIMESTAMP('2023-06-2722:51:28','YYYY-MM-DDHH24:MI:SS'))
---------------------------------------------------------------------------
								   58518875
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Oracle闪回原理测试(三)(r12笔记第16天)
对于Oracle的闪回,很多朋友也问过问,到底是怎么玩的?如果自己做过一些闪回数据库的操作,就会发现这个功能非常强悍。 Flashback DML的操作其实还蛮容易理解的,但是Flashback DDDL那可就是另外一个level了,我们大概了解一下MySQL里面的闪回就会发现,真要实现无缝的全闪回,确实有很多的细节和场景需要考虑。而Oracle作为一个成熟的商业软件,是不希望我们了解很多底层的细节的,用着好就行,所以如果你想得到一些闪回更细节的东西,这个渠道就非常的窄,我们之前也测试了两期,做了
jeanron100
2018/03/21
1.1K0
Data Guard高级玩法:通过闪回恢复failover备库 (r10笔记第7天)
今天看到有一个网友提了一个问题,描述很简短 测试DG时,主库不能宕机,如何测试failover? 其实这个需求从业务层面来说是合理的,一个数据量很大的核心数据库,如果需要做灾难演练,就
jeanron100
2018/03/19
1.2K0
Data Guard高级玩法:通过闪回恢复failover备库 (r10笔记第7天)
闪回原理测试(二)(r11笔记第23天)
对于闪回部分,Oracle本身提供了非常多相关的特性,我个人对于闪回数据库这个特性最为喜爱,尤其是应用再Data Guard环境中,真是一大杀器。 而对于DML的闪回部分其实也相对比较容易理解,毕竟就是原操作的逆操作,之前通过logminer的方式来读取redo来间接得以印证。Oracle闪回原理-Logminer解读redo(r11笔记第17天) 但是对于DDL的闪回,这个特性真是非常强悍了。比如一个truncate操作,它的逆操作改怎么定义,就很难去界定了。当然这个里面肯定有一些
jeanron100
2018/03/21
7330
XTTS系列之二:不可忽略的BCT
重要系统Oracle数据库U2L迁移场景中,如果客户来问我建议,我都会回复说首选就是XTTS,除非XTTS经测试实在是无法满足停机窗口,否则就不要考虑OGG这类方案。 换句话说,选择OGG做迁移的场景,都是没有其他办法时才会选用的方案了。
Alfred Zhao
2023/10/10
3420
Data Guard高级玩法:通过闪回恢复switchover主库 (r10笔记第13天)
最近又试了下Data Guard的新玩法,可以通过闪回恢复switchover的主库,这种场景听起来比较特别,但是Oracle依旧支持。 我们的大体思路就是,在主库我们标记一下数据状态,然后做
jeanron100
2018/03/19
7310
Data Guard高级玩法:通过闪回恢复switchover主库 (r10笔记第13天)
Oracle数据误操作全面恢复实战(r11笔记第78天)
对于DBA来说,面对误操作带来的数据恢复难度,其实很大。主要有以下几个方面: 误操作的影响范围极大,很可能不是删点,改点数据的操作,有时候可能是让人望而兴叹的truncate,drop操作。 数据恢复时需要确认数据损坏的时间点,依此来作为数据恢复的一个基准,该舍弃多少数据,该如何权衡,非常关键。 一旦信息提供错误,是否经得起反复折腾,我想这个对于绝大多数的数据恢复而言,基本都是一锤子买卖,能恢复已经不错了,还要反复恢复。但是一旦出现这种情况,可不能马上乱了阵脚。 灾备方案好不好,一试便知 自己也
jeanron100
2018/03/21
8070
Oracle数据误操作全面恢复实战(r11笔记第78天)
巧用闪回数据库来查看历史数据 (r10笔记第47天)
国庆期间有一个例行维护的任务,需要在大早上7点起来,先根据业务指定的SQL查出指定数据,然后运行一个存储过程来更新数据。 查出来的这部分数据需要作为后期的数据稽核所用,涉及到审计,所以优先级还是比较高的。 因为这样的查询有几个,所以为了统一数据格式,先加了rownum看看数据的基本情况。 SQL类似于下面的形式: select cn 账号,present_point 剩余积分点 , last_date 积分最后更新时间 from test.user_present_point_sp
jeanron100
2018/03/19
6780
闪回数据库不是“万金油”(r11笔记第73天)
闪回数据库这个特性在很多Oracle DBA眼里就是鸡肋特性,因为谁会因为恢复数据而需要在主库闪回,最后可能丢掉更多的数据,这个观点没错。 但是如果是备库呢,这个特性就顺利成章的满足了绝大多数的恢复需求,无论你是truncate,还是一些drop table的操作都是可以轻而易举的恢复。所以更多的时候我们其实更偏爱于Data Guard基础上的这种数据恢复方式,而原本的逻辑备份exp,expdp,物理备份RMAN就显得有些臃肿了。 拿一个真实的小案例来说明,有一次因为数据查询的SQ
jeanron100
2018/03/21
6320
Oracle 闪回特性(FLASHBACK DATABASE)
闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务
Leshami
2018/08/07
1.2K0
实战经验:Oracle DG 的归档缺失修复
首先通过备库sql查出相应的 node[thread#] 和归档位置 name:
数据和云
2021/05/31
1.8K0
ADG单实例搭建系列之 (DBCA)
参考官方文档12c:Using DBCA to Create a Data Guard Standby 12C
Lucifer三思而后行
2021/08/17
1.7K0
ADG单实例搭建系列之 (DBCA)
手工搭建Data Guard
Data Guard的搭建可以使用GC图形化安装,优缺点很明显,优点就是图形化操作,符合国人的习惯(据secooler介绍外国程序员能用图形化做的事就一定用图形做,因为boss看得懂,和国人正相反。。。),缺点就是如同Windows一样,宛如黑盒,换句话说,要时刻祈祷不要出问题,否则有时很难知道他为什么挂了。。。
bisal
2019/01/29
8350
关于Flashback的小测试(r10笔记第15天)
对于Oracle的Flashback来说,在11g里面有了一个很细微的变化,可以说是一个很不错的福利,那就是开启闪回不需要重启数据库至mount状态下,归档模式下open状态就可以开启,关闭。 但是有一点自己也记不太清楚了,那就是有时候数据库开启/关闭很容易,有的时候却需要额外花点功夫。今天索性花了点时间理了理。 查看是否开启闪回数据库,可以简单使用下面的方式。 SQL> select database_role,flashback_on from v$database; DATABASE
jeanron100
2018/03/19
7500
11g Dataguard中的snapshot standby特性(r8笔记第49天)
11g中的ADG特性本身已经非常有特色,促使很多对于10g中不太灵便的备库升级到11g,对于DBA是一大福利,那么还有一个福利就是snapshot standby了。 在平时的数据更新操作中,DBA可以做好sql审核,如果对于复杂的,繁多的变更,如果有些变更有一定的依赖,数据变化情况比较大,评估有难度,很多问题 单纯在测试环境还发现不了,到了生产就是事儿。如果你饱受这种困扰,snapshot standby就是一个不错的选择。你可以让原本只读的备库可读可写,然后写写画画一番之后回归到上一次的一个临界点,继
jeanron100
2018/03/19
9000
Oracle配置和使用闪回
环境:RHEL 6.4 + Oracle 11.2.0.4 目录: 一、闪回查询
Alfred Zhao
2019/05/24
9170
11g Active DataGuard初探(r5笔记第54天)
原本dataguard中日志应用和数据库只读查询是一个互斥的关系,两者不能并存。如果需要应用日志,则数据库只能在Mount状态下 使用recover managed standby database disconnect from session来不断地从后台进行日志应用。 如果想查看备库中的数据情况,则只能使用recover managed standby database cancel来取消日志应用,然后把数据库启动到read only 状态下。这种情况从道理上也讲也是有理有据,但是终归还是感觉不够方便
jeanron100
2018/03/16
6200
Oracle 11g DG Broker开启fast-start failover自动故障切换
SQL> select flashback_on,force_logging from v$database;
星哥玩云
2022/08/18
5310
Oracle ADG 备库停启维护流程及增量恢复
对于 Oracle Oracle ADG 备库重启时有些人都会有一个小问题,那就是没有及时应用日志没启动 MRP0 进程,导致主备库不同步。一般情况下主备库不同步的原因有:
JiekeXu之路
2022/03/31
2.2K0
Oracle ADG 备库停启维护流程及增量恢复
【DB笔试面试760】在Oracle中,备库数据文件异常,物理DG如何恢复?
有的时候由于备库空间不足,在主库添加了数据文件后,导致备库数据文件的缺失,可能很久之后才发现,但是由于归档的缺失等其它原因而导致备库不能正常应用Redo日志。还有其它情况可能导致备库的数据文件不能正常ONLINE,在这种情况下,可以在主库上利用CONVERT命令备份一个数据文件然后拷贝到备库即可。若是备库归档文件比较全,则可以直接在备库创建数据文件后应用Redo日志即可,而不需要从主库拷贝数据文件。
AiDBA宝典
2020/02/26
8230
【DB宝31】Oracle DG环境中主库使用rman做不完全恢复后,备库如何修复继续同步
本文介绍一下,在DG环境中,主库使用rman做不完全恢复后,备库如何通过flashback操作,继续和主库保持同步,而不用重新搭建DG。
AiDBA宝典
2020/12/08
1K0
推荐阅读
相关推荐
Oracle闪回原理测试(三)(r12笔记第16天)
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档