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