共计 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 行业资讯频道,更多相关知识等着你来学习!