使用Oracle logminer 找回delete的数据

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Oracle免费工具logminer,找回delete数据。
1、logminer介绍
2、logminer的用法
3、帮助用户找回delete的数据
1、logminer介绍
LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重做日志文件(归档日志文件)中的具体内容,LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图组成,它作为Oracle数据库的一部分来发布,是oracle公司提供的一个完全免费的工具。

2、logminer的用法
在用logminer获取数据字典文件时,需要设置UTL_FILE_DIR参数,然而设置这个参数必须要 重新启动数据库,生产库一般不能随便重启,从9i以上的版本可以直接使用在线数据文件字典,选项为dbms_logmnr.dict_from_online_catalog 。
直接使用三个dbms包:
exec dbms_logmnr.add_logfile();
exec dbms_logmnr.start_logmnr();
execute dbms_logmnr.end_logmnr;

3、帮助用户找回delete的数据
客户反馈晚上12点左右删除了数据,通过flashback已经无法闪回,也没有导出备份,rman全备倒是有,但是没有临时环境,且操作过程较长,此时需要logminer出马找回被delete的数据。
3.1 准备工作
相关视图
------------
v$logmnr_contents
SQL> desc v$logmnr_contents
Name Null? Type
----------------------------------------- -------- ----------------------------
SCN NUMBER
START_SCN NUMBER
COMMIT_SCN NUMBER
TIMESTAMP DATE
START_TIMESTAMP DATE
COMMIT_TIMESTAMP DATE
XIDUSN NUMBER
XIDSLT NUMBER
XIDSQN NUMBER
XID RAW(8)
PXIDUSN NUMBER
PXIDSLT NUMBER
PXIDSQN NUMBER
PXID RAW(8)
TX_NAME VARCHAR2(256)
OPERATION VARCHAR2(32)
OPERATION_CODE NUMBER
ROLLBACK NUMBER
SEG_OWNER VARCHAR2(32)
SEG_NAME VARCHAR2(256)
TABLE_NAME VARCHAR2(32)
SEG_TYPE NUMBER
SEG_TYPE_NAME VARCHAR2(32)
TABLE_SPACE VARCHAR2(32)
ROW_ID VARCHAR2(18)
USERNAME VARCHAR2(30)
OS_USERNAME VARCHAR2(4000)
MACHINE_NAME VARCHAR2(4000)
AUDIT_SESSIONID NUMBER
SESSION# NUMBER
SERIAL# NUMBER
SESSION_INFO VARCHAR2(4000)
THREAD# NUMBER
SEQUENCE# NUMBER
RBASQN NUMBER
RBABLK NUMBER
RBABYTE NUMBER
UBAFIL NUMBER
UBABLK NUMBER
UBAREC NUMBER
UBASQN NUMBER
ABS_FILE# NUMBER
REL_FILE# NUMBER
DATA_BLK# NUMBER
DATA_OBJ# NUMBER
DATA_OBJV# NUMBER
DATA_OBJD# NUMBER
SQL_REDO VARCHAR2(4000)
SQL_UNDO VARCHAR2(4000)
RS_ID VARCHAR2(32)
SSN NUMBER
CSF NUMBER
INFO VARCHAR2(32)
STATUS NUMBER
REDO_VALUE NUMBER
UNDO_VALUE NUMBER
SAFE_RESUME_SCN NUMBER
CSCN NUMBER
OBJECT_ID RAW(16)
EDITION_NAME VARCHAR2(30)
CLIENT_ID VARCHAR2(64)
----------------
3.2 确定日志
确定删除操作的时段,23:30~03:00之间做的delete,还好晚上没有什么业务,只产生了一个归档日志
3.3 添加日志
SQL> exec dbms_logmnr.add_logfile(LogFileName => '/backup/archivelog/1_251_946834694.dbf', Options => dbms_logmnr.new);
PL/SQL procedure successfully completed

3.4 解析日志
解析方法
DBMS_LOGMNR.START_LOGMNR ( startScn IN NUMBER default 0, endScn IN NUMBER default 0, startTime IN DATE default '01-jan-1988', endTime IN DATE default '31-dec-2110', DictFileName IN VARCHAR2 default '', Options IN BINARY_INTEGER default 0 );

执行解析
SQL> exec dbms_logmnr.start_logmnr(Options =>dbms_logmnr.dict_from_online_catalog);
PL/SQL procedure successfully completed

解析这里可以根据时间段或者scn范围解析,scn和时间转换可以用
select timestamp_to_scn(to_date('2017-08-12 00:00:01','YYYY-MM-DD HH24:MI:SS')) from dual;
select timestamp_to_scn(to_date('2017-08-12 00:10:01','YYYY-MM-DD HH24:MI:SS')) from dual;
我没有使用时间段,把整个log进行解析,然后通过sql_redo对应的delete语句查找sql_undo的语句

确认所需的sql,客户删除语句类似DELETE from T_WXSCKD ……这样的操作
select operation,sql_redo,sql_undo from v$logmnr_contents where OPERATION='DELETE' and SQL_REDO like 'delete from "ERP_CC"."T_WXSCKD"%';
输出结果清楚的看到redo和undo的sql信息,现在要做的是把对应的undo中insert语句导出来,生成sql脚本。
1065dc18c415bc09fdf6d1fa52cfa9a9d82cd576

可以加参数美化输出结果,但是格式化后的sql不适合作为脚本执行:DBMS_LOGMNR.PRINT_PRETTY_SQL
exec dbms_logmnr.start_logmnr(Options =>dbms_logmnr.dict_from_online_catalog + DBMS_LOGMNR.PRINT_PRETTY_SQL);
5fd4d6a55257c348bcdfaa0e06e9394efffbf304

3.5 生成脚本并导入到临时表
注意中文的输出,需要先设置NLS_LANG环境变量
export NLS_LANG="AMERICAN_AMERICA.zhs16gbk"
进行sqlplus格式化,这样输出的sql脚本中每个insert都是一行。
SQLPLUS>
set line 1000 --设置行的长度
set pagesize 0 --输出不换页
set feedback off --默认的当一条sql发出的时候,oracle会给一个反馈,比如说创建表的时候,如果成功命令行会返回类似:Table created的反馈,off后不显示反馈
set heading off --不显示表头信息
set trimspool on --如果trimspool设置为on,将移除spool文件中的尾部空
set trims on --去掉空字符
set echo off;     --显示start启动的脚本中的每个sql命令,缺省为on
set termout off --不在屏幕上显示结果
spool 12345.sql --记录数据到db1.txt
select count(1) from v$logmnr_contents where OPERATION='DELETE' and SQL_REDO like 'delete from "ERP_CC"."T_WXSCKD"%'; --导出数据语句
spool off --收集完毕
cce0ac3d62537c97414011135f58a96599276c9b


创建临时表,
create table ERP_CC.T_WXSCKD_tmp as select * from ERP_CC.T_WXSCKD where 1=0;
SQL>@12345.sql
commit;
客户根据条件找回所需的数据。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
8月前
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
在YMP校验过程中,从yashandb同步至Oracle的数据出现timestamp(0)字段不一致问题。原因是yashandb的timestamp(x)存储为固定6位小数,而Oracle的timestamp(0)无小数位,同步时会截断yashandb的6位小数,导致数据差异。受影响版本:yashandb 23.2.7.101、YMP 23.3.1.3、YDS联调版本。此问题会导致YMP校验数据内容不一致。
|
9月前
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有 YashanDB 版本。原因是操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常源于 system() 函数调用失败,返回 -1,通常是因为 fork() 失败。未来 YashanDB 将优化日志信息以更好地诊断类似问题。
|
8月前
|
Oracle 关系型数据库 Java
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
本文介绍通过Flink CDC实现Oracle数据实时同步至崖山数据库(YashanDB)的方法,支持全量与增量同步,并涵盖新增、修改和删除的DML操作。内容包括环境准备(如JDK、Flink版本等)、Oracle日志归档启用、用户权限配置、增量日志记录设置、元数据迁移、Flink安装与配置、生成Flink SQL文件、Streampark部署,以及创建和启动实时同步任务的具体步骤。适合需要跨数据库实时同步方案的技术人员参考。
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
|
8月前
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
|
8月前
|
Oracle 关系型数据库 Linux
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
|
9月前
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
某客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有版本。问题源于操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常原因为系统调用 fork() 失败。经验总结:优化日志记录,提供更多异常信息。
|
8月前
|
存储 Oracle 关系型数据库
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的还原数据
Oracle数据库中的还原数据(也称为undo数据或撤销数据)存储在还原表空间中,主要用于支持查询的一致性读取、实现闪回技术和恢复失败的事务。文章通过示例详细介绍了还原数据的工作原理和应用场景。
190 2
【赵渝强老师】Oracle的还原数据
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
197 0
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的数据文件
在Oracle数据库中,数据库由多个表空间组成,每个表空间包含多个数据文件。数据文件存储实际的数据库数据。查询时,如果内存中没有所需数据,Oracle会从数据文件中读取并加载到内存。可通过SQL语句查看和管理数据文件。附有视频讲解及示例。
136 0

热门文章

最新文章

推荐镜像

更多