ORACLE坏块(ORA-01578)处理方法
Oracle数据块损坏知识
•
几乎所有的数据块都有Cache层,KCBH
Oracle Block构成 事务层 ktbbh
• • 在本数据块上执行着的 或者执行过的事务信息 存放
– SCN (System Change Number) – ITL 一种事务列表 ktbbhitl – 存放的数据类型 ktbbhtyp , KDDBTINDEX代表索引 , KDDBTDATA 代表数据 – ktbbhflg , MSSM or ASSM, KTBFONFL or KTBFBSEG
– 服务进程修改数据块,checksum被置0 – DBW负责计算checksum并写出块 – 在上述改数据块和checksum之间存在时间,DBW不清楚这中 间的问题,也不负责
db_block_checksum=TRUE
Buffer cache
Block#=X Chkval=0 Block#=X Chkval=A
数据层 Tail
Oracle Block构成 Cache层 Kcbh
• Cache层包含用来检测块损坏的信息
– Cache层的chkval_kcbh用来确认,上一次的写入到磁盘,到现在读取出来磁盘上 的Block的内容是否一致
•
Cache层存放的信息
– 本数据块存放何种数据type_kcbh(Data,Index) – RDBA和格式版本 – 本数据块的更新情况
数据块损坏检测参数 DB_BLOCK_CHECKSUM
• 三种不同作用的检测 保护机制,但都不负责修复 现有问题。 • DB_BLOCK_CHECKSUM负责控制块的cache层的 chkval_kcbh是否在块被写出时计算并写入到磁盘 中
BBED> sum Check value for File 0, Block 500: current = 0x5327, required = 0x5327 BBED> p chkval_kcbh ub2 chkval_kcbh
oracle安装完成后遇到的问题(ORA-01507:databasenotmounted)
第二步: 进入oracle的家目录(oraclehome)下的dbs目录里面 第三步: 检查文件名为 lБайду номын сангаас+*** 文件,语句为 fuser -u lk+***(这个代表前缀为lk的文件),比如说我的数据库为ORACL,就会有一个lkORACL文件
第四步: kill掉文件中的内容,执行 fuser -k + lk+***
第五步: 重启数据库
检查文件名为lk文件语句为fuserulk这个代表前缀为lk的文件比如说我的数据库为oracl就会有一个lkoracl文件
oracle安装完成后遇到的问题( ORA-01507: databasenotmounted)
oracle安装完成后,想把用户sys的密码改成123,语句是:alter user system identified by 123; 然后报错:
oracle数据库中ora-报错原因及处理
ORA-00123 空闲公用服务器终止 ORA-00124 在缺少MAX_SHARED_SERVERS的情况下指定了DISPATCHERS ORA-00125 连接被拒绝;无效的演示文稿 ORA-00126 连接被拒绝;无效的重复 ORA-00127 调度进程不存在 ORA-00128 此命令需要调度进程名 ORA-00129 监听程序地址验证失败'' ORA-00130 监听程序地址''无效 ORA-00131 网络协议不支持注册'' ORA-00132 语法错误或无法解析的网络名称'' ORA-00150 重复的事务处理ID ORA-00151 无效的事务处理ID ORA-00152 当前会话与请求的会话不匹配 ORA-00153 XA库中的内部错误 ORA-00154 事务处理监视器中的协议错误 ORA-00155 无法在全局事务处理之外执行工作 ORA-00160 全局事务处理长度超出了最大值() ORA-00161 事务处理的分支长度非法(允许的最大长度为) ORA-00162 外部dbid的长度超出了最大值() ORA-00163 内部数据库名长度超出了最大值() ORA-00164 在分布式事务处理中不允许独立的事务处理 ORA-00165 不允许对远程操作进行可移植分布式自治转换 ORA-00200 无法创建控制文件 ORA-00201 控制文件版本与ORACLE版本不兼容 ORA-00202 控制文件:'' ORA-00203 使用错误的控制文件 ORA-00204 读控制文件时出错(块,#块) ORA-00205 标识控制文件出错,有关详情,请检查警告日志 ORA-00206 写控制文件时出错(块,#块) ORA-00207 控制文件不能用于同一数据库 ORA-00208 控制文件的名称数超出限制 ORA-00209 控制文件块大小不匹配,有关详情,请检查警告日志 ORA-00210 无法打开指定的控制文件 ORA-00211 控制文件与先前的控制文件不匹配 ORA-00212 块大小低于要求的最小大小(字节) ORA-00213 不能重新使用控制文件;原文件大小为,还需 ORA-00214 控制文件''版本与文件''版本不一致
ORA-01578_Oracle_data_block_corrupted
ORA-01578: Oracle data block corrupted (file # f_num, block # b_num)产生原因:当ORACLE访问一个数据块时,由于1、硬件的I/O错误;2、操作系统的I/O错误或缓冲问题;3、内存或paging问题;4、ORACLE试图访问一个未被格式化的系统块失败;5、数据文件部分溢出等上述几种情况的一种引起了逻辑坏块或者物理坏块,这时就会报ORA-01578的错误。
解决方式:由于ORACLE只有在访问到有问题的数据文件时才会报错,所以报错的时间有可能会比实际出错的时间要晚,如果ORA-01578出错信息提示数据坏块指向的是用户自己的数据文件,则用以下方法来解决:如果通过下面的SQL语句查出的坏块出现有索引上,则只需重建索引即可SQL>Select owner, segment_name, segment_type from dba_extents where file_id=5 and block_id between 60474 -1 and 60474如果坏块出现在表上,先用以下语句分析是否为永久性坏块(建议多执行一两次,有助于鉴别数据坏块是永久性的(硬盘上的物理坏块)还是随机性的(内存或硬件错误引起)):SQL>Analyze table validate structure cascade;执行该命令后,可能会出现以下的结果:ORA-01578:与原先错误信息有相同的参数,为永久性的物理或逻辑坏块;如果与原先错误信息有不同的参数,可能与内存,page space和I/O设备有关。
如果用户有此表的最新备份,那么最好是用此备份来恢复此表,或者使用event 10231来取出坏块以外的数据:<1>.先关闭数据库<2>.编辑init.ora文件,加入:event=”10231 trace name context forever,level 10”<3>.startup restrict<4>.创建一个临时表:SQL>create table errortemp as select * from error ;(error是坏表的表名)<5>.把event从init.ora文件中删掉并重起数据库<6>.rename坏表,把临时表rename成坏表的表名<7>.创建表上的INDEX等如果ORA-01578出错信息提示数据坏块指向的是数据字典或者是回滚段的话,你应该立即与ORACLE公司联系,共同商量一个好的解决办法。
ORACLE坏块(ORA-01578)模拟与处理方法
ORACLE坏块(ORA-01578)模拟与处理方法一。
.什么是数据库的坏块首先我们来大概看一下数据库块的格式和结构——数据库的数据块有固定的格式和结构,分三层cache layer,transaction layer,data layer。
在我们对数据块进行读取写入操作的时候,数据库会对要读写的数据块做一致性的检查,其中包括数据块的类型、数据块的地址信息、数据块的SCN号以及数据块的头部和尾部。
如果发现其中有不一致的信息,那数据库就会标记这个数据块为坏块了。
数据库的坏块分为两种,逻辑坏块和物理坏块。
二.模拟坏块SQL> conn systemSQL> create tablespace corrupt datafile 'C:\corrupt.dbf' size 200k;SQL> create table corrupt_tab tablespace corrupt as select * from all_users;SQL> alter table corrupt_tab modify(user_id primary key);SQL> select extent_id,file_id,block_id,blocks from dba_extents2 where owner='SYSTEM' and segment_name='CORRUPT_TAB';EXTENT_ID FILE_ID BLOCK_ID BLOCKS---------- ---------- ---------- ----------0 8 17 8上述查询说明,这个表具有一个区间EXTNET_ID 0,位于8号文件,从块号17开始,大小为8个块。
SQL> conn / as sysdbaSQL> shutdown immediate;用UE编辑器模拟出物理或逻辑坏块。
oracle坏块修复
Oracle 坏块总结收藏Oracle数据库出现坏块现象是指:在Oracle数据库的一个或多个数据块(一个数据块的容量在创建数据库时由db_block_size参数指定,缺省为8K)内出现内容混乱的现象。
由于正常的数据块都有固定的合法内容格式,坏块的出现,导致数据库进程无法正常解析数据块的内容,进而使数据库进程报错乃至挂起,并级联导致整个数据库实例出现异常。
一.坏块的产生原因坏块产生的原因大致有以下几种:1.1 硬件问题Oracle进程在处理一个数据块时,首先将其读入物理内存空间,在处理完成后,再由特定进程将其写回磁盘;如果在这个过程中,出现内存故障,CPU计算失误,都会导致内存数据块的内容混乱,最后反映到写回磁盘的数据块内容有误。
同样,如果存储子系统出现异常,数据块损坏也就随之出现了。
1.2 操作系统BUG由于Oracle进程对数据块的读写,都是以操作系统内核调用(system call)的方式完成的,如果操作系统在内核调用存在问题,必然导致Oracle进程写入非法的内容。
1.3 操作系统的I/O错误或缓冲问题1.4 内存或paging问题Oracle软件BUGOracle软件特定版本上,可能出现导致数据块的内容出现异常BUG。
1.5 非Oracle进程扰乱Oracle共享内存区域如上文所述,在当数据块的内容被读入主机的物理内存时,如果其他非Oracle进程,对Oracle 使用的共享内存区域形成了扰乱,最终导致写回磁盘的数据块内容混乱。
1.6 异常关机,掉电,终止服务异常关机,掉电,终止服务使进程异常终止,而破坏数据块的完整性,导致坏块产生。
注:这也是为什么突然断电会导致数据库无法启动由上可见,坏块的形成原因复杂。
当出现坏块时,为了找到确切的原因,需要大量的分析时间和排查操作,甚至需要多次重现才能找出根本原因。
但当故障发生在生产系统上,我们为了减少停机时间,会尽快实施应急权变措施以保证系统的可用性,这样就破坏了故障现场,对根本原因的分析因而也更加困难了。
ORACLE数据库一次意外宕机的分析处理实记(ora-1578)
一个安静的下午,测试环境中一台装有ORACLE数据库的AIX小机因意外断电而导致其上的oracle数据库宕机了。
由于是测试环境,安排了一个工程师过去解决了,具体是这样解决的:首先重启了小机服务器,启动完后,发现oracle所在的/app目录没有mount上。
然后通过smitty fs修复了一下,mount上了app,再接着启动oracle就起来了。
事后搜集了system.txt 系统日志(通过errpt -a获得)和alert_soa.log以及oracle的跟踪日志trc,分析trc日志看到如下:/app/oracle/product/10.2.0/admin/soa/bdump/soa_mmon_307366.trcOracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options ORACLE_HOME = /app/oracle/product/10.2.0System name: AIXNode name: data2Release: 3Version: 5Machine: 00CE993C4C00Instance name: soaRedo thread mounted by this instance: 1Oracle process number: 11Unix process pid: 307366, image: oracle@data2 (MMON)*** 2013-03-01 14:06:10.308*** SERVICE NAME:(SYS$BACKGROUND) 2013-03-01 14:06:10.212*** SESSION ID:(161.1) 2013-03-01 14:06:10.212Hex dump of (file 3, block 49259)Dump of memory from 0x07000000C5934000 to 0x07000000C59360007000000C5934000 06A20000 00C0C06B 0178F614 00000104 [.......k.x......]7000000C5934010 45A30000 010A0025 0000224D 0178F614 [E......%.."M.x..]7000000C5934020 00000000 1F023200 00C0C069 00010003 [......2....i....]又观察另两个文件,发现有较多ORA-1578报错和DISK OPERATION ERROR。
坏块处理
ORACLE数据库数据恢复、性能优化来问问ASKMACLEAN【转】处理Oracle 7/8/8i/9i/10g/11g 中的数据块损坏/讹误/坏块适用于:Oracle Database – Enterprise Edition –版本7.0.16.0 到11.2.0.2.0 [发行版7.0 到11.2]本文档所含信息适用于所有平台用途本文章讨论如何处理Oracle 数据文件中的一个或多个坏块,并介绍了处理这些坏块的主要方法。
在采取任何措施之前,请先阅读完整篇文章。
详细信息文档历史记录本文中所提到的所有SQL 语句均适用于SQL*Plus(8.1 或更高版本),或作为SYSDBA 用户连接时,适用于Server Manager (Oracle7/8.0)。
(例如:―connect / as sysdba‖或―connect internal‖)简介本文章讨论如何处理Oracle 数据文件中的一个或多个坏块,并介绍了处理这些坏块的主要方法。
在采取任何措施之前,请先阅读完整篇文章。
本文档未介绍内存坏块问题(通常为ORA-600 [17xxx] 类型错误)。
注意:如果在启动时出现ORA-1578 问题,请与当地支持中心联系,以获得参考建议。
Doc 106638.1 –本文档不会提供给客户,但其中的相关步骤可以由经验丰富的支持分析人员提供。
本文章介绍了许多类型的错误,很多其他地方也可能引用到本文章。
重要的是,您需要知道关于每个坏块的以下信息:包含坏块的文件的绝对文件编号(FILE NUMBER)。
本文中称为―&AFN‖。
包含坏块的文件的名称。
本文中称为―&FILENAME‖。
(如果您知道文件编号,但不知道文件名,则可以使用V$DATAFILE 来获取文件名:SELECT name FROM v$datafile WHERE file#=&AFN;如果文件号未显示在Oracle8i 的V$DATAFILE 中,且&AFN 大于DB_FILES 参数值,则该文件可能是临时文件。
Oracle坏块故障葵花宝典
Oracle坏块故障总结最近处理了两次典型的ora-01578,ora-01115,ora-01110故障,一次是平湖索引块坏,一次是黄山数据文件坏、blob数据块坏。
平湖的警告日志文件中有以下信息:ORA-12012: error on auto execute of job 21ORA-01578: ORACLE data block corrupted (file # 10, block # 2558610) ORA-01110: data file 10: 'D:\ORACLE\ORADATA\BS\USERS04.DBF'ORA-12012: error on auto execute of job 1ORA-01578: ORACLE data block corrupted (file # 16, block # 2624066) ORA-01110: data file 16: 'D:\ORACLE\ORADATA\BS\USERS10.DBF'应用软件可以正常使用,偶尔会报错ora-01578。
排错过程登录数据库检查:select count(*) from ep_table t where ptime<trunc(sysdate)-30 andalarmtype=0784163select count(*) from ep_table t4281062看来全表扫描正常select from ep_table t where ptime<trunc(sysdate)-31 and ptime>trunc(sysdate)-33 and alarmtype=0 and rownum<10001索引扫描报错了,推断为索引上有坏块!继续查:select owner,file_id,segment_name, segment_type, block_id, blocks from dba_extentswhere file_id=16 and block_id<=2624066 and (block_id + blocks- 1) >= 2624066;运气真好重建相关索引后数据库就恢复了。
Oracle DBMS_REPAIR包修复损坏数据块
ACTION => sys.dbms_repair.create_action,
ቤተ መጻሕፍቲ ባይዱABLESPACE => 'NMCPMTS');
END;
PL/SQL 过程已成功完成。
BEGIN
DBMS_REPAIR包不但可以检测出坏块,根据表被索引的情况,还可以用来在一定程度上恢复坏块中的数据。
需要注意,DBMS_REPAIR包没有进行授权,默认情况下,只有sys用户可以执行。
下面通过一个完整的例子来说明DBMS_REPAIR包的使用。
第一步:构造测试环境
首先建立一个测试用表空间,由于需要用UltraEdit打开数据文件修改部分内容来模拟错误,因此数据文件要建的小一些。
db_block_size integer 16384
BLOCK的大小是16k。
SQL> SELECT TO_CHAR(6*16384, 'XXXXXX') FROM DUAL;
TO_CHAR
-------
18000
SQL> SELECT TO_CHAR(7*16384, 'XXXXXX') FROM DUAL;
TO_CHAR
-------
1C000
用UltraEdit打开数据文件,将文件定位18000h处(以二进制方式打开,如果没有用二进制打开,可以使用CTRL+H快捷键切换)。根据上面的计算,可以得出,我们要找到记录在18000h和1C000h之间。
Number类型123在数据库存放方式为03C20218,03表示占有三位,C2表示最高位是百位,02表示最高位上是1,18表示低位上是23。(如果对Oracle的基本数据类型的存储格式感兴趣,可以参考我在论坛上的帖子)
用ORACLE8i修复数据库坏块的三种方法
在进行SUN CLUSTER双机切换、意外断电或其它情况下,有时会发生共享盘MOUNT不上的情况,需要使用FSCK对共享盘进行修复。
修复完成后,在数据库启动过程中,却又出现“数据块损坏,无法启动数据库”的现象,此时,可以根据不同的数据块损坏类型,检测并修复错误。
在此介绍三种使用Oracle8i修复损坏数据块的方法。
一、数据块损坏,错误代码为ORA-01578ORA-1115 I/O ERROR READING BLOCK通常后跟ORA-737X错误与操作系统错误(如UNIX中的错误号5)产生原因:1.硬件问题(磁盘控制器问题或磁盘问题)2.物理级的数据块损坏(通常由前一原因造成)3.处理巨型文件时,后跟错误代码ORA-7371确定故障原因与恢复的方法:1.查看alert.log文件中其它ORA-1115错误的发生情况:1) 如果指向不同磁盘的文件,则是磁盘控制器的问题,查看V$DATAFILE,有哪些文件位于该控制器下,转到第二步。
2) 如果指向相同磁盘的不同文件,则是磁盘的问题,转到第二步。
3) 如果指向同一个文件,执行以下语句查找文件名:SELECT SEGMENT_NAME,SEGMENT_TYPE FROM DBA_EXTENTSWHERE FILE_ID=<文件号> AND <块号> BETWEEN BLOCK_IDAND BLOCK_ID+BLOCKS-1;其中,文件号与块号是ORA-1115中指出的,如果该查询持续指向某表或索引,则重建它们即可。
2.如果文件是SYSTEM表空间,或处于NOARCHIVELOG模式,关闭数据库,转到第四步。
3.如果数据库处于ARCHIVELOG模式,仍应关闭数据库,如果不能关闭数据库,则将相应的数据文件脱机:ALTER DATABASE DATAFILE '文件名' OFFLINE;4.试着将数据文件拷贝到别的磁盘。
Oracle错误代码详解及解决方式
Oracle错误代码详解及解决方式ORA-00001: 违反唯一约束条件 (.)错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。
ORA-00017: 请求会话以设置跟踪事件ORA-00018: 超出最大会话数ORA-00019: 超出最大会话许可数ORA-00020: 超出最大进程数 ()ORA-00021: 会话附属于其它某些进程;无法转换会话ORA-00022: 无效的会话 ID;访问被拒绝ORA-00023: 会话引用进程私用内存;无法分离会话ORA-00024: 单一进程模式下不允许从多个进程注册ORA-00025: 无法分配ORA-00026: 丢失或无效的会话 IDORA-00027: 无法删去当前会话ORA-00028: 您的会话己被删去ORA-00029: 会话不是用户会话ORA-00030: 用户会话 ID 不存在。
ORA-00031: 标记要删去的会话ORA-00032: 无效的会话移植口令ORA-00033: 当前的会话具有空的移植口令ORA-00034: 无法在当前 PL/SQL 会话中ORA-00035: LICENSE_MAX_USERS 不能小于当前用户数ORA-00036: 超过递归 SQL () 级的最大值ORA-00037: 无法转换到属于不同服务器组的会话ORA-00038: 无法创建会话: 服务器组属于其它用户ORA-00050: 获取入队时操作系统出错ORA-00051: 等待资源超时说明:如果Oracle在等待资源时出现超时错误,会触发此异常。
ORA-00052: 超出最大入队资源数 ()ORA-00053: 超出最大入队数ORA-00054: 资源正忙,要求指定 NOWAIT英文解析:resource busy and acquire with NOWAIT specified 错误解析:表被锁住了,要不等待表解锁,要不就去kill了它。
oracle数据库掉电损坏的一些处理经验
当oracle数据库非正常关闭时,可能面临无法启动或无法登陆的问题,其中部分原因是数据库文件损坏所致,如果数据库没有使用备份机制或运行于非归档模式下时,系统数据文件的损坏往往难以完全恢复,本文就经常遇到数据库数据文件损坏,总结了此类问题处理的常用方法。
一、检查数据文件、控制文件、日志文件是否有损坏。
1.查看文件$ORACLE_BASE/admin/dbname/bdump/alert_orasid.log中是否有文件损坏信息,类似如下信息:ORA-01578: ORACLE data block corrupted (file # 7, block # <BLOCK>;)ORA-01110: data file <AFN>;: '/oracle1/oradata/V920/oradata/V816/users01.dbf'通过file#和<AFN>找到损坏数据文件和文件类型,然后通过损坏的文件类型确认采用的恢复策略。
2.可以使用dbv检查数据文件(不适用于日志文件),应注意使用dbv检查数据文件时应对损坏数据库文件进行备份,dbv会修改数据文件中部分内容。
被检查的数据文件应为脱机状态。
dbv命令含义:关键字描述(Default)----------------------------------------------------FILE 待检测文件名(NONE)START 起始文件块(First Block of File)END 终止文件块(Last Block of File)BLOCKSIZE 逻辑块大小(8192)LOGFILE 输出日志文件(NONE)FEEDBACK 显示进度(0)PARFILE 参数文件(NONE)USERID 用户名/密码(NONE)SEGMENT_ID Segment ID (tsn.relfile.block) (NONE)HIGH_SCN Highest Block SCN To Verify (NONE)(scn_wrap.scn_base OR scn)常用到的参数有:FILE、BLOCKSIZE。
总结了10种_Oracle_文件损坏及恢复的过程
总结了10种_Oracle_文件损坏及恢复的过程Oracle数据库是一个关系数据库管理系统(RDBMS),用于存储和管理大量结构化数据。
然而,由于各种原因,Oracle数据库文件可能会损坏,这可能导致数据库无法正常工作。
为了解决这个问题,需要进行文件的恢复过程。
下面总结了10种Oracle文件损坏及恢复的常见过程:1.数据文件丢失:如果数据文件丢失,可以从最近的备份还原数据文件,并进行恢复。
2. 数据文件坏块:在Oracle数据库中,可以使用DBVERIFY工具来检查数据文件的坏块。
如果坏块小部分,可以使用RMAN进行恢复。
如果坏块较多,可能需要考虑重新创建数据文件。
3.日志文件丢失:如果日志文件丢失,可以使用备份中的归档日志文件进行恢复。
如果没有备份,可以使用增量备份或物理备份进行恢复。
4.日志文件坏块:使用DBVERIFY工具可以检查日志文件的坏块。
如果发现坏块,可以尝试使用RMAN进行恢复,或者由管理员手动修复坏块。
5.控制文件丢失:如果控制文件丢失,可以从备份中还原控制文件,并使用RECOVER命令进行数据库恢复。
6.控制文件坏块:使用DBVERIFY工具检查控制文件的坏块。
如果找到坏块,可以使用备份恢复控制文件,或者手动修复坏块。
7.数据库文件或表空间重命名:如果数据库文件或表空间被重命名,可以使用ALTERDATABASERENAME命令更改文件或表空间的名称。
8. 恶意软件或数据损坏:如果Oracle数据库中的数据被恶意软件感染或损坏,必须进行杀毒和修复操作。
首先,应使用杀毒软件对系统进行全面扫描,以确保杀死所有恶意软件。
然后,可以使用RMAN进行数据恢复。
9.操作错误:有时,由于误操作或错误的命令,数据库文件可能会被损坏。
在这种情况下,可以从备份中还原损坏的文件,并执行相关的恢复操作。
10. 数据库崩溃:如果Oracle数据库发生崩溃,可能需要使用RMAN 进行恢复。
首先,必须使用备份进行数据库重建,然后使用RMAN进行恢复。
oracle数据库出现坏块问题该如何解决
oracle数据库出现坏块问题该如何解决
Oracle数据库是甲骨文公司的一款关系数据库管理系统,目前在数据库市场上仍占有主要份额,很多企业在使用Oracle数据库的过程中,经常会遇到数据库坏块的问题。
很多用户就会疑问了,Oracle数据库坏块问题具体指什么了?我们又该如何解决数据库坏块问题呢?
很多不了解Oracle数据库的用户都不清楚数据库具体的结构,从而对其出现的故障也无从下手。
其实,数据库的数据块有固定的格式和结构,分三层:cache layer、transaction layer、data layer。
在我们对数据块进行读取写入操作的时候,数据库会对要读写的数据块做一致性的检查,其中包括:数据块的类型、数据块的地址信息、数据块的SCN号以及数据块的头部和尾部。
如果发现其中有不一致的信息,那数据库就会标记这个数据块为坏块了。
当数据库出现坏块情况时,数据库的告警日志文件里面会存在一些报错信息,用户可以根据这些信息判断数据库是否存在坏块问题。
当Oracle数据库出现坏块问题后,可能会对数据字典表、回滚段表、临时段、用户数据表和索引等内容造成一定的影响,所以当Oracle数据库出现坏块问题后,用户需要立即采取相应措施解决坏块问题。
坏道处理的方法比较复杂,针对不同原因造成的坏道问题,处理的方法也各有不同,所以对于用户来说,解决Oracle数据库坏道问题是一个难点,一旦处理不当,可能会对Oracle 数据库造成二次破坏,造成用户更大的损失。
所以当用户出现Oracle数据库坏块问题后,要立刻咨询专业的数据恢复机构,让专业的数据库恢复专家帮助修复数据库,解决数据丢失的烦恼。
数据库坏块(ORA-01578)的解决方法
数据库坏块(ORA-01578)的解决方法
乐兵
【期刊名称】《铁路计算机应用》
【年(卷),期】2004(013)009
【摘要】针对当前Oracle数据库经常出现的数据库坏块错误(ORA-01578),分析问题的起因及影响,并根据实际经验提出两套具体的解决方法:错误陷阱设置法和ROWID检测法.给出具体命令以及提示信息,对于数据库管理员的日常检测和故障处理可以起一定的参考作用.
【总页数】3页(P49-51)
【作者】乐兵
【作者单位】郑州铁路分局,信息技术分处,郑州,450052
【正文语种】中文
【中图分类】TP338
【相关文献】
1.如何处理Oracle数据库中的坏块问题 [J], 陈宇
2.解决"军卫一号"系统数据库坏块的方法 [J], 何其才;曹婷
3.ORACLE8I数据库中数据坏块的解决方法 [J], 徐正雄;王玲;王洪强
4.基于Unix的Oracle数据库坏块分析与研究 [J], 张引琼
5.中型三甲医院Oracle数据库坏块恢复方法探讨 [J], 康季槐; 陈敏; 梁毅; 李文超因版权原因,仅展示原文概要,查看原文内容请购买。
使用
使用 exp来检查坏块,以及如何修复坏块如何使用exp来检查坏块,以及如何修复坏块CREATE TABLESPACE test DATAFILE '/u01/test_data.dbf' size 5M;在表空间创建一张表create table scott.test (id number,name varchar2(20)) TABLESPACE test ;插入大量数据declarebeginfor n_row in 1..100000 loopinsert into scott.test values(n_row,to_char(n_row));end loop;commit;end;使用UE编辑器修改二进制文件模拟损坏导出test表exp scott/oracle tables=test file=test.dmpEXP-00056: ORACLE error 1578 encounteredORA-01578: ORACLE data block corrupted (file # 6, block # 178)ORA-01110: data file 6: '/u01/test_data.dbf'Export terminated successfully with warnings.使用exp/imp恢复在这种情况下肯定会造成数据的丢失,在这种情况下应采取将数据导出然后重建表再进行导入的方法,来尽量恢复损坏数据块中的数据,但是在有坏块的情况下是不允许导出的,如下命令:Exp test/test file=t.dmp tables=t;导出命令在执行中会报ORA-01578错误,在这错误提示中会提示那个文件号的文件以及这个文件中的哪个块被损坏,如:ORA—01578:ORACLE数据块损坏(文件号4,块号35)针对以上的提示首先查询那些对象被损坏:Select tablespace_name,segment_type,owner,segment_name From dba_extents Where file_id=6 and 178 between block_id and block_id+blocks-1;如果被损坏的块是索引,通常可以通过索引重建来解决,如果损坏的是数据(segment_type为table),那么通过设置如下内部事件使得Exp操作跳过坏块。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ORACLE坏块(ORA-01578)处理方法文章分类:数据库0.模拟出现坏块环境SQL> CREATE TABLESPACE "TEST"2 LOGGING3 DATAFILE 'D:\ORACLE\ORADATA\ALAN\TEST.ora' SIZE 1M EXTENT4 MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO5 /表空间已创建。
SQL> create user alantest identified by alantest2 default tablespace test3 temporary tablespace temp;用户已创建SQL> grant dba to alantest;授权成功。
SQL> connect alantest/alantest已连接。
SQL> show userUSER 为"ALANTEST"SQL> create table test_alan as select * from dba_objects;RMAN> backup database format='c:\rmanbackup\FULL_%U';启动 backup 于 07-7月 -06正在使用目标数据库控制文件替代恢复目录分配的通道: ORA_DISK_1通道 ORA_DISK_1: sid=18 devtype=DISK通道 ORA_DISK_1: 正在激活 full 数据文件备份集通道 ORA_DISK_1: 正在指定备份集中的数据文件在备份集中包含当前的 SPFILE备份集中包括当前控制檔输入数据文件 fno=00001 name=D:\ORACLE\ORADATA\ALAN\SYSTEM01.DBF输入数据文件 fno=00002 name=D:\ORACLE\ORADATA\ALAN\UNDOTBS01.DBF 输入数据文件 fno=00003 name=D:\ORACLE\ORADATA\ALAN\INDX01.DBF输入数据文件 fno=00005 name=D:\ORACLE\ORADATA\ALAN\USERS01.DBF输入数据文件 fno=00004 name=D:\ORACLE\ORADATA\ALAN\TOOLS01.DBF输入数据文件 fno=00006 name=D:\ORACLE\ORADATA\ALAN\CATTAB01.DBF输入数据文件 fno=00007 name=D:\ORACLE\ORADATA\ALAN\TEST.ORA通道 ORA_DISK_1: 正在激活段 1 于 07-7月 -06通道 ORA_DISK_1: 已完成段 1 于 07-7月 -06段 handle=C:\RMANBACKUP\FULL_0JHNJ63P_1_1 comment=NONE通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:38完成 backup 于 07-7月 -06SQL> shutdown immediate数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
使用编辑工具修改数据文件生成坏块C:\>dbv file=D:\ORACLE\ORADATA\ALAN\TEST.ora blocksize=8192DBVERIFY: Release 9.2.0.6.0 - Production on 星期五 7月 7 14:53:46 2006 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.DBVERIFY - 验证正在开始 : FILE = D:\ORACLE\ORADATA\ALAN\TEST.ora标记为损坏的页12***Corrupt block relative dba: 0x01c0000c (file 7, block 12)Bad check value found during dbv:Data in bad block -type: 6 format: 2 rdba: 0x01c0000clast change scn: 0x0000.0007bc14 seq: 0x1 flg: 0x04consistency value in tail: 0xbc140601check value in block header: 0x91ea, computed block checksum: 0x110e spare1: 0x0, spare2: 0x0, spare3: 0x0***DBVERIFY - 验证完成检查的页总数:128处理的页总数(数据):77失败的页总数(数据):0处理的页总数(索引):0失败的页总数(索引):0处理的页总数(其它):16处理的总页数 (段) : 0失败的总页数 (段) : 0空的页总数:34标记为损坏的总页数:1汇入的页总数:0Highest block SCN : 506930 (0.506930)1.对相关的表进行操作:SQL> select * from alantest.test_alan where rownum=1234;select * from alantest.test_alan where rownum=1234*ERROR 位于第 1 行:ORA-01578: ORACLE 数据块损坏(文件号7,块号12)ORA-01110: 数据文件 7: 'D:\ORACLE\ORADATA\ALAN\TEST.ORA'SQL> select count(*) from alantest.test_alan;select count(*) from alantest.test_alan*ERROR 位于第 1 行:ORA-01578: ORACLE 数据块损坏(文件号7,块号12)ORA-01110: 数据文件 7: 'D:\ORACLE\ORADATA\ALAN\TEST.ORA'2. 检查alter.log出现的报错信息Corrupt block relative dba: 0x01c0000c (file 7, block 12)Bad check value found during buffer readData in bad block -type: 6 format: 2 rdba: 0x01c0000clast change scn: 0x0000.0007bc14 seq: 0x1 flg: 0x04consistency value in tail: 0xbc140601check value in block header: 0x91ea, computed block checksum: 0x91a spare1: 0x0, spare2: 0x0, spare3: 0x03. 确定坏块的对象是什么?SQL> select tablespace_name,segment_type,segment_name,owner fromdba_extents2 where file_id=7 and 12 BETWEEN block_id AND block_id+blocks-1; TABLESPACE_NAME SEGMENT_TYPE SEGMENT_NAME OWNERTEST TABLE TEST_ALAN ALANTESTa. file# block# 可以从错误信息中得到b. 如果是temp檔中出现坏块是没有记录返回的c. 通常容易出现坏块的对象有:数据字典(system表空间) 回滚段临时段联机日志索引或者分区索引表4. 如果通过返回的结果确定坏的是索引段只要把这个索相删除然后重建一下就可以了如果出现坏的是表段请继续往下看5. 具体解决办法A. 恢复数据文件方法前提要求:a.数据库为归档方式b.有完整的物理备份步骤:(1) offline受影响的数据文件执行以下的语句:ALTER DATABASE DATAFILE 7 OFFLINE;(2) 把旧的数据文件保存后移除(3) 恢复数据文件执行以下语句:RESTORE DATAFILE 7;RECOVER DATAFILE 7;(4) Online恢复后的数据文件执行以下的语句:ALTER DATABASE DATAFILE 7 ONLINE;B.只恢复坏的block(9i以上版本可用)前提要求:a.要求数据库版本是9.2.0以上b.数据库为归档方式c.有完整的物理备份步骤:(1) 使用RMAN的BLOCKRECOVER命令:Rman>run{blockrecover datafile 7 block 12;}RMAN> blockrecover datafile 7 block 12;启动 blockrecover 于 07-7月 -06正在使用目标数据库控制文件替代恢复目录分配的通道: ORA_DISK_1通道 ORA_DISK_1: sid=16 devtype=DISK通道 ORA_DISK_1: 正在恢复块通道 ORA_DISK_1: 正在指定要从备份集恢复的块正在恢复数据文件 00007 的块通道 ORA_DISK_1: 已从备份段 1 恢复块段 handle=C:\RMANBACKUP\FULL_0JHNJ63P_1_1 tag=TAG20060707T132408params=NULL通道 ORA_DISK_1: 块恢复已完成正在开始介质的恢复完成介质的恢复完成 blockrecover 于 07-7月 -06可以强制使用某个SCN号之前的备份来恢复数据块Rman>run{blockrecover datafile 7 block 12 restore until sequence 8505; }C.通过ROWID RANGE SCAN 保存资料步骤:(1) 通过file# block# 查出出现坏块的objectSQL> select tablespace_name,segment_type,segment_name,owner fromdba_extents2 where file_id=7 and 12 BETWEEN block_id AND block_id+blocks-1; TABLESPACE_NAME SEGMENT_TYPE SEGMENT_NAME OWNERTEST TABLE TEST_ALAN ALANTEST(2) 构造坏块的ROWIDSQL> SELECT DATA_OBJECT_ID FROM dba_objects whereobject_name='TEST_ALAN' and owner='ALANTEST';DATA_OBJECT_ID--------------6627SQL> SELECT dbms_rowid.rowid_create(1,6627,7,12,0) from DUAL;DBMS_ROWID.ROWID_C------------------AAABnjAAHAAAAAMAAASQL> SELECT dbms_rowid.rowid_create(1,6627,7,13,0) from DUAL;DBMS_ROWID.ROWID_C------------------AAABnjAAHAAAAANAAAOracle的物理扩展ROWID有18位每位采用64位编码分别用A~Z、a~z、0~9、+、/共64个字符表示A表示0,B表示1,……Z表示25,a表示26,……z表示51,0表示52,……,9表示61,+表示62,/表示63 .ROWID具体划分可以分为4部分。