Oracle—数据恢复

article/2025/9/28 22:08:04

文档结构

  • 1、恢复原理
    • 1.1、recyclebin(回收站)
      • 相关操作
    • 1.2、archived redo(归档日志)
    • 1.3、supplemental log(补充日志)
  • 2、恢复场景
    • 2.1、定义删除
    • 2.2、记录删除
      • 2.2.1、undo恢复
      • 2.2.2、redo恢复
      • 2.2.3、dbms_logmnr

场景:在 Oracle数据库使用过程中,误删对象或误删记录的情况时有发生;这种情况下通过技术手段可以将对象的状态和数据恢复到删除前的某个时刻;

建议:技术手段的恢复毕竟是有限的,为了降低类似的误操作还是要通过规范的流程和定期的备份来规避,就像是车技再好的车手也不该经常在悬崖边漂移,否则可能都来不及说再见!


1、恢复原理

Oracle数据库提供了多种方式可以将数据库或对象或记录恢复到某个时间节点;
1)undo文件
说明:undo文件的数据有空间大小限制,数据库按照循环写的方式类使用,可恢复的数据也限于短时间内的操作;

2)redo日志
说明:redo日志因为有空间大小限制,和 undo文件数据类似,是循环写数据,所以可以恢复的数据时间跨度不会很大,一般只限于很短的时间内的操作;

3)archived redo(归档日志)
说明:归档日志是将online redo日志固化为文件存储下来,会占用不小的服务器空间;

4)rman备份

5)recyclebin(回收站)

1.1、recyclebin(回收站)

从ORACLE 10g开始,引入了一个叫回收站(RecycleBin)的概念,全称为Tablespace Recycle Bin。回收站实际是一个逻辑区域,它以表空间中现有已经分配的空间为基础,而不是从表空间上物理划出一个固定区域用作回收站。这意味着回收站和表空间中的对象共用存储区域、系统没有给回收站预留空间。

当表被DROP后,如果可用空间充足,并且没有对回收站进行清理,那么被DROP掉的对象会一直存在回收站中,仍然会占用空间。但是如果可用空间紧张的情况下,数据库会根据先进先出的顺序覆盖Recycle Bin中的对象。所以回收站机制也不是百分百的保险机制。另外从原理上来说它就是一个数据字典表,放置用户Drop掉的数据库对象信息。

相关操作

  • 参数状态
SQL> 
SQL> show parameter recyclebin;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      onSQL> 

或者

select t.NAME, t.VALUE, t.DISPLAY_VALUEfrom v$parameter twhere t.NAME = 'recyclebin';---输出NAME	VALUE	DISPLAY_VALUE
1	recyclebin	on	on
  • 开启关闭
    回收站的开启和关闭可以按照时效分为会话级别和系统级别;

1)会话级别

---session
alter session set recyclebin=on/off;

2)系统级别

---system
alter system set recyclebin=on/off;
  • 对象查找
    涉及的系统表或视图有
    A:RECYCLEBIN(指向 USER_RECYCLEBIN的同义词)
    B:USER_RECYCLEBIN
    C:DBA_RECYCLEBIN
---query_sql
select owner,object_name,original_name,operation,type,ts_name,createtime,droptime,dropscn,partition_name,can_undrop,can_purge,related,base_object,purge_object,spacefrom DBA_RECYCLEBIN twhere t.owner = '&username'order by t.createtime desc;

1.2、archived redo(归档日志)

  • 查询归档状态
    select name,log_mode from v$database t;

log_mode:NOARCHIVELOG 为非归档状态,current为归档状态;

或者在服务器的以sys用户登录的sqlplus 模式下执行:

SQL> 
SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     134
Current log sequence           138
SQL> 

1.3、supplemental log(补充日志)

Oracle补充日志(附加日志)是基于常规日志的基础上,额外记录的日志信息,用于恢复数据库的逻辑状态;
补充日志(supplemental log)并非一定要再开启归档日志的情况下才可以开启;

补充日志的开启有2种粒度,一种是数据库级别,一种是表级别;补充日志可以有2种,即最小补充日志、标识关键字段补充日志两大类;

  • 状态查询
select name,t.SUPPLEMENTAL_LOG_DATA_MIN as log_min,t.SUPPLEMENTAL_LOG_DATA_PK as log_pk,t.SUPPLEMENTAL_LOG_DATA_UI as log_ui,t.SUPPLEMENTAL_LOG_DATA_FK as log_pk,t.SUPPLEMENTAL_LOG_DATA_ALL as log_allfrom v$database t;

开启关键字段补充日志的前提是要开启最小补充日志;如果需要开启某种标识关键字段的补充日志,会自动开启最小补充日志,无需提前开启最小补充日志;

标识关键字段的补充日志有分为基于主键、唯一索引、外键、全字段、自定义5类;

  • 开启/关闭最小附加日志
alter database add supplemental log data columns;
alter database drop supplemental log data columns;
  • 数据库级
---open key
alter database add supplemental log data(primary key) columns;
alter database add supplemental log data(primary key,unique,foreign key,all) columns;---stop key
alter database drop supplemental log data(primary key) columns;
alter database drop supplemental log data(primary key,unique,foreign key,all) columns;

调整状态

SQL> 
SQL> select name,2         t.SUPPLEMENTAL_LOG_DATA_MIN as log_min,3         t.SUPPLEMENTAL_LOG_DATA_PK as log_pk,4         t.SUPPLEMENTAL_LOG_DATA_UI as log_ui,5         t.SUPPLEMENTAL_LOG_DATA_FK as log_pk,6         t.SUPPLEMENTAL_LOG_DATA_ALL as log_all7    from v$database t;NAME      LOG_MIN  LOG_PK LOG_UI LOG_PK LOG_ALL
--------- -------- ------ ------ ------ -------
DEVDB     YES      YES    NO     NO     NOSQL> 
  • 表级
---open key
alter table ${schema_name.tabel_name} add supplemental log data(primary key) columns;
alter table ${schema_name.tabel_name} add supplemental log data(primary key,unique,foreign key,all) columns;---stop key
alter table ${schema_name.tabel_name} drop supplemental log data(primary key) columns;
alter table ${schema_name.tabel_name} drop supplemental log data(primary key,unique,foreign key,all) columns;

强调:表级关键字段补充日志在开启前,需要提前开启数据库级最小补充日志;

表级关键字段补充日志相比于数据库级,额外多一种日志粒度,为自定义关键字段日志;自定义关键字段补充日志分为有条件式和无条件式(加 always关键字);

alter table ${schema_name.tabel_name} add supplemental log group ${group_name} (keycol_1,keycol_2,keycol_3);alter table ${schema_name.tabel_name} add supplemental log group ${group_name} (keycol_1,keycol_2,keycol_3) <always>;---stop
alter table ${schema_name.tabel_name} drop supplemental log group ${group_name};
  • 关键查询语句
select t.owner,t.table_name,t.log_group_name,t.always,t.generated,cl.column_name,cl.position,cl.logging_propertyfrom dba_log_groups tinner join dba_log_group_columns clon (t.owner = cl.owner and t.table_name = cl.table_name andt.log_group_name = cl.log_group_name)where 1 = 1and t.owner='SJZBQ_SSTB'and t.table_name='DJ_NSRXX'order by t.owner, t.table_name, t.log_group_name, cl.position;

2、恢复场景

2.1、定义删除

对于对象被误删除定义的场景,只能依靠回收站来恢复;需要确定回收站处于开启状态,且在 dba_recyclebin 里可以查到相应记录;

执行恢复操作

flashback table ${schema_name.object_name} to before drop;

对于被恢复定义的对象,索引和主键等名称处于乱码状态,需要重建;

2.2、记录删除

对象数据被误删除在没有开启归档且没有 RMAN 备份的情况下,可以依靠 Undo 数据或者 Redo 数据来恢复;

2.2.1、undo恢复

通过闪回查询确定删除前的记录:

select * from ${schema_name.object_name} as of timestamp to_timestamp('2020-07-26 17:00:50','yyyy-mm-dd hh24:mi:ss') where 1=1 and ${query_condition};

闪回操作:

flashback table ${schema_name.object_name} to timestamp to_timestamp('2020-07-26 17:00:50','yyyy-mm-dd hh24:mi:ss');

说明:这类操作需要确保 undo被删除前的数据没有被覆盖,如果执行flashback操作报错 ora-01555,则相应的回滚段数据已经被覆盖;此时这种方式已经无法恢复数据,或者只能恢复一部分;

2.2.2、redo恢复

该类恢复方式需要依赖到redo日志文件,需要确保redo文件内容没有被覆盖;

step_1:select * from v$logfile t;
在这里插入图片描述
step_2:登录数据库服务器

sqlplus '/as sysdba'
exec dbms_logmnr.add_logfile('/data/zxcp/redo05.log',options=>dbms_logmnr.new);
exec dbms_logmnr.add_logfile('/data/zxcp/redo06.log', dbms_logmnr.ADDFILE);
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);create table log_recover as select * from v$logmnr_contents;select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo,sql_undo from log_recover  where username='xxxx' and table_name='xxxx';---最后执行
exec dbms_logmnr.end_logmnr();

此处 sql_redo里的dml语句是当时执行的删除语句,sql_undo里的语句是对应恢复的dml语句;可以将 sql_undo 里的语句存储为动态语句循环执行;

注意:此种方式对于 lob 字段,值内容很长的,可能最终恢复的数据 lob 列的值部分记录为空;因为对于 lob 字段,数据不直接存储在表里;要想Lob 列也可以闪回,需要在数据更新前开启数据库级最小附加日志;

2.2.3、dbms_logmnr

  • dbms_logmnr.start_logmnr
begin-- Call the proceduresys.dbms_logmnr.start_logmnr(startScn => :startScn,endScn => :endScn,startTime => :startTime,endTime => :endTime,DictFileName => :DictFileName,Options => :Options);
end;

说明:该方法有如上几个参数,在进行redo日志文件分析时,可以加 scn号的限制或时间戳的限制;

============================================== over ================================================


http://chatgpt.dhexx.cn/article/BmpOBCha.shtml

相关文章

Oracle数据库数据丢失恢复的几种方法总结

根据oracle数据库的特点和提供的工具&#xff0c;主要方法有以下几种方法&#xff1a; 利用逻辑备份使用import工具丢失数据的表 利用物理备份来通过还原数据文件并进行不完全恢复 利用dbms_logmnr包从redo log文件中恢复 利用flashback特性恢复数据 前提 为了方便…

QSS美化

摘自&#xff1a;https://qtdebug.com/qtbook-qss/ Qt 提供的 widget 的默认外观很多时候都不符合项目的界面需求&#xff0c;必须要改&#xff0c;修改一个 widget 的外观&#xff08;Look and Feel&#xff09;有以下的方法&#xff1a; 继承 Widget&#xff0c;然后在 pain…

Qss换肤设置

前言&#xff1a;本文大部分的内容来源于同类博客。章节1.1-1.3 摘自参考文档&#xff1a;http://www.th7.cn/web/html-css/201405/37286.shtml。1.4摘自参考文档。https://blog.csdn.net/Staranywhere/article/details/106967756。本文仅用作知识点整理。 目录&#xff1a; 1…

qss之QRadioButton

先来个示例 QRadioButton {font-family: "Microsoft YaHei";font-size: 14px;color: #BDC8E2;background-color: #2E3648; }效果图如下&#xff1a; 上面的例子是基本的样式设置&#xff0c;下面我们将探讨 QRadioButton 各种样式设置&#xff1a; 字体样式 font…

QSS的使用

QSS官方文档&#xff1a;https://doc.qt.io/qt-5/stylesheet-reference.html 图标制作例子: normal hover press disable 图标制作 按钮设计指南 按钮多态的几种方法 一、程序应用qss文件 QString qssPath QString("%1/stylesheet/style.qss").arg(a.applicationD…

QSS属性大全

1、选择器 1.1、通用选择器 /* 格式&#xff1a;* { 属性: 值; } 通用选择器一般用来给应用程序设置统一的字体&#xff0c;大小&#xff0c;颜色等 */ * {font-family: "Microsoft YaHei";outline: 0px;color: #DCDCDC; }1.2、类型选择器 /* 格式&#xff1a; 类…

Qt之QSS使用与基本语法

一、QSS介绍 QSS是一种从CSS借鉴过来的机制&#xff0c;用来实现对控件外观的自定义。但是它比CSS功能要弱化一些&#xff0c;有一些属性和选择器&#xff0c;QSS并没有。 Qt中的各个控件可以使用QSS来实现界面的个性化定制、美化&#xff0c;使用起来也是特别方便的。 二、Q…

QTreeWidget样式qss

文章目录 QTreeWidget/QTreeView样式QHeaderView背景属性alternate-background-color&#xff1a;交替背景色background&#xff1a;背景属性background-color&#xff1a;控件的背景色background-image&#xff1a;用于控件的背景图像。如果图像有透明部分则显示透明部分。bac…

qss文件使用

每个控件提供的样式太少&#xff1f;只能简单的设置颜色、字体颜色、字体大小&#xff1f;每次设置都要输入好长一串好麻烦&#xff1f; 现在你只要写一段qss就能满足你的一切需求&#xff0c;实现效果如下 本文将从下面三个方向慢慢阐述qss的使用 1、如何使用qss 2、如何修…

QSS 基础

如果你会 CSS&#xff0c;那么 QSS 对你来说将会非常简单&#xff0c;QSS 的语法和 CSS 的愈发非常相似&#xff0c;但也有些不同&#xff0c;有些 CSS 的东西在 QSS 里被去掉了&#xff0c;QSS 也加了些自己特有的东西&#xff0c;不过大多数还是差不多的&#xff0c;下面以修…

Qt QSS使用

一、选择器类型 Qt QSS选择器和CSS2、CSS3的选择器类似&#xff0c;建议先学习或者复习一下CSS选择器的语法。QSS虽然和CSS类型&#xff0c;但有也稍许不同&#xff0c;而且支持的语法也没那么多&#xff0c;具体讲解如下。 1.1 类选择器 /* 匹配QPushButton的实例及其子类 …

QSS 介绍

目录 一、自定义 widget 的两种方式二、一个简单示例三、QSS 比 QPalette 强大四、使用 Qt Designer 方便查看 qss 效果 一、自定义 widget 的两种方式 自定义 widget 外观的方式有两种&#xff1a; 子类化 QStyle&#xff1b;使用 Qt Style Sheets 机制&#xff1b; Qt Sty…

学习QSS样式表

文章目录 一、 什么是QSS二、辅助工具三、Qt样式表设置函数&#xff1a;setStyleSheet四、Qss选择器1、通用选择器2、类型选择器3、类选择器4、ID选择器5、后代选择器6、子元素选择器7、属性选择器8、并集选择器9、子控件选择器10、伪类选择器11、选择器的匹配规则 五、QSS常用…

QSS自定义属性

1.基本使用 &#xff08;参见 Qt 文档页章节 Setting QObject Properties&#xff1a;https://doc.qt.io/qt-5/stylesheet-syntax.html&#xff09; 从 Qt 4.3 及更高版本开始&#xff0c;可以使用 qproperty- <属性名称> 语法设置任何 designable 的 Q_PROPERTY &…

QSS

摘自&#xff1a;https://qtdebug.com/qtbook-qss/ Qt 提供的 widget 的默认外观很多时候都不符合项目的界面需求&#xff0c;必须要改&#xff0c;修改一个 widget 的外观&#xff08;Look and Feel&#xff09;有以下的方法&#xff1a; 继承 Widget&#xff0c;然后在 pai…

QSS 语法

目录 1. 基本语法1.1 样式规则1.2 选择器、声明1.3 大小写1.4 多个选择器 2. 选择器2.1 通用选择器&#xff1a;*2.2 类型选择器&#xff1a;QPushButton2.3 属性选择器&#xff1a;QPushButton[flat"false"]2.4 类选择器&#xff1a;.QPushButton2.5 ID 选择器&…

QSS(Qt样式表)概念

Qt样式表是一个可以自定义部件外观的十分强大的机制&#xff0c;除了QStyle更改的样式&#xff0c;其他的都可以由QSS修改。由于受到Html的CSS启发&#xff0c;所以叫QSS。 代码添加样式表ui界面上添加样式表 代码添加样式表&#xff1a; setStyleSheet&#xff08;&#xff0…

【QT】QSS使用总结

文章目录 主要流程&#xff1a;导入QSS文件&#xff1a;1. 添加Qt Resource File文件&#xff0c;输入名称2. 在工程文件目录下先建一个".txt"文件&#xff0c;重新命名后缀为".qss"3. 右键添加现有文件qss.qss4. 完成添加5. 将 qss样式应用到整个工程 QSS…

01_1_Qt工程实践_Qt样式表Qss(什么是QSS;基本语法;setStyleSheet函数;样式表的属性值;利用QtCreate实现样式切换;样式表实现皮肤改变实例)

本篇介绍什么是样式表&#xff0c;讨论如何使用Qt样式表Qss修改应用程序外观&#xff0c;并通过实例进行讲解。 了解HTML的同学都知道&#xff0c;一般在HTML中我们把样式表叫做CSS&#xff0c;在Qt中我们称之为QSS。QSS和CSS并不完全等同&#xff0c;语法完全类似&#xff0c…

【QT】QSS美化——基础知识

目录 一、辅助工具 二、QSS加载方式 三、QSS选择器类型 3.1 通配选择器 3.2 类型选择器 3.3 属性选择器 3.4 类选择器 3.5 ID选择器 3.6 后代选择器 3.7 子选择器 3.8 伪类选择器 四、QSS常用属性 4.1 字体 4.2 颜色 4.3 内边距 4.4 外边距 4.5 背景 4.6 边框…