- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Oracle 数据坏块的 N 种修复方式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Oracle 数据库的运行不可避免的会遇到各种各样的错误,就比如数据表出现坏块,此时,你这张表的数据就无法访问了,有什么好的办法可以恢复呢?
什么,你没有遇到过?
�那就祝你不久的将来遇到,哈哈开个玩笑~ 玩归玩,闹归闹,经验必须要老到.
今天就给大家讲讲怎么处理数据表的坏块情况.
对于 Oracle 数据块物理损坏 的情形,通常可以分为两种情况:
有备份,通过 RMAN 恢复 。
无备份,通过 DBMS_REPAIR 修复 。
有备份的情况下,这是很理想的情形,我们可以直接通过 RMAN 块介质恢复(BLOCK MEDIA RECOVERY)功能来完成受损块的恢复.
这里我是不建议恢复整个数据库或者数据库文件来修复这些少量受损的数据块,有点浪费时间.
可参考官方文档:Block Media Recovery with RMAN 。
那如果没有任何备份怎么办? (PS:备份大于一切!) 。
我们可以使用 Oracle 自带的 DBMS_REPAIR 包来实现修复.
注意: 使用 DBMS_REPAIR 包来修复,并非完全恢复,而是标记坏块,然后不对其进行访问,这部分被标记的数据也就丢失了,这是无法避免的.
可参考MOS文档:DBMS_REPAIR SCRIPT (Doc ID 556733.1) 。
1、环境安装可参考我的一键安装脚本:Oracle 数据库一键安装,从未如此简单 。
创建表空间:
创建用户:
创建测试表:
创建表索引:
查看表段上的相关信息:
查出包含行记录的数据块:
注意: 这里看到 HEADER_BLOCK 和 BLOCK_ID 不一致,其实一个 segment 的第一个区的第一个块是 FIRST LEVEL BITMAP BLOCK,第二个块是 SECOND LEVEL BITMAP BLOCK,这两个块是用来管理 free block 的,第三个块是 PAGETABLE SEGMENT HEADER,这个块才是 segment 里的 HEADER_BLOCK.
首先,我们先做一个全备份,用来演示 RMAN 修复坏块.
破坏 1468、1688、2468 数据块的内容:
清除 buffer cache 的内容:
再次查询表 hyj,此时查询已经报错,发现有坏块:
当然,也可以使用 bbed 进行坏块模拟.
下面再介绍几种发现坏块的方式:
(1)使用 DBV 检查当前文件的坏块:
使用 DBV检查,同样发现了坏块.
(2)使用 rman 检查数据库坏块:
结合 V$DATABASE_BLOCK_CORRUPTION 视图查看,更加方便:
使用 RMAN 检查后,同样发现了坏块.
(3)通过数据库的告警日志也可以发现报错:
(4)通过报错信息快速查找对应的坏表,依次填写数据文件 ID 5 和 坏块 ID 1468:
实验环境准备完毕,下面开始实战.
今天,我打算使用上述介绍的 2 种方式来演示.
由于我们之前已经备份了,因此直接使用备份来恢复坏块:
使用同样的方式,依次修复坏块 1688,2468,修复成功后,查询已恢复正常.
再次检查坏块情况:
坏块已经都被恢复,并且数据没有丢失.
首先,依然使用 dd 先模拟坏块:
在没有备份的前提下,我们就无法做到无损修复坏块了,需要损失对应坏块的数据.
(1)创建 repair 表,用于记录需要被修复的表:
(2)创建 Orphan Key 表,用于记录在表块损坏后那些孤立索引,也就是指向坏块的那些索引 :
(3)检查坏块,检测对象上受损的情形,并返回受损块数为 3:
(4)查看受损的块信息:
注意: 这里 marked_corrupt 被标记为 TRUE,应该是系统在执行 CHECK_OBJECT 过程中自动完成了FIX_CORRUPT_BLOCKS。如果被标记为 FALSE,需要再运行 FIX_CORRUPT_BLOCKS 来完成坏块的标记工作.
(5)修复被损坏的数据块,这些被损坏的数据块是在执行了 check_object 之后生成的:
标记了 0 个坏块,说明 CHECK_OBJECT 完成了标记工作.
(6)使用 DUMP_ORPHAN_KEYS 过程将那些指向坏块的索引键值填充到 ORPHAN_KEY_TABLE:
表明 202 条记录被损坏丢失.
注意: 此处一定要注意 object_name 是索引名,而不是 table_name,这里 dump 的是损坏的索引信息.如果表有多个索引,需要为每个索引执行 DUMP_ORPHAN_KEYS 操作.
(7)验证对象是否可以查询,下面的结果显示依旧无法查询:
(8)跳过坏块:
注意: 丢失 202 条记录,丢失记录的 rowid 可以在 ORPHAN_KEY_TABLE 表中找到.
(9)重建索引:
(10)验证结果 。
至此,表中数据可以顺利被访问.
由于坏块并没有消失,而是被标记跳过,因此还是可以查看坏块:
用这种方法可以找回部分数据,也可以找回建了索引的值,但是使用dbv再检查表空间的数据文件时,仍然会显示有损坏的数据块.
这时需要把表的数据全部导出,再重建表或者表空间,然后再把找回的数据导入数据库,推荐用 expdp/impdp 命令做,可以彻底消除 dbv 检查到的坏块.
备份大于一切,也是最后的防线,所以请大家一定要做好备份!886 。
【编辑推荐】https://mp.weixin.qq.com/s/0w66O5Ugx-TX7e_trE5ZBQ 。
最后此篇关于Oracle 数据坏块的 N 种修复方式的文章就讲到这里了,如果你想了解更多关于Oracle 数据坏块的 N 种修复方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我制作了一个简单的 Chrome 扩展程序,可以自动将我带到我正在观看的系列节目的下一集。只是要清楚:代码有效! :p 但是,由于对 Chrome API 的调用大部分是异步的,我不得不将函数分成 3
在发布此问题之前,我尝试了在 Android 部分找到的所有答案,但均未成功... 由于某种原因,设备中的图像质量很差,而 Eclipse 和虚拟设备中的图像质量非常好 查看屏幕截图示例: examp
我想在一个小型机器集群(尽可能小)上支持大约 10,000 个并发 HTTP 客户端。我想在用户使用应用程序时与每个客户端保持连接,以允许服务器推送更新。 我相信异步 IO 通常被推荐用于这些类型的长
基本上,当我在 Eclipse 上自动完成(按 CTRL+Space)时,程序会滞后大约 5 秒。这真的很烦人,因为我经常使用自动完成功能。我该如何解决这个问题? 我正在处理的工作区位于具有 1Gbi
在我的模式中,我已经规范化了我的数据库并且到处都有 FK,因为社交网络中有如此多的链接关系,尤其是将用户链接到所有内容。 现在很明显,在社交网络中,性能会成败。这意味着“读取”时间比“写入”时间更重要
我有一个名为 globals.swift 的文件 代码很简单,看起来像这样。 import Foundation import CoreData import UIKit var g_workOrde
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
偶然发现了一个计算数字平方根的(糟糕的)算法。陷入了关于时间复杂度的小争论。我断言时间复杂度是 O(n^2) 因为对于 n 个输入,它将被乘以 n 次。我的 friend 断言时间复杂度实际上是 O(
这是一个一般性的问题,但为了解释它,我将使用一个具体的例子。 我有一个加载文档的函数。如果该文档不存在,它将创建它,如果它存在,它将把它转换为一个 JSON 数组。我总是希望此函数返回某种数组,无论
我要找 坏 使用继承的例子。我不是很有创意,所以这是我能想到的最好的: class Car : public Engine {} 汽车有发动机,但它不是发动机。 这可能有助于解释这个概念,但我相信还有
我很好奇......在内存缓存中使用压缩有什么优点/缺点吗? 最佳答案 许多客户端进行压缩,但服务器本身没有进行压缩。 客户端压缩意味着通过网络发送的数据更少,但更重要的是,单个对象更小。较小的物体可
我正在尝试将 OpenGL 渲染封装在渲染器类中。 我很确定我的窗口类工作正常(我检查了错误),但我认为错误在我的 Sprite 类中,但我不知道它是什么。 这是我的 Sprite 类: sprite
max(M,N,M):-M >= N,!. max(M,N,N). 我正在读一本教科书,说陈述性和程序性含义不同...我不知道该怎么做。 有人可以指出我正确的方向吗? 最佳答案 tl; dr:这不是关
我在线性回归模型上使用留一交叉验证。拥有 8869 个观察结果,原因如下: reg = LinearRegression() list_Rs = cross_val_score(reg, X_34_c
我在想....我有一个网站,其中正在进行大量搜索/排序。如果我将每次搜索的结果项 ID 缓存到 MEMORY 表中,然后简单地执行 WHERE item_id IN ("1", "5", "44",
我有一个 adopted为 Silverlight 实现一个简单的(无升级或超时)ReaderWriterLock,我想知道任何具有适当专业知识的人都可以验证它的设计是好是坏。对我来说它看起来很不错,
这是我在单击按钮时删除所选项目的代码,我在此代码中添加了警报对话框,添加此警报框后,发生 fatal error 异常。 public class MycustomAdapter extends B
我正在从 MySQL 数据库中获取数据。结果在对象中返回。 然后我可以像这样访问数据: $db_data->row 在 foreach 循环中,我通过添加一个数组来更改 $db_data,例如: fo
在我完成的几个 .NET C# web 服务项目中,我已经在单例模式的帮助下访问了静态数据库。然后前几天我的 friend 告诉我这是一件坏事,因为如果对同一个数据库实体发出大量请求,那么数据库将因为
在类的构造函数中进行数据库查询以便在创建类的新实例时加载它是否是一种不好的做法? class Home { private $home_id = null; private $home
我是一名优秀的程序员,十分优秀!