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

[经验分享] oracle坏块修复处理#ocp试验#

[复制链接]

尚未签到

发表于 2015-6-16 11:53:04 | 显示全部楼层 |阅读模式
  坏块分为物理坏块和逻辑坏块,前者是硬件问题产生,后者是oracle内部数据有问题,本次试验针对后者。
  
需要归档模式,步骤



1 create tablespace test 1m (table t1, insert)
2 RMAN>backup tablespace test
3 模拟坏块
4 DBV
5 ANALYZE TABLE
6 RMAN BACKUP
7 EXP
8 DBMS_REPAIR
9 BLOCKRECOVER
  1,sys用户下创建表空间
  SYS@jsce>create tablespace tbs1 datafile 'e:\tbs1.dbf' size 1m; --大小1M,容易填满(现在突然有疑惑:为什么要填满,才能制造坏块?)
  在tbs1中创建表tb1,数据来源是scott.emp
  SYS@jsce>create table tb1 tablespace tbs1 as select * from scott.emp;
  双倍递增插入表tb1,来源也是其自己
  SYS@jsce>insert into tb1 select * from tb1; --这里是select出来的东西插入到表,没有关键字values
  已创建15行。
  SYS@jsce>insert into tb1 select * from tb1;
  已创建30行。
  SYS@jsce>insert into tb1 select * from tb1;
  已创建60行。
  
  
   DSC0000.jpg
  
  在插满之后,不要忘记commit,否则oracle不能shutdown,最后确认一下插入的数据量“15360”
   DSC0001.jpg
  》给表增加索引,后面查询有坏块之后,坏块带来损失的数据ORPHAN_TABLE;
  SYS@jsce>create index i1 on tb1(ename);
  索引已创建。
  SYS@jsce>alter system checkpoint; --这一步是将插入的数据作检查点写入数据文件,下一步就要通过ultraedit修改数据文件,制造坏块。
  系统已更改。
  备注:如果表字段没有设置not null必输项,并且表字段很多,那么可以指定字段来插入一部分,比如emp表
  insert into emp(empno,ename,sal) values(22,'sumsen',8900);
  2,rman备份表空间tbs1,得到优良备份(下面还原使用)
  RMAN> backup tablespace tbs1 tag=ok;--增加tag
DSC0002.jpg
  3,shutdown之后,通过ultraedit修改数据文件 --修改的时候不要开头部,那里是数据文件名称,有可能导致oracle启动失败
DSC0003.jpg
  修改,保存之后,数据文件目录会多出一个TBS1.DBF.bak,说明修改过了,不知道为何
DSC0004.jpg
  启动oracle再次查询报错,坏块产生 --这里的select 是遇到第一个坏块就报错,因此如果有多个坏块,也是报出一个错误信息,需要用下面的REPAIR_TABLE查询所有的坏块。
DSC0005.jpg
  4,用dbv检测
DSC0006.jpg
DSC0007.jpg
  这里仅仅给出坏块数,没有给出坏块号和文件号
  5,使用 ANALYZE TABLE
  SYS@jsce>analyze table tb1 validate structure;
DSC0008.jpg
  6,rman的备份和exp导出有坏块的表空间
  exp导出sys下的
DSC0009.jpg
  E:\Documents and Settings\xs>exp userid='sys/sys as sysdba' file=e:\exptbs1.dmp tablespaces=tbs1
  导出表空间没有问题
DSC00010.jpg
  导出表有坏块报错
DSC00011.jpg
  rman提示超过坏块限制
DSC00012.jpg
  通过设置坏块最大数来继续备份
  RMAN> run{set maxcorrupt for datafile 3 to 10;backup tablespace tbs1 tag=bad;} 要写在一块,让rman知道是一个事务
  因为最大坏块设置为了10,tbs1有两个坏块,可以通过备份
DSC00013.jpg
  7,包DBMS_REPAIR
  exec DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE',1,1,'USERS');--表数据
  exec DBMS_REPAIR.ADMIN_TABLES('ORPHAN_TABLE',2,1,'USERS');--索引数据
DSC00014.jpg
  检查坏块:dbms_repair.check_object , 这里的schema_name是用户,比如我在sys下建立的表空间,这里就是sys,
  object_name是表不是表空间(查询的时候报错也是通过select * from tb1)
  declare
   cc number;
   begin
   dbms_repair.check_object(schema_name => 'SYS',object_name => 'TB1',corrupt_count => cc);
   dbms_output.put_line(a => to_char(cc)); --这里a=>不明不白,可以去掉
   end;
DSC00015.jpg
  
看到这里用dbms_repair.check,检查的结果corrupt_count=2,有2个块损坏,和dbv的结果一致。
check完之后,在我们刚在创建的REPAIR_TABLE中查看块损坏详细信息:




SELECT object_name,
relative_file_id,
block_id,
marked_corrupt,
corrupt_description,
repair_description,
CHECK_TIMESTAMP
from repair_table;
  得到4个结果,不过就两个块(33,69),只是时间不一样,不解?
DSC00016.jpg
  我们注意看MARKED_CORRUPT的值,这里经过check_object后,已经标识为TRUE了。(
  》使用包的skip_corrupt_blocks过程来跳过坏块
  exec dbms_repair.skip_corrupt_blocks(schema_name => 'SYS',object_name => 'TB1',flags => 1);
DSC00017.jpg
  损失了15360-15020=340 条数据
  》处理index上的无效键值;dump_orphan_keys
  declare
    cc number;
     begin
      dbms_repair.dump_orphan_keys(schema_name => 'SYS',object_name => 'I1',object_type => 2,
     repair_table_name => 'REPAIR_TABLE',orphan_table_name => 'ORPHAN_TABLE',key_count => CC);
    end;
  之后查询数据,我们根据这个结果来考虑是否需要rebuild index(?)
DSC00018.jpg
  和上面的损失数目一样
  9  BLOCKRECOVER 恢复坏块--前提是坏块事先有备份
  RMAN> blockrecover from tag=ok datafile 3 block 33,69;--必须要指定坏块号
DSC00019.jpg
  之后查询tb1,恢复
DSC00020.jpg
  这时候dbv检测也为0
DSC00021.jpg
  
  18:10 更新,使用oracle内部事件
  再次破坏了数据文件,可是查询时候仍然不报错,想到是前面执行了让oracle跳过坏块的过程
  exec dbms_repair.skip_corrupt_blocks(schema_name => 'SYS',object_name => 'TB1',flags => 1);
DSC00022.jpg
  直接将flag=>2
DSC00023.jpg
DSC00024.jpg
  SELECT tablespace_name, segment_type, owner, segment_name
           FROM dba_extents
          WHERE file_id = 3
          and 35 between block_id AND block_id + blocks - 1 --这里 35 between不懂
DSC00025.jpg
  ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10' ;
DSC00026.jpg
DSC00027.jpg
  之后
  SQL> ALTER SYSTEM SET EVENTS='10231 trace name context off' ;
  系统已更改。
  删除表空间
  SYS@jsce>drop tablespace tbs1 including contents and datafiles; --表空间物理文件也被删除
  之后导入
  演示省略。
  
  
  

运维网声明 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.yunweiku.com/thread-77927-1-1.html 上篇帖子: 开放-封闭原则OCP(Open-Close Principle) 下篇帖子: OCP-1Z0-053-V13.02-712新题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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