生产数据恢复系列-使用 ODU 恢复 Oracle 误删的数据

科技   2024-10-20 23:59   中国  

热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多宝贵地意见,我们一起提升,守住自己的饭碗。


一、什么是ODU?

ODU全称为Oracle Database Unloader,是类似于Oracle的DUL的软件,用于直接从Oracle数据库的数据文件中获取表数据。在各种原因造成的数据库不能打开时,用于抢救数据,最大限度地减少数据丢失。

现实中总会有很多的意外,数据被意外删除、硬件问题导致数据库损坏、错误地格式化了ASM磁盘等等,在没有备份的情况下,ODU能够通过直接访问Oracle 数据库数据文件或直接访问ASM磁盘,恢复出所有完好的数据,以避免所有数据丢失造成的损失。


二、ODU的几种恢复场景

场景1. 数据库不能启动,但是SYSTEM表空间中的数据字典是完整的。

  • • 生成数据字典:unload dict

  • • 列出用户: list user

  • • 列出用户下的所有表: list table username

  • • 恢复表: unload table username.tablename

  • • 也可以按用户恢复:unload user username

场景2. 表被TRUNCATE。

  • • OFFLINE表所在的表空间

  • • 生成数据字典:unload dict

  • • 显示表的段头:desc username.tablename

  • • 找到实际的data object id:dump datafile file# block block#

  • • 扫描数据:scan extent

  • • 恢复表:unload table username.tablename object object_id

UPDATE: 从3.0.7版本开始,恢复Truncate表更方便,只需要执行下面的步骤:

  • • OFFLINE表所在的表空间

  • • 生成数据字典:unload dict

  • • 扫描数据:scan extent

  • • 恢复表:unload table username.tablename object auto

场景3. 表被DROP。

  • • OFFLINE表所在的表空间

  • • 使用logminer从日志里面挖掘被drop掉的表其data object id,如果不能挖掘,按下面的场景4进行恢复。

  • • 扫描数据:scan extent

  • • 如果没有表结构信息,需要自动来判断:unload object data_object_id sample

  • • 恢复表:unload object data_object_id column coltype coltype...

场景4. 系统表空间损坏。

  • • 扫描数据:scan extent

  • • 搜索数据:unload object all sample

  • • 从结果文件sample.txt查找需要的数据

  • • 恢复需要的表:unload object data_object_id column coltype coltype...

场景5. 表中数据被DELETE。

  • • 将参数unload_deleted设置为YES

  • • 生成数据字典:unload dict

  • • 恢复表: unload table username.tablename


三、ODU的安装及使用

1、下载ODU软件

链接: https://pan.baidu.com/s/1icLD90KueXeWrqizbKSijw 提取码: 9shk

2、安装ODU

[root@localhost odu]#cd /opt/
[root@localhost odu]#tar -xvf odu_308_linux_x86.tar.tar  #这里我们使用版本3,4版本的需要授权
[root@localhost odu]#chown -R oracle.oinstall odu
[root@localhost opt]# cd odu
[root@localhost odu]# ll

ODU软件解压后,通常有下列文件和目录:

odu                ODU 可执行文件,这是ODU主程序。 

config txt       ODU 配置文件。 

control.txt      ODU 控制文件,用于在数据恢复时指定使用的Oracle 数据库文件。

asmdisk.txt    ASM 磁盘信息设置文件,用于在数据恢复时指定使用的ASM磁盘组磁盘。 

data               ODU 默认的数据目录,用于存储ODU恢复出来的数据。

3、创建测试环境

SQL> create tablespace zhh datafile '/u01/app/oracle/oradata/orcl11g/zhh01.dbf' size 10M;
SQL> create user zhh identified by123456default tablespace zhh;
SQL> grant dba to zhh;
SQL> conn zhh/123456
SQL> create table ceshi(id int,name varchar2(10));
SQL>begin
for i in1..10000
     loop
     insert into ceshi values(i,'testvalue');
end loop;
     commit;

end;

/

SQL>select count(*)from ceshi;

4、模拟使用delete误删数据

SQL> delete ceshi where ID > 8000;

SQL> commit;

SQL> select count(*) from ceshi;

5、使用工具开始恢复

SQL> set lines 999
SQL>select ts#,file#,rfile#,name from v$datafile;
这里我们选择system和zhh两个dbf文件即可
修改ODU的control文件
[oracle@myoracle odu]$ vi control.txt 
修改表头为#ts  #fno  #rfno   filename只需要这四列就可以
#ts #fno   #rfno     filename                                          block_size
011/u01/app/oracle/oradata/orcl11g/system01.dbf
766/u01/app/oracle/oradata/orcl11g/zhh01.dbf
修改ODU的config.txt
[oracle@myoracle odu]$ vi config.txt
新增unload_deleted  yes

[oracle@myoracle odu]$ ./odu

加载unload数据字典

ODU> unload dict  
ODU> unload table zhh.ceshi

[oracle@myoracle data]$ cd /opt/odu/data

重命名误删的数据表

SQL> rename ceshi to ceshibak;
SQL>create table ceshi(id int,name varchar2(10));

使用sqlldr恢复数据

[oracle@myoracle data]$ sqlldr zhh/123456 control=ZHH_CESHI.ctl log=123.log

[oracle@myoracle data]$ cat 123.log 

SQL> select count(*) from ceshi;

验证数据


参考链接

https://blog.csdn.net/bamuta/article/details/7767669

文中的概念来源于互联网,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。


欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识



分享几个数据库备份脚本

一文搞懂 Oracle 统计信息

我的 Oracle ACE 心路历程

MOP 系列|MOP 三种主流数据库索引简介

Oracle 主流版本不同架构下的静默安装指南

关机重启导致 ASM 磁盘丢失数据库无法启动

Oracle SQL 性能分析(SPA)原理与实战演练

Oracle 11g 升级到 19c 需要关注的几个问题

Windows 10 环境下 MySQL 8.0.33 安装指南

SQL 大全(四)|数据库迁移升级时常用 SQL 语句

OGG|使用 OGG19c 迁移 Oracle11g 到 19C(第二版)

Oracle 大数据量导出工具——sqluldr2 的安装与使用

从国产数据库调研报告中你都能了解哪些信息及我的总结建议

使用数据泵利用 rowid 分片导出导入 lob 大表及最佳实践

在归档模式下直接 rm dbf 数据文件并重启数据库还有救吗?

欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347

CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————

JiekeXu DBA之路
JiekeXu:Oracle ACE-Pro,获 Oracle OCP/OCM 及 MySQL OCP 认证,墨天轮 MVP,利用闲时间记录菜鸟 DBA 学习成长之路,所发布文字属于个人观点和学习笔记,如有错误及不当之处,敬请批评指正!
 最新文章