设为首页 收藏本站
查看: 908|回复: 0

[经验分享] Oracle数据库中的坏块问题处理

[复制链接]

尚未签到

发表于 2018-9-13 06:21:17 | 显示全部楼层 |阅读模式
  Oracle的数据块有固定的格式和结构,分三层: Cache layer、Transaction layer和Data layer.
  对数据块进行读写操作时,做一致性检查:
  –Block type
  –DBA
  –Scn
  –Header and tail
  发现不一致,标记为坏块。
  坏块有两种: 物理坏块和逻辑坏块。
  坏块产生的影响:数据字典表、回滚段表、临时段和用户数据表和索引。
  应用报错:
  –Ora-1578
  –Ora-600 and trace file in bdump directory
  第一个参数[2000]-[8000]
  Range block layer
  -------------------------------------------
  Cache layer 2000 – 4000
  Transaction layer 4000 – 6000
  Data layer 6000 - 8000
  坏块产生的原因:
  Oracle调用标准C的系统函数,对数据块进行读写操作:
  - Bad I/O, H/W, Firmware.
  - Operating System I/O or caching problems.
  - Memory or paging problems.
  - Disk repair utilities.
  - Part of a datafile being overwritten.
  - Third part software incorrectly attempting to access oracle used heap.
  - Oracle or operating system bug.
  表中坏块的处理方法:
  (1).收集相关信息:
  Ora-1578 file# (RFN) block#
  Ora-1110 file# (AFN) block#
  ora-600 file# (AFN) block#
  select file_name,tablespace_name,file_id “AFN”, relative_fno “RFN” from dba_data_files;
  select file_name,tablespace_name,file_id, relative_fno “RFN” from dba_temp_files;
  9i tempfiles AFN=file_id+value of db_files
  (2).确定受影响的对象:
  SELECT tablespace_name, segment_type, owner, segment_name, partition_name FROM dba_extents WHERE file_id =  and  between block_id AND block_id + blocks - 1;
  If on tempfile, no data return;
  (3).根据对象类型,确定处理方法:
  Objects of sys
  rollback
  Temporary segment
  Index and index partition
  Cluster |
  Partition | ===>表中坏块的处理
  Table |
  (4).选择合适的方法抢救表中的数据:
  Recover datafile
  Recover block only (9i)
  通过ROWID RANGE SCAN 保存数据
  使用DBMS_REPAIR
  使用EVENT
  表中坏块的处理方法一:恢复数据文件
  数据库为归档方式,有完整的物理备份
  OFFLINE the affected data file
  ALTER DATABASE DATAFILE 'name_file' OFFLINE;
  保存有坏块的文件,RESTORE 备份。
  if different from the old location
  ALTER DATABASE RENAME FILE 'old_name' TO 'new_name';
  Recover the datafile
  RECOVER DATAFILE 'name_of_file';
  Online the file/s
  ALTER DATABASE DATAFILE 'name_of_file' ONLINE;
  表中坏块的处理方法二:block recover
  要求
  (1).数据库9.2
  (2).catalog 和rman
  (3).数据库为归档方式,有完整的物理备份
  (4).使用RMAN的BLOCKRECOVER命令
  Rman>run{blockrecover
  datafile 3 block 4,5;}
  可以强制使用某个SCN号之前的备份,恢复数据块。
  Rman>run{blockrecover
  datafile 3 block 4,5 restore until sequence 7402;}
  表中坏块的处理方法三:ROWID RANGE SCAN
  使用DBMS_ROWID 确定坏块的ROWID RANGE
  LOW_RID INSIDE the corrupt block:
  SELECT dbms_rowid.rowid_create(1,,,,0) from DUAL;
  HI_RID AFTER the corrupt block:
  dbms_rowid.rowid_create(1,,,+1,0) from DUAL;
  建一个临时表
  CREATE TABLE salvage_table AS SELECT * FROM corrupt_tab Where 1=2;
  保存未损坏的数据
  INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM  A WHERE rowid < '';
  INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM  A WHERE rowid >= '';
  重建table,index,foreign constrain table.
  表中坏块的处理方法四:add 10231 event
  在session 或database级设10231 event,做全表扫描时,可以跳过坏块.
  Session level:
  ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER,LEVEL 10';
  CREATE TABLE salvage_emp AS SELECT * FROM corrupt_emp;
  database level:
  event="10231 trace name context forever, level 10"
  表中坏块的处理方法五:dbms_repair
  标记有坏块的表,做全表扫描时,可以跳过坏块.
  Execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('','');
  保存表中数据
  EXPORT the table.
  CREATE TABLE salvage_emp AS SELECT * FROM corrupt_emp;
  表中坏块的处理方法六:检查索引
  检查表上的索引和primary key foreign key约束
  SELECT owner,index_name, index_type FROM dba_indexes WHERE table_owner=‘xxxx' AND table_name='xxxx';
  SELECT owner,constraint_name,constraint_type,table_name FROM dba_constraints WHERE owner='xxx' AND table_name='xxx' AND
  constraint_type='P';
  SELECT owner,constraint_name,constraint_type,table_name FROM dba_constraints WHERE r_owner='xxxx' AND r_constraint_name='';
  如何预先发现坏块:
  (1).Export utility
  exp system/manager full=y log=exp_db_chk.log file=/dev/null volsize=100g
  does not detect disk corruptions above the high water mark
  does not detect corruptions in indexes
  does not detect all corruptions in the data dictionary
  ANALYZE TABLE tablename VALIDATE STRUCTURE CASCADE
  performs the block checks ,but does NOT mark blocks as corrupt.
  It also checks that table and index entries match.
  Any problems found are reported into the user session trace file in USER_DUMP_DEST.
  可以定期对一些重要的表作检查.
  (2).DBV检查数据文件
  show parameter db_block_size
  select BYTES/2048 from v$datafile where FILE#=5;
  dbv file=/dev/rdsk/r1.dbf blocksize=2048 END=5120
  DBV expects a filename extension. If on raw dev
  ln -s /dev/rdsk/mydevice /tmp/mydevice.dbf
  Now use DBV against /tmp/mydevice.dbf


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-576976-1-1.html 上篇帖子: 浅谈Oracle Online redo log 下篇帖子: Oracle DataBase 各种版本资源路径汇总
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表