Oracle数据库的闪回技术

2023-11-18

当 Oracle 数据库发生逻辑损坏时,可以使用闪回技术简单快捷地进行数据库的恢复。

闪回数据库使用闪回日志执行闪回。闪回删除使用回收站。其它所有技术都使用还原数据。并不
是所有闪回功能都会修改数据库。有些功能只是一些用来查询数据以往版本的方法

一、闪回数据库
使用闪回数据库,通过还原自先前某个时间点以来发生的所有更改,可快速将数据库恢复到过去
的某个时间点上的状态。使用闪回数据库功能时,不需要还原备份。闪回数据库功能可以方便地
撤消导致逻辑数据损坏的更改。如果数据库发生介质丢失或物理损坏,则必须使用传统的方法进
行恢复。
1. 配置闪回数据库的方法
SQL>shutdown immediate;
SQL>startup mount exclusive;
SQL>alter system set db_flashback_retention_terget=2880 scope=both;
SQL>alter system set DB_RECOVERY_FILE_DEST_SIZE=20G scope=both;
SQL>alter system set db_recovery_file_dest='+FRA' scope=both;
SQL>alter database flashback on;
SQL>alter database open;

注意:DB_FLASHBACK_RETENTION_TARGET 初始化参数用来设置保留目标,可指定数据库所
能闪回的上限(以分钟为单位)。此参数只是一个目标,并不提供任何保证,闪回时间间隔取决
于在快速恢复区中保存的闪回日志的数据量。
查询确认闪回数据库是否已经启用:
SQL>select flashback_on from v$database;

2. 闪回数据库的方法
闪回数据库必须以 EXCLUSIVE 模式装载才能执行 FLASHBACK DATABASE 命令,而且在完成时
必须使用 RESETLOGS 选项打开数据库。
在使用 RMAN 命令 FLASHBACK DATABASE 命令执行闪回数据库操作时,可以使用 SEQUENCE
和 THREAD 指定作为下限的重做日志序列号和线程号,RMAN 只选择可用于闪回到指定序列号(但
不包括指定序列号)的文件。
也可以使用 FLASHBACK DATABASE 的 SQL 命令将数据库恢复到过去的某个时间或 SCN. 如果

使用 TO SCN 子句,则必须提供一个编号。如果指定 TO TIMESTAMP, 则必须提供一个时间戳
值。还可以指定还原点名称,例如:
RMAN> FLASHBACK DATABASE TO TIME="TO_DATE('2013-05-27 09:00:00',
'YYYY-MM-DD HH24:MI:SS')";
RMAN> FLASHBACK DATABASE TO SCN=23565;
RMAN> FLASHBACK DATABASE TO SEQUENCE=223 THREAD=1;
或者:
SQL> FLASHBACK DATABASE TO TIMESTAMP(SYSDATE-1/24);
SQL> FLASHBACK DATABASE TO SCN 53943;
SQL> FLASHBACK DATABASE TO RESTORE POINT b4_load;
3. 闪回数据库测试
本节实验测试基于时间戳的数据库闪回。
1) 创建用于实验的测试表 hr.t_obj:
SQL>create table hr.t_obj as select * from dba_objiects;
SQL>select count(*) from hr.t_obj;

2) 获取当前系统时间:
SQL>select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') tm from dual;

3) 删除 hr 用户及其对象:
SQL>drop user hr cascade;
SQL>select count(*) from hr.t_obj;
4) 建立对照表
SQL>select count(*) from system.tab1;
5) 执行闪回数据库操作,恢复 hr
SQL>shutdown immediate;
SQL>startup mount;
SQL>flashback database to timestamp to_timestamp
    2   ('2014-11-03 10:48:48','yyyy-mm-dd hh24:mi:ss');
SQL>alter database open resetlogs;

6) 验证
SQL>select count(*) from hr.t_obj;
SQL>select count(*) from system tab1;

可以看到,执行闪回数据库时间戳之前的更改都得到了恢复,之后的更改不再有效。因此,闪回
数据库是对数据库的整体回退。
 二、表的删除闪回
表删除(drop)闪回的原理是使用回收站技术,被删除的对象会临时放入回收站中并且仍属于其
所有者。当删除的表移到回收站时,会使用系统生成的名称重命名该表及其关联对象和约束条件。
回收站本身也是一个数据字典表,它用来维护删除对象的原始名称与其系统生成名称之间的关系。
使用 DBA_RECYCLEBIN, USER_RECYCLEBIN 视图可查询回收站的内容。
要使用闪回删除功能,必须将 FLASHBACK TABLE 或 FLASHBACK ANY TABLE 系统权限授予
使用闪回表功能的用户。此外,还必须将 SELECT, INSERT, DELETE 和 ALTER 对象权限授予
用户。
1. 表的删除闪回语法
FLASHBACK TABLE table_name TO BEFORE DROP [RENAME TO new_name];
2. 表的删除闪回测试
1) 删除 hr.t_obj 表:
SQL>conn hr/hr
SQL>select count(*) from hr.t_obj;
SQL>drop table hr.t_obj;
SQL>select count(*) from hr.t_obj;

2) 查询回收站并执行闪回删除:
SQL>select object_name, original_name, can_undrop, base_object
    2   from user_recyclebin;
SQL>flashback table hr.t_obj to before drop;
SQL>select count(*) from hr.t_obj;

三、闪回查询
闪回查询通常用于检索一条记录的所有历史版本,回溯单独的事务或者回溯从指定时间以来对特
定表的所有变化。
1. 闪回查询的语法
SELECT <column_name_list> FROM <table_name> 
AS OF <SCN> --- 使用 as of scn
或 AS OF <TIMESTAMP> --- 使用 as of timestamp
 
[WHERE <filter_conditions>]
[GROUP BY <unaggregated columns>]
[HAVING <group_filter>]
[ORDER BY <column_positions_or_name>]
2. 闪回查询测试
1) 创建实验用测试表 tab1:
SQL>create table hr.tab1 as select user_id, username from dba_users where 1=0;
SQL>insert into hr.tab1 select user_id, username from dba_users where user_id < 10;
SQL>commit;
SQLselect * from hr.tab1;

2) 对表进行删除操作,并进行闪回查询:
SQL>conn hr/hr;
SQL>select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') tm from dual;
SQL>delect tab1 where username='SYS';
SQL>select * from tab1;
SQL>seelct *from tab1 as of timestamp to_timestamp ('2022-08-01 11:00:00', 'yyyy-mm-dd hh24:mi:ss');


四、闪回表
1. 表闪回的方法
使用闪回表的先决条件是必须启用表的行迁移:
ALTER TABLE schema_name.table_name ENABLE ROW MOVEMENT;
表闪回的语法:
FLASHBACK TABLE schema_name.table_name TO SCN <scn_number>
-- 基于 SCN 的表闪回
或 TO TIMESTAMP <timestamp> -- 基于 TIMESTAMP 的表闪回
或 TO RESTORE POINT <restore_point> -- 基于 RESTORE POINT 的表闪回
[<ENABLE | DISABLE> TRIGGERS]
2. 表闪回测试
本节实验基于 RESTORE POINT 的表闪回。
基于 RESTORE POINT 的表闪回首先要创建适当的还原点,创建还原点的语法为:
CREATE RESTORE POINT point_name;
对于闪回成功之后无用的闪回点可以及时删除掉,删除闪回点的语法为:
DROP RESTORE POINT point_name;
1) 创建用于闪回表的测试表 hr.tab2,并创建还原点 p1:
SQL>create table hr.tab2 as select user_id, username from dba_users where 1 = 0;
SQL>alter table hr.tab2 enanle row movement;
SQL>insert into hr.tab2 seelct user_id, username from dba_users where user_id < 10;
SQL>select * from hr.tab2;
SQL>create restore point p1;

2) 对表 hr.tab2 进行插入操作,并创建还原点 p2:
SQL>insert into hr.tab2 select user_id, username from dba_users
    2   where user_id >= 10 and user_id < 20;
SQL> select * from hr.tab2;
SQL>select * from hr.tab2;
SQL>create restore point p2;
 

3) 从表 hr.tab2 进行删除,创建还原点 p3:
SQL>delect hr.tab2 where user_id = 5;
SQL>seelct * from hr.tab2;
SQL>create restore point p3;


4) 开始执行闪回表操作:
SQL>flashback table hr.tab2 to restore point p1;
SQL>select * from hr.tab2;
SQL>flashback table hr.tab2 to restore point p2;
SQL>select * from hr.tab;
SQL>flashback table hr.tab2 to restore point p3;
SQL>select * from hr.tab2;


5) 删除还原点:
SQL>fdrop restore point p1;
SQL>drop restore point p2;
SQL>drop restore point p3;

五、闪回版本查询
闪回版本查询指的是 Oracle 可以针对特定的对象来查询某一特定时段内该对象变化的所有情
况,也可以根据特定的需要来将该对象修正到特定的时刻。
闪回版本查询同闪回查询、闪回表一样,都是使用了 UNDO 段的数据,即数据变更的历史副本,
当 UNDO 段的数据由于空间变化而被清除后,则无法进行闪回。
1. 闪回版本查询语法
SELECT <columns> FROM <schema_name.table_name>
VERSIONS BETWEEN SCN <minimum_scn> AND <maximum_scn>
-- 基于 SCN 的版本查询
或者:
SELECT <columns> FROM <schema_name.table_name>
VERSIONS BETWEEN timestamp 
to_timestamp('start_timestamp') and to_timestamp('end_timestamp')
-- 基于 TIMESTAMP 的版本查询
2. 闪回版本查询测试
使用上节课闪回表查询创建的测试表 hr.tab2:
SQL>col USER_ID format 99999
SQL>col USERNAME format a10
SQL>seelct user_ID, username, versions_xid, versions_startscn,
   2    versions_endscn, versions_operation
   3    from hr.tab2 versions between scn minvalue and maxvalue;

其中:
versions_xid - 记录指定版本事务的唯一标识符。
versions_startscn - 记录的起始 SCN 号。
versions_endscn -- 记录的终止 SCN 号。
versions_operation - 记录的操作类型(I 表示插入,U 表示更新,D 表示删除)。

闪回事务查询是对闪回版本查询的扩展。从某种程度上来说,闪回版本查询通常用于更细粒度的
查询,如针对特定的记录。而闪回事务则是针对某一事务进行闪回,是基于事务级别的。闪回事
务查询是通过查询视图 flashback_transaction_query 来获得某个或多个特定事务信息,
同时可根据该视图中提供的 undo_sql 列中的语句来反转事务,从而保证数据的完整性。
要使用闪回事务查询,必须要启用补充日志记录功能并建立正确的权限。例如,要对上一节闪表
操作创建的测试表 tab2 使用闪回事务处理,就要以 SYSDBA 权限在 SQL*Plus 中执行下列设
置步骤:

SQL>alter database add supplemental log data;
SQL>alter database add supplemental log data (primary key)  columns;
SQL>grant execute on dbms_flashback to hr;
SQL>grant select any transaction to hr;

然后对 hr.tab2 进行增删改操作,然后按照十六进制的行 ID 进行闪回事务查询了:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle数据库的闪回技术 的相关文章

  • oracle日期序列?

    我有一个 oracle 数据库 我需要一个包含 2 年所有日期的表 例如来自01 01 2011 to 01 01 2013 首先我想到了一个序列 但显然唯一支持的类型是数字 所以现在我正在寻找一种有效的方法来做到这一点 欢呼骗局 如果您想
  • 仅使用 SQL 中的 MAX 函数更新重复行

    我有一张这样的桌子 假设为了举例 NAME是一个唯一的标识符 NAME AGE VALUE Jack Under 65 3 Jack 66 74 5 John 66 74 7 John Over 75 9 Gill 25 35 11 Som
  • 用C++连接oracle数据库

    我正在寻找一种方法来连接到远程 Oracle 数据库并从 C 控制台应用程序中的表中读取一些数据 有人可以给我一些提示吗 谢谢 soci http soci sourceforge net http soci sourceforge net
  • 从Oracle表中删除重复行

    我正在 Oracle 中测试某些内容并使用一些示例数据填充表 但在此过程中我不小心加载了重复记录 因此现在我无法使用某些列创建主键 如何删除所有重复行并只保留其中一行 Use the rowid伪列 DELETE FROM your tab
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • 如何在可能为空值的字段上创建唯一索引(Oracle 11g)?

    这是包含 3 列的示例表 ID UNIQUE VALUE UNIQUE GROUP ID 我希望可以允许以下记录 1 NULL NULL 2 NULL NULL or 3 NULL 7 4 123 7 or 注意 此条件不允许unique
  • 如何列出表中的所有列?

    对于各种流行的数据库系统 如何列出表中的所有列 对于 MySQL 请使用 DESCRIBE name of table 只要您使用 SQL Plus 或 Oracle 的 SQL Developer 这也适用于 Oracle
  • 如何使用低权限的 PL-SQL 获取 Oracle 中的列数据类型?

    我对 Oracle 数据库中的一些表具有 只读 访问权限 我需要获取某些列的架构信息 我想使用类似于 MS SQL 的东西sp help 我看到此查询中列出了我感兴趣的表 SELECT FROM ALL TABLES 当我运行这个查询时 O
  • 安装 OCI8:如何纠正“使用未定义常量 OCI_COMMIT_ON_SUCCESS”错误?

    我正在尝试在 RedHat 服务器 RHEL7 上为我的 Apache 服务器安装 OCI8 此时 当我尝试使用 Symphony 连接到我的服务器时 出现以下错误 异常 ErrorException 使用未定义的常量 OCI COMMIT
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • Oracle - 获取星期几

    今天是星期二 为什么当我运行这个 SQL 语句时 它说今天不是星期二 SELECT CASE WHEN TO CHAR sysdate Day Tuesday THEN Its Tuesday ELSE Its Not Tuesday EN
  • Oracle如何将UTC时间转换为本地时间(缺少偏移信息)

    我有一个包含日期列的表 我认为该列中的日期是以 UTC 格式保存的 我希望检索日期时以当地时间打印 这意味着当我从德国调用日期时 结果应该是这样的 2015 04 29 11 24 06 0200UTC EUROPE BERLIN 我尝试了
  • Oracle 按月滚动或运行总计

    目标 每个月末所有报表的滚动 运行总计 Code select TRUNC ACTHX STMT HX STMT DATE MM AS MNTH COUNT ACTHX INVOICE as STMTS from ACTHX group b
  • SQL 错误:ORA-14006:无效的分区名称

    我正在尝试使用以下 SQL 语句对 Oracle 12C R1 中的现有表进行分区 ALTER TABLE TABLE NAME MODIFY PARTITION BY RANGE DATE COLUMN NAME INTERVAL NUM
  • Oracle JDBC 预取:如何避免 RAM 不足/如何使 oracle 更快高延迟

    使用 Oracle java JDBC ojdbc14 10 2 x 加载包含多行的查询需要很长时间 高延迟环境 这显然是 Oracle JDBC 中的默认预取默认大小 10 每 10 行需要一次往返时间 我正在尝试设置一个激进的预取大小来
  • PLSql 返回值

    我再次使用一些 PLSql 我想知道 是否有任何方法可以像选择一样使用以下函数 而不必将其转换为函数或过程 这样我就可以从包含它的脚本中看到代码 代码如下 DECLARE outpt VARCHAR2 1000 flow rI VARCHA
  • 执行 `EXECUTE IMMEDIATE ` Oracle 语句出现错误

    我是 Oracle 的新手 当我执行以下语句时 BEGIN EXECUTE IMMEDIATE SELECT FROM DUAL END 我得到错误为 命令中从第 2 行开始出错 立即开始执行 从双选择 结尾 错误报告 ORA 00911
  • Oracle OLE DB 提供程序未在 SSIS 中列出

    我在 SSIS 和 VS2015 CM 方面遇到问题 我有一个包需要连接 Oracle 来获取一些数据 我安装了适用于 Win64 的 ODAC 和 Oracle 客户端 但看不到提供程序列表中列出的 OLE DB 的 Oracle 提供程
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • Oracle SQL-根据记录的日期与历史记录标记记录

    这是我在论坛上的第一篇文章 通常我能够找到我需要的东西 但说实话 我不太确定如何针对该问题提出正确的问题 因此 如果论坛上已经有答案而我错过了 请接受我的歉意 我通过 Benthic Software 在 Oracle 数据库中运行以下代码

随机推荐

  • 判断是否为二分图的两种算法 dfs/bfs

    判断是否为二分图的两种算法 dfs bfs 判断一个无向图是不是二分图 使用染色法 对每个顶点的相邻顶点染与顶点不同的颜色 如果染过色且与顶点颜色相同 则不是二分图 author 熊谦智 判断该图是否为二分图 1 判断无向图是否有环 如果图
  • MySQL 优化

    一 服务器配置优化 1 增加内存容量 内存容量是影响MySQL性能的重要因素之一 在MySQL中 有一个名为 缓冲池 的内存区域 用于缓存数据和索引 如果缓冲池太小 MySQL将频繁地从磁盘中读取数据 从而导致性能下降 因此 增加内存容量可
  • linux 修改密码命令

    1 passwd命令 脚本中语法 echo password passwd testuser stdin gt dev null 2 gt 1 或 echo newpasswd sleep 1 echo newpasswd passwd g
  • 猿人学做题笔记

    简单记录一下做题的思路步骤 1 第一题说的是无混淆加密 简单 刚开始观察请求 发现链接和请求携带的参数都没有什么异常 然后直接请求会拿不到数据 于是仔细看了一下请求包 发现请求头里面有些东西比较异常 里面有一个safe参数和timestam
  • k近邻算法中k值得选择

    k值得选择会对k近邻的结果产生重大的影响 如果选择较小的K值 就相当于用较小的邻域中的训练实例进行预测 学习 的近似误差会减小 只有输入实例较近的训练实例才会对预测结果起作用 但缺点是 学习 的估计误差会增大 预测结果会对近邻实例点非常敏感
  • 阿里云服务器部署javaweb

    1 首先购买服务器和域名 服务器类型选择 云服务器ecs 不要选择突发性能型 域名自便 注 域名解析需要备案 此类型服务器要求有效期大于三个月才可以备案 服务器设置 安全组规则设置 开放相应端口号 22 23 80 433 1433 330
  • 微信小程序中的数据更新实时显示,setData函数

    setData函数包括上一篇中的onLoad onShow onReady onHide以及onUnload函数均在微信小程序开发文档中的Page Object object 一栏中可查到 setData函数用于在小程序中动态更新数据并在屏
  • chat gpt的提示词汇总

    提示词的存在让ChatGPT能够扮演特定的角色 对用户的回答更加专业对口 ChatGPT在日常的对话中 表现的非常的完美 当在其他的场景希望使用ChatGPT来解决问题的时候 通常需要给ChatGPT一些提示 或者说暗示 让其进入某种角色
  • VS2019安装Qt插件教程,发现下载不了问题解决

    1 打开VS 最上方工具栏中点击扩展窗口 选择管理扩展 2 在右边搜索中搜索qt出现以下界面 这时可能出现问题 再点击下载发现迟迟下载不了 或者是下载到一定地步后无法下载 再或者是下载完成后安装无反应 解决办法 点击有点的详细信息或者进入如
  • 每天学命令Net Properties

    get property var name property clock clock name view view name quiet 介绍一下get property命令里面的Net property属性 命令的用法参考下面链接 每天学
  • 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级的说明及处理策略

    缓存雪崩 缓存雪崩我们可以简单的理解为 由于原有缓存失效 新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了 而对数据库 CPU 和内存造成巨大压力 严重的会造成数据库宕机 从而形成一系列连锁反应 造成整个系统崩溃 一般有三种处理办法
  • mysql之函数25

    1 函数 mysql的函数和存储过程几乎是一样的 区别是函数有且只有一个返回值 而存储过程可以有0个返回 也可以有多个返回 所以有的mysql界面操作直接将存储过程和函数合并 下面是函数的总结 主要注意一下和存储过程的区别和语法 然后再看几
  • 系统架构设计高级技能 · 通信系统架构设计理论与实践

    现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everything is for the future of dream weaving wings let the dream fly in reality 点击进入系
  • qt设置样式qss中border-image和background-image的区别

    如果你需要使用背景图片 代码中一般这么写 btnOk gt setStyleSheet QPushButton border image url Shield button bg png color white 或者 btnOk gt se
  • 如何彻底卸载360安全卫士

    问题 在网页上下载了个插件 不小心下载了捆绑软件360 用geek卸载360安全卫士后 发现程序面板和电脑管家的软件都不显示360了 但是开机还是有360启动提示 就知道根本没卸干净 主程序还在 在各个盘搜索360 也搜不到安装路径 真的离
  • CVE-2018-2894WebLogic未授权任意文件上传

    CVE 2018 2894WebLogic未授权任意文件上传 这个洞的限制就比较多了 限制版本 Oracle WebLogic Server版本 10 3 6 0 12 1 3 0 12 2 1 2 12 2 1 3 限制配置 该漏洞的影响
  • IDEA设置成白色背景

    遇到问题 对于习惯用eclipse的程序员本媛来说 真的不习惯Idea的黑色背景 看着就是别扭 解决办法 File Settings Appearance Behavior Theme换成 IntelliJ Light即可 注 IDEA默认
  • 如何通过谷歌云平台设置load balancing 和CDN

    1 创建instance templates 实例模板 首先 创建一个实例模板来启动一个在负载均衡器后面充当应用服务器的实例 在这个演示中 我们不会在实例中实际启动 Web 应用程序 相反 将 Apache HTTP Server 配置为在
  • 人工智能方向毕业设计_人工智能时代,理工科专业的毕业设计都被安排了

    我是16年上半年从软件开发转到算法工程师的 这些年AI 我亲眼见证了从 黑科技 跌入 俗学 的过程 早些年 在模式识别领域 例如人脸识别 语音识别等 大家都发力在数学算法 基于机器学习 的时候 虽然努力多年 但是因为技术缺陷精度却一直上不去
  • Oracle数据库的闪回技术

    当 Oracle 数据库发生逻辑损坏时 可以使用闪回技术简单快捷地进行数据库的恢复 闪回数据库使用闪回日志执行闪回 闪回删除使用回收站 其它所有技术都使用还原数据 并不 是所有闪回功能都会修改数据库 有些功能只是一些用来查询数据以往版本的方