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

数据库,应用,场景,测试 · 浏览次数 : 137

小编点评

## Summary of the Text: This passage explains how to handle database errors and perform data recovery in Oracle by utilizing time and SCN (Serial Number) values. **Key Points:** * **Error Handling:** When an error occurs during data import or update, Oracle generates an error log entry with the error message and a unique error number. * **Recovery Process:** To recover from these errors, the system attempts to restore the data from a backup or a log file. * **Role of SCN and Time:** * SCN is used to uniquely identify a piece of data within a database table. * Time is used to associate an SCN with a specific point in time. * Using both SCN and time allows the system to recover data even if the original SCN is lost or corrupted. * **Data Recovery Process:** * The system first tries to recover the data from a **backup** if available. * If the backup is missing, the system tries to recover the data from a **log file**. * The system then attempts to **reconstruct the SCN** from the available data. * If the SCN is not found or cannot be reconstructed, the system may use a **default value** or **restore the data to a specific point in time** (e.g., the last recorded value). **Overall, this passage emphasizes the importance of using SCN and time values for effective data recovery in Oracle, even when dealing with potential data loss or corruption.**

正文

如果是用户主生产环境,通常不会有用户会开启这个功能。
但如果是在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磁盘组中:

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,需要取消应用再开启闪回,开启闪回后再启动备库日志应用:

--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 强制还原点:

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条数据:

SQL> select count(*) from t;

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

在ADG备库创建还原点:

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备库查询已经实时同步被删除了。

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呢?

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表数据又回来了~

可能有人会问,除了计划内的测试,谁也不会在误操作之前去手工创建还原点,真实误操作场景如何进行闪回呢?
蛮好的问题,其实闪回可以基于时间进行的。
删除还原点,然后开启同步,又到了误操作场景,如何操作呢?

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

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

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)
--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

与闪回数据库的应用场景和测试相似的内容:

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

如果是用户主生产环境,通常不会有用户会开启这个功能。 但如果是在ADG备库端,就会有不少客户选择开启这个功能,这可以有效补充误操作应急处置方法。 今天给某客户做技术支持的时候,在现场遇到一个蛮有意思的问题: XTTS测试场景,库非常大,数据文件很多,远超db_files的默认值。 在表空间元数据导入

Go编程快闪之 logrus日志库

战术卧倒 golang中常见的日志包是logrus, 根据logrus的胚子和我们的生产要求,给出一个生产可用的logrus实践姿势。 #### 主谓宾定状补 logrus是一个结构化的、可插拔的、兼容golang标准log api的日志库。 快速过一下能力 - 支持对output=TTY增加关键字

[转帖]焱融全闪系列科普| 为什么 SSD 需要 NVMe?

https://aijishu.com/a/1060000000371942 云计算存储极术推荐 NVMe 的由来 目前机械硬盘大多数使用 SATA (Serial ATA Advanced Host Controller Interface) 接口,接口协议为 AHCI,是 Intel 联合多家公

[转帖]焱融全闪系列科普| 为什么 SSD 需要 NVMe?

https://xie.infoq.cn/article/7026237b455c7d62f33afc4a9 NVMe 的由来 目前机械硬盘大多数使用 SATA (Serial ATA Advanced Host Controller Interface) 接口,接口协议为 AHCI,是 Intel

周边上新,T恤上星:博客园T恤幸运闪系列,一款上架预售,一款上照预览

今天发布2款博客园T恤,一款上架预售,见上图中的前两张照片;一款上照预览,见上图中的后两张照片,未敢上架,先看看大家的评价。在第三版星星款设计被放弃后,我们痴星不改,还是想推出带星星的幸运闪系列T恤

关于如何解决visualc++6.0打开文件闪退的一种方式(附带解决输入法无法显示)

这里我把VisualC++6.0安装程序和filetool分享在我的网盘里面了 网盘下载QAQ 链接:https://pan.baidu.com/s/1azSMX_cOKgb64WT7-gTdbQ?pwd=ayxs 提取码:ayxs 下载后解压文件,运行filetool.exe 进入Visual c

【Nano Framework ESP32篇】WS2812 彩色灯带实验

地球人皆知,许多物联网教程作者的心中都深爱着一灯大师,所以第一个例程总喜欢点灯,高级一点的会来个“一闪一闪亮晶晶”。老周今天要扯的也是和灯有关的,但不单纯地点个灯,那样实在不好玩,缺乏乐趣。老周打算舞个龙灯,哦不,是用 LED 彩色灯带给伙伴们整点炫酷乐子。 说到这LED彩灯,咱们常见到的有两类:

【Android逆向】反调试绕过(nop 绕过)

1. 这是看雪上的一个题目,要求显示出 it is success https://www.kanxue.com/work-task_read-800648.htm 第三题 2. apk 安装到手机,发现闪退 3. apk拖入到jadx中,观察 public class MainActivity e

行转列排除重复数据并且对比的方法

行转列排除重复数据并且对比的方法 摘要 出差成都. 突然发现被人当成Shell脚本小子了 今天让对着投影仪确定文件是否正确和完备 几乎闪瞎我的双眼 感觉国家这么多年的英语教育的确卓有成效 看简写, 耗费大半天也猜不出是啥意思来.. 为了能够记录下来,干的事情, 把用到的命令和处理过程记录一下. 备忘

[转帖]Windows自带硬盘测试工具使用教程

本教程主要讲解Windows自带的硬盘测试工具的使用,不用再安装第三方软件了。到底准不准就不知道啦,下面我们来看看如何使用吧~ 1. 进入cmd 快速进入cmd 主要如果进入后,使用命令直接闪退,就是说明需要用管理员打开。 Win+S 快捷键: 2. 使用 2.1 SSD硬盘测速 输入以下命令: w