摘要:简述数据库坏块,发现并处理Oracle的物理坏块、逻辑坏块

以下摘自网络并规整:

一、数据库坏块介绍
数据库的数据块有固定的格式和结构,分三层:cache layer,transaction layer,data layer。在我们对数据块进行读取写入操作的时候,数据库会对要读写的数据块做一致性的检查,其中包括:数据块的类型、数据块的地址信息、数据块的SCN号以及数据块的头部和尾部。如果发现其中有不一致的信息,那数据库就会标记这个数据块为坏块了。

如果数据库出现坏块,数据库的告警日志文件里面会存在有如下的一些报错信息:Ora-1578、Ora-1110以及Ora-600 and trace file in bdump directory,其中Ora-600错误的第一个参数值的范围是[2000]-[8000],不同的值代表着数据块的不同的层出现问题,具体的如下表所示:Range block layerCache layer 2000 – 4000Transaction layer 4000 – 6000Data layer 6000 - 8000

二、数据库坏块分类
数据库坏块(corruption)
1、按照坏块所属对象的不同,分为用户数据坏块,数据字典坏块,Undo坏块,控制文件坏块,Redo坏块,Lob坏块,index坏块等等。

2、按照坏块产生的原因,分为物理坏块(physical corruption)和逻辑坏块(logical corruption)。

三、物理坏块与逻辑坏块
物理坏块指的是块格式本身是坏的,块内的数据没有任何意义。
逻辑坏块指的是块内的数据在逻辑是存在问题。比如说索引块的索引值没有按从小到大排列。

常见的物理坏块(Physical Block Corruptions)有块头和块尾信息不一致(Fractured/Incomplete),checksum值无效,数据块信息全部为0等情况,并且可能伴随错误ORA-1578和ORA-1110。

为了及时发现物理坏块和准确定位坏块产生的原因,oracle建议设置初始化参数DB_BLOCK_CHECKSUM=TYPICAL(默认值)。一般情况下,物理坏块是由于底层OS/disk系统错误/损坏,导致数据块被修改,数据块标志为坏块(corruption)。
数据块的Checksum值无效是一种常见的物理坏块,当数据库初始化参数DB_BLOCK_CHECKSUM=TYPICAL(默认值)时,DBWR进程将数据块写入disk时会计算数据块的Checksum,并且将Checksum值记录在数据块的位置offset 16和17;当从disk读取该数据块时,oracle重新计算数据块的Checksum,并且与记录在数据块中的Checksum做异或运算(Xor),如果异或结果为非0,说明数据块被修改过,数据块为坏块(corruption)。

四、数据库坏块产生的原因
1、硬件原因;
2、ORACLE与操作系统BUG;
3、操作系统的I/O错误或缓冲问题;
4、内存或paging问题;
5、非Oracle进程扰乱Oracle共享内存区域;
6、异常关机,掉电,终止服务;
7、硬盘修复工具;
8、一个数据文件的一部分正在被覆盖 ;
9、Oracle试图访问一个未被格式化的系统块失败;
10、数据文件部分溢出。

五、数据库坏块检查
1、SQL方式
在进行查询、更新等SQL发生报错数据库坏块;

2、日志报错记录
根据alert中的报错file_id和block_id查询对象。

3、RMAN方式(不产生备份)
RMAN> BACKUP CHECK LOGICAL VALIDATE DATAFILE n ; --检查某个数据文件逻辑坏块
RMAN> BACKUP CHECK LOGICAL VALIDATE DATABASE; --检查整个库逻辑坏块,结果放在v$database_block_corruption这个动态视图中。
RMAN> BACKUP VALIDATE DATABASE; --检查整个库物理坏块
RMAN> BACKUP VALIDATE DATAFILE n ; --检查某个数据文件物理坏块
注:另外还有VALIDATE…方式、RESTORE…VALIDATE方式检查。

4、ANALYSE方式
analyze table tablename validate structure cascade online(offline);
注:该命令同样会执行物理和逻辑一致性检查。除此之外,它还会检查表和索引条目的匹配性,检查分区表的记录是否在正确的分区中, 检查出的问题会放在USER_DUMP_DEST目录的trace文件中。

5、dbv工具检查
dbv file=d:\oracle\oradata\mydb\RONLY.DBF blocksize=8192

6、利用expdp工具导出整个数据库可以检测坏块
对以下情况的坏块是检测不出来的:
HWM以上的坏块是不会发现的;
索引中存在的坏块是不会发现的;
数据字典中的坏块是不会发现的。
注:发现坏块就报错,不继续执行。另外无法检查逻辑坏块。

六、数据库坏块修复方法
前提:发现坏块后,首先要获得坏块的所属对象、文件号及块位置。
如果是索引、视图等坏块,可以删除重建。

1、首先确认坏块的对象(5文件号,1345为块号)

SELECT tablespace_name,segment_type, owner, segment_name FROM dba_extents WHERE file_id =5 AND 1345 between block_id AND block_id + blocks - 1;

2、查询所有坏块

select * from v$database_block_corruption;

修复方法:假设坏块为file # 5,block # 1345

3、通过RMAN备份恢复坏块(如果有备份)

RMAN> backup validate datafile 5; --检测数据文件物理坏块信息RMAN> run {blockrecover datafile 5 block 1345;} --修复单个坏块RMAN> run {blockrecover corruption list;} ----修复所有记录在V$DATABASE_BLOCK_CORRUPTION中的逻辑坏块。RMAN> recover datafile ‘/xxx/xx’; --修复数据文件

注:修复前建议备份原数据文件,表空间offline。

4、跳过坏块,导出数据并重建表后导入(如果没有备份)
数据导完后再根据业务将数据补齐。

SQL> alter session set db_file_multiblock_read_count=1;SQL> execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(‘schema_name’,‘object_name’);SQL> create table dept_new as select * from table_name;

点击下方“阅读原文”查看更多精彩内容☺

oracle schema_Oracle数据库坏块检查与修复相关推荐

  1. oracle检查表是否有坏块,Oracle数据库坏块检查与修复

    摘要:简述数据库坏块,发现并处理Oracle的物理坏块.逻辑坏块 以下摘自网络并规整: 一.数据库坏块介绍 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction l ...

  2. oracle protocol=beq 不可用,学习笔记:Oracle数据库坏块 深入研究obj$坏块导致exp/expdp不能执行原因...

    天萃荷净 深入研究Oracle坏块obj$导致exp/expdp不能执行导出的原因 上篇(案例:Oracle出现obj$坏块exp/expdp导出不能导出的解决办法ORA-01578 ORA-0111 ...

  3. oracle数据错误循环冗余检查,oracle数据库坏块修复 oracle数据库数据错误(循环冗余检查)...

    前一段在某客户的系统中,就遇到了硬盘故障导致的数据库问题,仅仅是一个扇区损坏,碰巧位于数据文件上,就导致了如下错误: Mon Jun 13 09:14:10 2011 Errors in file f ...

  4. oracle 11g system01.dbf,oracle数据文件system01.dbf上有坏块,如何修复

    问题:数据库被一同事shutdown abort后,无法启动,报错如下: ksedmp: internal or fatal error ORA-00600: internal error code, ...

  5. 利用RMAN检测数据库坏块的脚本

    虽然我们也可以通过dbv(db file verify)工具做到对单个数据文件的坏块检测,但是直接使用RMAN的"backup validate check logical database ...

  6. ORACLE坏块检查

    10.2.0.4默认DB_BLOCK_CHECKSUM是TRUE 11.2.0.4默认DB_BLOCK_CHECKSUM是TYPICAL 10g,11g正常备份的时候可以检查物理一致性,但是不检查逻辑 ...

  7. oracle 11g 如何实现坏块检查、恢复?

    参考博文:http://www.cnblogs.com/arcer/archive/2013/06/05/3119511.html 转载于:https://www.cnblogs.com/arcer/ ...

  8. oracle schema_oracle数据库全局统计更新

    --oracle数据库优化 替换用户名 user,在该用户下执行 begin dbms_stats.gather_schema_stats( ownname =>'USER', options ...

  9. oracle坏块修复

    Oracle数据库出现坏块现象是指:在Oracle数据库的一个或多个数据块(一个数据块的容量在创建数据库时由db_block_size参数指定,缺省为8K)内出现内容混乱的现象.由于正常的数据块都有固 ...

最新文章

  1. 我在旷视研究院做检测 | 技术头条
  2. 受益一生的15个学习习惯
  3. java.sql.SQLException: Unknown system variable 'query_cache_size'
  4. linux下更改MySQL数据库存储目录
  5. 爬虫+python3(网页图片)
  6. Java并发编程之阻塞队列
  7. c语言jt808协议库,平台如何应答——关于JT/T808协议
  8. Android应用删除顶部标题栏
  9. VSTA InfoPath如何实现下拉列表联动
  10. cobalt strike
  11. python replace_Python replace()方法
  12. 平安证券最新股票池强荐4只股
  13. 计算机windows怎么开启,Win10怎么打开我的电脑_Win10正式版怎么打开我的电脑?-192路由网...
  14. Jetpack Compose for Desktop: 里程碑1发布
  15. 别再眼红别人家的年终奖了,这才是大多数人的现状!
  16. S32K144的FLASH中的SDK函数(FLASH_DRV_EraseSector)不能正常执行
  17. 外文文献翻译(OCR+Deepl+Mathpix)|CSDN创作打卡
  18. QT武林秘籍——我在QT中遇到的那些坑
  19. 使用QianWei网站源码配合cpolar,发布本地音乐分享网站
  20. CAN总线的终端电阻为什么常用120Ω?

热门文章

  1. 如何快将数据集划分为train、val(Python3代码模板)
  2. 关于ubuntu的root密码问题
  3. Elasticsearch 的前世今生 【转】
  4. Lambda架构与推荐在电商网站实践
  5. 应用Druid监控SQL语句的执行情况--转载
  6. Redis: under the hood---转载
  7. 菜菜sklearn——XGBoost(2)
  8. 【Git】Git教程
  9. “京东小贷” 注册资本由30亿元增至50亿元,恭喜
  10. 基于Python的开源人脸识别库:离线识别率高达99.38%