ORACLE数据库中出现ora

89次阅读
没有评论

共计 3970 个字符,预计需要花费 10 分钟才能阅读完成。

这篇文章主要介绍了 ORACLE 数据库中出现 ora-1578 错误怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

测试环境中一台装有 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.trc

Oracle 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.0

System name: AIX

Node name: data2

Release: 3

Version: 5

Machine: 00CE993C4C00

Instance name: soa

Redo thread mounted by this instance: 1

Oracle process number: 11

Unix process pid: 307366, p_w_picpath: 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.212

Hex dump of (file 3, block 49259)

Dump of memory from 0x07000000C5934000 to 0x07000000C5936000

7000000C5934000 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。

分析:一般在进行 CLUSTER 双机切换、意外断电或其它情况下,有时会发生某个共享盘 MOUNT 不上的情况,需要使用 FSCK 对共享盘进行修复,然后再 MOUNT. 当修复完成后,顺利的话数据库可以直接起来,否则在数据库启动过程中就会报出 数据块损坏,无法启动数据库 的现象。此时,我们可以根据不同的数据块损坏类型,检测并修复错误并确定解决问题的方案。

一、数据块损坏产生原因:

1. 硬件问题(磁盘控制器问题或磁盘本身故障问题)

2. 物理级的数据块损坏(通常由前一原因造成)

3、逻辑的数据块损坏

二、坏块的原理分析:

Oracle 的数据块有固定的格式和结构,分三层:Cache layer、Transaction layer 和 Data layer.

对数据块进行读写操作时,做一致性检查:

–Block type

–DBA

–Scn

–Header and tail

发现不一致,标记为坏块。坏块有两种:物理坏块和逻辑坏块。坏块产生的影响:数据字典表、回滚段表、临时段和用户数据表和索引。

三、确定故障原因与对应的解决办法:

1、查看 alert.log 文件中,还有无其它 ORA- 的错误,如果报错指向不同磁盘的文件,则是磁盘控制器的问题,查看 V$DATAFILE,看有哪些文件位于该控制器下,需要查找磁盘控制器 (一般控制器有两个 A 控和 B 控) 是否正常。

2、如果报错指向相同磁盘的不同文件,则是磁盘的问题,需要查看磁盘有无报警,LVM 有无报错等。

3、如果指向相同磁盘的同一个文件,则可以执行以下语句查找文件名:

SELECT SEGMENT_NAME,SEGMENT_TYPE FROM DBA_EXTENTS WHERE FILE_ID= 文件号 AND 块号 BETWEEN BLOCK_ID AND BLOCK_ID+BLOCKS-1;

其中,文件号与块号在报错日志中可以查到,如果该查询持续指向某表或索引,则重建它们即可。

4、如果文件是 SYSTEM 表空间,或处于 NOARCHIVELOG 模式,在数据库还在运行状态时,EXP 导出全部数据,重建库,再 IMP 灌入新库即可。

5、如果数据库处于 ARCHIVELOG 模式,可以使用 DBV 校验坏块,然后通过 RMAN 来修复坏块,成功后启动数据库。

    或者另一种方案

    关闭数据库,如果不能关闭数据库,则将相应的数据文件脱机:

   ALTER DATABASE DATAFILE 文件名 OFFLINE;

  试着将数据文件拷贝到别的磁盘。如果拷贝失败,则文件将丢失。

  然后 STARTUP MOUNT; 

  将数据文件重命名为成功拷贝到别的磁盘的文件名

  ALTER DATABASE RENAME FILE 老路径文件名 TO 新路径文件名

  ALTER DATABASE OPEN;

  RECOVER DATAFILE 文件名;

  ALTER DATABASE DATAFILE 文件名 ONLINE;

四、本例的解决办法

  由于本案例中,数据库有备份和归档且备份可用,所以使用 rman 命令修复坏块

先 DBV 校验坏块

$show parameter  db_block_size
$select BYTES/2048 from v$datafile where FILE#=3;
$dbv file=/app/oracle/product/10.2.0/oradata/soa/user01.dbf blocksize=8192

$rman target /

恢复管理器: Release 10.2.0.1.0 – Production on 星期五 3 月 1 15:07:14 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

连接到目标数据库: soa (DBID=1281151392)

RMAN blockrecover datafile 3 block 49259;

启动 blockrecover 

使用目标数据库控制文件替代恢复目录

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=187 devtype=DISK

通道 ORA_DISK_1: 正在恢复块

通道 ORA_DISK_1: 正在指定要从备份集恢复的块

正在恢复数据文件 049259 的块

通道 ORA_DISK_1: 正在读取备份段 ORACLE\FLASH_RECOVERY_AREA\DB01\BACKUPSET

\2013_02_28\O1_MF_NNNDF_TAG201302287_3\YCS579G_.BKP

通道 ORA_DISK_1: 已从备份段 1 恢复块

通道 ORA_DISK_1: 块恢复完成, 用时: 00:00:02

正在开始介质的恢复

介质恢复完成, 用时: 00:00:05

完成 blockrecover 于 1-3-13

RMAN exit

恢复管理器完成。

SQL select count(*) from buffer.t;

  COUNT(*)

———-

      3298 

坏块修复后,并不会更新 v$database_block_corruption,需要下次备份的时候更新

SQL select * from  v$database_block_corruption;

     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO

———- ———- ———- —————— ———

         3     49259          1                  0 CHECKSUM

$rman target /

恢复管理器: Release 10.2.0.1.0 – Production on 星期日 3 月 1 16:09:43 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

连接到目标数据库: soa (DBID=1281151392)

RMAN backup validate datafile 3;

启动 backup 

使用目标数据库控制文件替代恢复目录

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=132 devtype=DISK

通道 ORA_DISK_1: 启动全部数据文件备份集

通道 ORA_DISK_1: 正在指定备份集中的数据文件

通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03

完成 backup 于 1-3-13

RMAN exit

恢复管理器完成。

SQL select * from  v$database_block_corruption;

未选定行

注:如果数据库没有备份的话,可以考虑使用 dbms_repair 包来补救,但是会丢数据库。

至此数据库恢复完成,再次重启已正常。

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“ORACLE 数据库中出现 ora-1578 错误怎么办”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计3970字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)