首页 > 数据库 >[转帖]Oracle 常规坏块处理方法

[转帖]Oracle 常规坏块处理方法

时间:2024-03-10 13:11:57浏览次数:39  
标签:erp move 转帖 Oracle 报错 坏块 block 重建

收到业务反馈,查看erp请求时遇到报错,一看居然是坏块。。。-_-||

 alert日志中也出现相关报错,但还好只有一个坏块

一、 有备份的处理方法

这一般就非常简单,rman有坏块修复功能

Recover datafile 19 block 44;

如有必要,可同时修复多个文件多个块

  1. Recover
  2. datafile 19 block 44
  3. datafile 19 block 43
  4. datafile 18 block 44,66,150;

二、 无备份的处理方法

因为出问题的是个uat环境,没有备份,所以rman我们用不了。

1. 查看坏块发生的位置

  1. -- 其中48为文件号,2454391为块号
  2. select /*+ parallel(t,8)*/* from dba_extents t where file_id=48 and 2454391 between block_id and block_id+blocks-1;
  • 如果发生在索引,运气不错,删掉重建就好
  • 发生在表,运气一般般,还能跳过
  • 发生在段头等特殊位置,悲剧,常规方法救不了

我们遇到的情况是坏块发生在业务表上。但特殊的点在于,这个表是erp的并发请求基表,上面有大量依赖对象和触发器,不敢重建,只能跳过数据。

并且测试发现,读写操作如果不涉及到坏块就能正常进行,如果读或者写到坏块上,就会报错。

2. SKIP_CORRUPT_BLOCKS

跳过坏块的原理是给坏块打上标记,以后select就跳过坏块中的数据,导致的后果就是坏块内的数据会全部丢失。

execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('用户名','表名'); 

跳过坏块之后,你会发现全表扫描已经不会报错。常规的做法是把表中数据导出再重新导入,重建下这个表。

create table orasup_fnd_concurrent_requests as select * from applsys.fnd_concurrent_requests;

但由于erp基表不敢重建,你会发现有个小问题:count的行数比直接查询的行数要多10行,那10行其实就是被标记的坏块里的数据,已经丢失了。

3. move坏块表

skip之后虽然查询不报错了,但如果insert数据刚好插入到坏块,还是会遇到报错

 查看里面的trace文件发现是个insert语句

于是我们尝试move表,把表放到其他位置,远离坏块。由于问题表是erp基表,操作非常频繁,而move操作会锁表(11g),因此必须要停下业务操作。另外注意11g move表之后索引会失效,需要重建。

alter table t move tablespace tbs1;

move之后,业务暂时没反馈有报错了。

参考

https://blogs.oracle.com/database4cn/oraclecorruption-

文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树数据库组成76968 人正在系统学习中

标签:erp,move,转帖,Oracle,报错,坏块,block,重建
From: https://www.cnblogs.com/jinanxiaolaohu/p/17946610

相关文章

  • ORACLE登录出现“ORA-12560:TNS:协议适配器错误”错误修复
    ORA-12560:TNS:协议适配器错误的问题一般由这3个原因导致,如下:1)Oracle服务异常停止2)Oracle注册表错误3)winOracleclient造成问题原因一【Oracle服务异常停止】,检查orcle服务是否正常启动win+R打开运行窗口,输入“services.msc”,打开服务页面,找到oracleOraDb11g_home1TNSListener......
  • oracle数据库rpm安装
    Oracle19C的安装与配置把19C的安装包传送到我们的虚拟机(Oracle19C)oracle19C默认安装到/opt/目录下,要保证该目录空间足够 rpm-ivhcompat-libstdc++-33-3.2.3-72.el7.x86_64.rpmrpm-ivhoracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm###yum自动解决依赖......
  • oracle 控制文件重建
    3.5 恢复与重建3.5.1恢复控制文件方法控制文件一旦损坏,系统将不能正常工作。受损的控制文件会记录在告警日志中,恢复或重建控制文件必须使系统在NOMOUNT下1)单个文件损坏了:参照多元化章节,通过简单复制解决。2)所有的控制文件丢失:①如果有binary控制文件备份,利用备份恢复控制文......
  • oracle11g awr手动生成快照
    您可以手动生成一个快照,以收集Oracle数据库的AWR(AutomaticWorkloadRepository)数据。请按照以下步骤生成一个快照:登录到Oracle数据库实例所在的服务器。切换到具有适当权限的Oracle用户。打开SQL*Plus或其他OracleSQL客户端。运行以下命令来生成快照:EXECDBM......
  • Navicat 无法连接Oracle / SQLserver
    报  cannotcreateocihandle cannotcreateocienviromentORA-XXXX等;排除用户名密码端口错误原因:Navicat本地的OCI版本与Oracle本地的不匹配查看Oracle本地的OCI版本,将Navicat升级至对应版本解决:下载新的oci进行替换https://www.oracle.com/database/technol......
  • Oracle中的sql hint
    Hint是Oracle数据库提供的一种机制用来告诉优化器按照hint告诉它的方式生成执行计划,是sql优化中常用的一个手段。基于代价的优化器,在绝大多数情况下会选择正确的优化器。但是有时候会选择效率很差的执行计划,使某个语句变得很慢,此时就需要通过hint告诉优化器使用指定的存取路径或......
  • Mysql和Oracle自定义函数区别
    1.Mysql自定义函数dropfunctionifexistsget_date;createfunctionget_date(v_datetimedatetime,v_timevarchar(50))returnsvarchar(50)begin declarev_datevarchar(50); declarecDatevarchar(50); declarebeginDatevarchar(50); setcDate=date_format(......
  • Oracle数据库Date类型查询结果多出“.0“的解决方法
    ​ oracle设置数据库某张表的字段类型为date,数据库存值为 2019-11-2518:51:47格式,但是从数据库查询出来之后格式为  StringstopTime=map.get("stopTime").toString;2019-11-2518:51:47.0,多了个零,不知是毫秒还是纳秒,目前还不知为何,解决办法为转换时间类型或者前端分......
  • Q:oracle通过正则表达式替换对应值
    示例视图把原ip地址替换成192.167.41.60:8080SELECTreplace(jg.yxwjjdz,regexp_substr(jg.yxwjjdz,'([0-9]{1,3}.){3}[0-9]{1,3}.{0,10}[0-9]/'),'192.167.41.60:8080/'函数用法regexp_like(search_string,pattern[,match_option])参数说明:search_string:是搜索值patter......
  • 运行时遇到Oracle错误1017 invalid username/password;login denied
    参考链接:https://answer.baidu.com/answer/land?params=7elCyy2%2BVQFLNLJM1h81dr5QZQQgc1gH3Jx0mKtGyC9iN883lLAjVKkqqFwgT9IkwDSCCV6LpBhAaZmXkqXteDsXxjanzrzpWVxBkZhfR3Unz5gw02%2BImYJ2Z%2Bvnm92UuArsoipr6J4Lg4wWW8llDohcXIR6bJhJl2%2Fy598QiTvvwPJAYShha1DQ3DoUCfGRi%2BD......