ORACLE 闪回技术简介

闪回技术是若干技术的集合 包含对数据库整体的闪回 对表的闪回 对事务的闪回

经典面试题面试题:简述Oracle数据库闪回技术? 
1.闪回Oracle数据库
2.闪回表
3.闪回事务


数据库闪回
要想实现数据库闪回
1.必须配置数据库的恢复区
SQL> show parameter recover

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest             string
db_recovery_file_dest_size         big integer 0
数据库的恢复区 可用用来存放多种数据 比如:控制文件的镜像 redo文件的镜像 归档 备份 闪回日志(只能存放在这里)
闪回日志
数据库能够实现时间的倒退(闪回)要依赖闪回日志的记录 

! mkdir -p /home/oracle/flash
alter system set db_recovery_file_dest_size=2G;
alter system set db_recovery_file_dest='/home/oracle/flash';

2.开启数据库的闪回功能 
(1)保证数据库已经运行在归档模式 
SQL> archive log list;
Database log mode           Archive Mode
Automatic archival           Enabled
(2)查询是否已经开启闪回 
SQL> select FLASHBACK_ON from v$database;

FLASHBACK_ON
------------------
NO
开启闪回
alter database flashback on ;
SQL> select FLASHBACK_ON from v$database;

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

验证数据库的闪回功能 
SQL> create table t1 as select * from dba_objects;

Table created.


SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    1679739


SQL> create table t2 as select * from t1;

Table created.

SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> truncate  table t1;

Table truncated.

SQL> shutdown immediate

SQL> startup mount 

SQL> flashback database to scn 1679739;

SQL> alter database open resetlogs;

生产上 闪回数据库这个操作 不能够用来找回误删除的数据
1.闪回需要数据库运行在mount阶段 意味着需要关闭数据库
2.闪回到过去的时间点后 在这期间数据库的所有数据全部丢失


闪回数据库技术能干什么
1.压力测试后 回退数据
2.数据库版本升级

在生产上 误删除了数据 可以用备份恢复的方式找回数据 

闪回表
1.drop表后 将表闪回
利用Oracle的回收站功能

回收站
SQL> show parameter recyc

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
recyclebin                 string     on

回收站各个用户之间独立

回收站的空间属性问题
SQL> create tablespace test datafile '/u01/app/oracle/oradata/PROD4/PROD4/test.dbf' size 10m;

Tablespace created.

SQL> create user bsr identified by oracle default tablespace test;

User created.
SQL> conn bsr/oracle
Connected.

SQL> create table TEST1 as select * from dba_objects;

Table created.

SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='TEST1';

SUM(BYTES)/1024/1024
--------------------
                   9

SQL> show recyclebin
SQL> desc dba_free_space;     
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABLESPACE_NAME                                    VARCHAR2(30)
 FILE_ID                                            NUMBER
 BLOCK_ID                                           NUMBER
 BYTES                                              NUMBER
 BLOCKS                                             NUMBER
 RELATIVE_FNO                                       NUMBER

SQL> select TABLESPACE_NAME,bytes/1024/1024 from dba_free_space where tablespace_name='TEST';
select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by TABLESPACE_NAME; 
no rows selected

SQL> DROP TABLE TEST1;

Table dropped.

DROP表的本质 是将表进行改名 并且 将段使用的空间从永久变为临时

show recyclebin
flashback table "BIN$xxxxx" to before drop [rename to 表名]


2.delete行 将表中已删除的行找回

SQL> create table SALARY as select EMPLOYEE_ID,COMMISSION_PCT from hr.employees;查看下操作系统时间date
 
delete SALARY where employee_id in (select employee_id from hr.employees where HIRE_DATE<to_date('2002-01-01','yyyy-mm-dd'));

闪回查询 只要修改的数据在undo中存放 就可以在查询时 添加时间点 找到对应的数据 如果undo中数据被覆盖 那么会报快照过旧
Fri Apr 12 02:49:47 UTC 2019

  select * from SALARY AS OF timestamp to_date('2019-04-12 02:49:47','yyyy-mm-dd hh24:mi:ss') where employee_id in (select employee_id from hr.employees where HIRE_DATE<to_date('2002-01-01','yyyy-mm-dd'));

EMPLOYEE_ID COMMISSION_PCT
----------- --------------
    102

delete t1 where 条件 name=fuxian

update t1 set salary=salary+1000 where name=fuxian

insert into table xxx values( );
02:15:40 UTC 2016
--delete 整个表后可以使用flashback table 找回

SQL> alter table test enable row movement;--先打开行移动的功能

flashback  table  SALARY  to timestamp to_date('2019-04-12 02:49:49','yyyy-mm-dd hh24:mi:ss'); 

————————————————————————————————————
两种方式 生产上 尽量用第一种方式 插入的方式

因为数据的还原值都在undo里记录 我们可以利用undo对数据进行闪回版本查询

flash version query
flashback version query提供了一个审计行改变的功能,它能找到所有已经提交了的行的记录,比如说,时间1,我插入一条记录,时间2我删除了这条记录,对于时间3,当然查询不到这条记录,但是flashback version query能够把时间1、时间2的操作给记录下来,并详细的查询出来。
flashback version query一样依赖于AUM(自动undo管理),所以,这里就不再多说AUM的配置。flashback version query采用VERSIONS BETWEEN语句来进行查询
,常用的有:
·VERSIONS_SCN – 系统改变号
·VERSIONS_TIMESTAMP – 时间


下面将展示这个 flashback version query

SQL> connect test/test
Connected.
SQL> create table t1(ID int,NAME varchar2(10));
Table created.
我们执行一系列如下的操作:
   insert into T1 values(1,'A');
 
   commit;
 
  update T1 set ID=2;
 
  commit;
 
 update T1 set ID=3;
 
 commit;
 
update T1 set ID=4;
 
 
 
现在,我们看到该表最后的记录是
16:34:49 SQL> select * from T1;
     A      B
---------- ----------
      5 16:34:34
这个时候,如果我们利用flash table或者是flash query,我们也只能是看到过去的莫一个快照而已,利用flashback version query,我们将找到其中的任何变化,如
SQL>select versions_starttime, versions_endtime, versions_xid,
      versions_operation,ID,NAME
      from t1 versions between timestamp minvalue and maxvalue
      order by VERSIONS_STARTTIME;


SELECT * FROM (select versions_starttime, versions_endtime, versions_xid,
      versions_operation,ID,NAME
      from t1  versions between timestamp minvalue and maxvalue
      order by VERSIONS_STARTTIME) WHERE NAME='B' ;

VERSIONS_STARTTIME        VERSIONS_ENDTIME               VERSIONS_XID     V         ID NAME
------------------------- ------------------------------ ---------------- - ---------- ----
12-OCT-15 02.01.30 PM                                    01000D00C3010000 U          5 D
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          0600110096020000 I          4 C
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          0A001F00FB010000 I          1 A
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          04001C002B020000 U          3 B
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          080009006D030000 U          2 B
12-OCT-15 02.01.30 PM                                    090002008E020000 D          3 B


select versions_starttime, versions_endtime, versions_xid,
      versions_operation,salary
      from employees versions between timestamp minvalue and maxvalue where employee_id=107
      order by VERSIONS_STARTTIME;
注意:
此处显示了对该表所作的所有更改,甚至包括该行被删除和重新插入的情况。VERSION_OPERATION 列显示对该行执行了什么操作 (Insert/Update/Delete)。
所做的这些工作不需要历史表或额外的列。
flashback version query记载的是行的改变,如果一个操作有多行的改变,如delete from tablename,那么,在flashback version query对应的也是多行。
 
在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation 是伪列,与 ROWNUM、LEVEL 等其他熟悉的伪列相类似。其他伪列 — 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN — 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。有关该事务的更多详细信息可在视图 FLASHBACK_TRANSACTION_QUERY 中找到(这个将在flashback transaction query中描述)。
 
当然,除了分析以上所有的变更之外,我们可以指定时间段,如
select ID,NAME
from test versions between timestamp
to_date('2004-04-07 04:34:04','yyyy-mm-dd hh24:mi:ss')
and to_date('2004-04-07 04:34:50','yyyy-mm-dd hh24:mi:ss');

还可以使用 SCN 来找出过去的版本值。可以从伪列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中获得 SCN 号。以下是一个示例:
select versions_starttime, versions_endtime
from test versions
between scn 1000 and 1001


flashback transaction query闪回事务:
Oracle 11g的闪回事务查询就是对过去某段时间内所完成的事务的查询和撤销。10g数据来源于undo,11g来自undo/redo/archivelog,在考试中我们使用em来操作,举例如下:
 a、打开数据库补充日志:
sql>alter database add supplemental log data;
b、打开主键补充日志:
sql>alter database add supplemental log data (primary key) columns;
然后用em查询,和查询闪回版本差不多:打开em----Availability----->Perform Recovery----如下选择

/*== transaction 1 ==*/

INSERT INTO hr.departments VALUES (280,'ERP', NULL, 1700)
/
INSERT INTO hr.departments VALUES (290,'Support Operations', NULL, 1700)
/
INSERT INTO hr.departments VALUES (300,'HR Training', NULL, 1700)
/
commit
/

/*== transaction 2 ==*/

update hr.departments set department_id=310 where department_id=280
/
commit
/

/*== transaction 3 ==*/


update hr.departments set department_name='ABC'   where department_id=310
/
commit

alter system switch logfile; 切三遍以上
然后用em查询,和查询闪回版本差不多:打开em----Availability----->Perform Recovery----如下选择:将上面的事务操作闪回到第一次update之前。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/910836.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

std::copy

std::copy 是 C 标准库中的一个算法&#xff0c;用于将一个序列中的元素复制到另一个位置。这个算法定义在 <algorithm> 头文件中。 --- 函数原型 std::copy 有几个不同的重载版本&#xff0c;但以下是最常用的两个&#xff1a; template <class InputIterator, c…

Linux之sed命令详解

文章目录 &#x1f34a;自我介绍&#x1f34a;sed概述&#x1f34a;sed语法讲解格式&#xff1a;options 命令选项{commmand}[flags] &#x1f34a;场景训练 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff…

现代Web开发:React Hooks深入解析

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;React Hooks深入解析 现代Web开发&#xff1a;React Hooks深入解析 现代Web开发&#xff1a;React Hook…

大语言模型(LLM)入门级选手初学教程 III

指令微调 一、指令数据的构建 包括任务描述&#xff08;也称为指令&#xff09;、任务输入-任务输出以及可选的示例。 Self-Instruct 指令数据生成&#xff1a;从任务池中随机选取少量指令数据作为示例&#xff0c;并针对Chat-GPT 设计精细指令来提示模型生成新的微调数据…

算法工程师重生之第四十六天(字符串接龙 有向图的完全可达性 岛屿的周长)

参考文献 代码随想录 一、字符串接龙 题目描述 字典 strList 中从字符串 beginStr 和 endStr 的转换序列是一个按下述规格形成的序列&#xff1a; 1. 序列中第一个字符串是 beginStr。 2. 序列中最后一个字符串是 endStr。 3. 每次转换只能改变一个字符。 4. 转换过程…

魅力标签云,奇幻词云图 —— 数据可视化新境界

目录 目的原理详解建议 标签云&#xff1a;用于汇总生成的标签&#xff0c;一般是独立词汇运行前的准备代码示例 词云&#xff1a;对本文中出现频率较高的词&#xff0c;视觉上突出显示总结 目的 掌握文本与文档可视化&#xff1a;使用特定软件或编程语言&#xff08;如Python…

云计算答案

情境一习题练习 一、选择题 1、在虚拟机VMware软件中实现联网过程&#xff0c;图中箭头所指的网络连接方式与下列哪个相关&#xff08; C &#xff09;。 A.仅主机模式 B.桥接 C.NAT D.嫁接 2、请问下图这个虚拟化架构属于什么类型&#xff08; A …

【测试】【Debug】vscode pytest 找不到测试用例测试文件 行号部位没有绿色箭头

出现这种情况首先检查&#xff1a; 是否安装pytest点击vscode的这个图标如果其中都是空的&#xff0c;没有识别上&#xff0c;并且写好的.py测试文件的行号前面没有运行符号&#xff0c;要检查名称是否按照pytest的要求写&#xff0c;不然会识别不到。 命名规则注意&#xff1…

Echats柱状图的横坐标用图片显示

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片作为横坐标示例 - ECharts</title><!-…

D-ID 推出能模仿用户的头部动作以及实时互动的 AI 头像

D-ID 宣布推出两种新型 AI 头像 — — Express 和 Premium&#xff0c;旨在提升内容创作的灵活性和人性化。这些头像将为企业在营销、销售和客户支持等领域的视频制作提供便利。用户只需少量文本输入和视觉数据&#xff0c;即可生成更自然的商业视频。 Express 头像可以通过约一…

vue使用canves把数字转成图片验证码

<canvas id"captchaCanvas" width"100" height"40"></canvas>function drawCaptcha(text) {const canvas document.getElementById(captchaCanvas);const ctx canvas.getContext(2d);// 设置背景颜色ctx.fillStyle #f0f0f0;ctx.f…

mybatisgenerator生成mapper时报错

本想使用generator自动生成model和mapper&#xff0c;没想到插件执行的时候报如下错误。 Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project ywq-mybatis-tools: Execution default-cli of goal org.myb…

【无标题】西安交通大学提出少锚点的端到端车道线检测算法Polar R-CNN

Abstract 车道线检测在自动驾驶中是一个关键且充满挑战的任务&#xff0c;特别是在实际场景中&#xff0c;由于车道线可能因其他车辆而被遮挡、形状纤细且长度较长&#xff0c;检测难度增大。现有基于锚点的检测方法通常依赖于预设的锚点来提取特征&#xff0c;并随后对车道线…

Vue + Vant Picker实现省市区三级联动

一、picker选择器的数据由columns属性控制&#xff0c;columns中有几个元素就代表该选择器有多少级&#xff0c;通过change方法来给对应列赋值 this.columns [{values: citys,className: "column1",defaultIndex: 0,flex: 1, //控制每列的宽度},{values: citys[0].…

Windows安装配置node.js

下载安装 下载 访问下载 | Node.js 中文网&#xff0c;下载 推荐使用长期支持版本&#xff0c;但是此次是学习用的&#xff0c;使用最新版本试一下 安装 其实一路next基本就可以了&#xff0c;注意调整下安装目录 查看版本 C:\Users\PC>node -v v22.11.0 C:\Users\PC>…

Mac保护电池健康,延长电池使用寿命的好方法

使用Mac的过程中&#xff0c;如何延长电池的使用寿命是大家非常关心的问题&#xff0c;而养成一个良好的充电习惯能够有效的延长电池的使用寿命 避免过度充电和过度放电能够有效的保护电池&#xff0c;因此长时间的充电与长时间放点都不可取&#xff0c;但是在日常的使用过程中…

Kaggle生物信息学挑战:酶稳定性预测大赛

背景介绍 酶的稳定性是影响其实际应用的关键因素之一。通过定点突变可以改善酶的稳定性,但实验筛选稳定性突变体的成本较高。预测突变对酶稳定性的影响,加速筛选稳定性更高的酶突变体。 概念解释 X 残基&#xff1a;假设 它用 红色表示 &#xff0c; Y 残基&#xff1a;假设…

HarmonyOS NEXT 应用开发实战:十一、知乎日报项目接口使用指南

在本篇博文中&#xff0c;我们将带您完成一个简单的知乎日报项目&#xff0c;主要关注如何使用 h_request库与后端接口进行交互。我们将快速搭建起项目&#xff0c;并利用该库的优势提高开发效率。 选择 h_request 的理由 在进行 HarmonyOS 开发时&#xff0c;原始的 ohos.net…

STM32——串口

1、串口是什么 串口呢&#xff0c;作为硬件调试的时候&#xff0c;是很有用的&#xff0c;我觉得搞嵌入式是经常和串口打交道的 串口&#xff08;Serial Port&#xff09;是一种用于计算机和外部设备之间进行数据通信的接口。它通过串行通信方式传输数据&#xff0c;即一次只…

sparkSQL的UDF,最常用的regeister方式自定义函数和udf注册方式定义UDF函数 (详细讲解)

- UDF&#xff1a;一对一的函数【User Defined Functions】 - substr、split、concat、instr、length、from_unixtime - UDAF&#xff1a;多对一的函数【User Defined Aggregation Functions】 聚合函数 - count、sum、max、min、avg、collect_set/list - UDTF&#xff1a;…