有时候为了学习测试,我们常常希望能够模拟数据块损坏,然后来研究相应问题的处理方法,最常见的是使用第三方软件进行数据块修改,模拟数据块损坏。以下是一种常见的模拟及坏块问题的解决方法及步骤。
首先构造测试数据,创建相应的表空间等:
SQL> create tablespace block datafile 'e:\oracle\oradata\eygle\block.dbf' size 1M;复制
表空间已创建。
变更测试用户使用该表空间:
SQL> alter user eygle default tablespace block;复制
用户已更改。
SQL> alter user eygle quota unlimited on block;复制
用户已更改。
创建测试表及构造测试数据:
SQL> connect eygle/eygle 已连接。 SQL> create table t as select * from dba_tables; 表已创建。 SQL> insert into t select * from t; 已创建4096行。 SQL> / insert into t select * from t * ERROR 位于第 1 行: ORA-01653: 表EYGLE.T无法通过8(在表空间BLOCK中)扩展 SQL> commit; 提交完成。复制
关闭数据库后可以用Ultredit等工具编辑数据文件,选择特定的数据部分,更改或者删除一些字符,然后启动数据库(有时候你可能需要多次更改才能成功损坏数据块),此时查询测试表,发现数据块已经损坏:
SQL> select count(*) from eygle.t; select count(*) from eygle.t * ERROR 位于第 1 行: ORA-01578: ORACLE 数据块损坏(文件号4,块号35) ORA-01110: 数据文件 4: 'E:\ORACLE\ORADATA\EYGLE\BLOCK.DBF' 使用DBV检查数据文件,可以检测到块损坏: E:\Oracle\oradata\eygle>dbv file=block.dbf blocksize=8192 DBVERIFY - 验证正在开始 : FILE = block.dbf 标记为损坏的页35 *** Corrupt block relative dba: 0x01000023 (file 4, block 35) Bad check value found during dbv: Data in bad block - type: 6 format: 2 rdba: 0x01000023 last change scn: 0x0000.00049097 seq: 0x1 flg: 0x06 consistency value in tail: 0x90970601 check value in block header: 0xd6cb, computed block checksum: 0x2c0a spare1: 0x0, spare2: 0x0, spare3: 0x0 ***复制
在这种情况下,如果有备份,需要从备份中恢复;如果没有备份,那么坏块部分的数据肯定要丢失了,在这个时候导出是不允许的:
E:\>exp eygle/eygle file=t.dmp tables=t复制
即将导出指定的表通过常规路径 ... . . 正在导出表 T EXP-00056: 遇到 ORACLE 错误 1578 ORA-01578: ORACLE 数据块损坏(文件号4,块号35) ORA-01110: 数据文件 4: 'E:\ORACLE\ORADATA\EYGLE\BLOCK.DBF' 导出成功终止,但出现警告。复制
当然,对于不同的情况需要区别对待,首先你需要检查损坏的对象,使用以下SQL:
SQL> SELECT tablespace_name, segment_type, owner, segment_name FROM dba_extents 2 WHERE file_id = 4 and 35 between block_id AND block_id + blocks - 1; TABLESPACE_NAME SEGMENT_TYPE OWNER SEGMENT_NAME ---------------- ---------------- ---------- --------------- BLOCK TABLE EYGLE T复制
如果损失的是数据(如果是索引块损坏,通常可以通过索引重建来解决),我们可以设置内部事件,使exp跳过这些损坏的block:
SQL> ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10';复制
系统已更改。
然后可以导出未损坏的数据
E:\>exp eygle/eygle file=t.dmp tables=t复制
即将导出指定的表通过常规路径 ...
. . 正在导出表 T 8036 行被导出
在没有警告的情况下成功终止导出。
这时候数据成功导出,此后可以通过drop table,重建数据表导入数据。本例中我们损失了8192 - 8036 = 156 行数据。
除了使用这种方式之外,还可以使用Oracle提供的dbms_repair包进行坏块标记,从而可以使查询跳过这些坏块,减少坏块对于表扫描访问的影响。
最后修改时间:2019-07-24 10:36:03
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
坏块中午对象该怎么处理啊,求大神解答。
5年前

评论
相关阅读
Oracle DataGuard高可用性解决方案详解
孙莹
586次阅读
2025-03-26 23:27:33
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
541次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
450次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
438次阅读
2025-04-08 09:12:48
Oracle SQL 执行计划分析与优化指南
Digital Observer
437次阅读
2025-04-01 11:08:44
墨天轮个人数说知识点合集
JiekeXu
436次阅读
2025-04-01 15:56:03
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
434次阅读
2025-04-22 00:20:37
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
411次阅读
2025-04-22 00:13:51
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
402次阅读
2025-04-20 10:07:02
Oracle 19c RAC更换IP实战,运维必看!
szrsu
386次阅读
2025-04-08 23:57:08