ORACLE_ERR
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
技术研讨
Oracle常见故障的处理方法
文/程国谦
在使用ORACLE的过程中,我们经常会遇到一些ORACLE产生的错误,本人按照自己的理解将ORACLE错误类型进行简单划分,并就各种类型出现比较频繁的错误代码做出分析,希望能够帮助大家找到一个合理解决这些错误的方法。
本文的主要目的不是要告诉大家怎样去解决一个具体的故障,而是希望大家能够在系统出现问题时,能够有的放矢,掌握故障处理的基本思路,确保数据的安全,避免造成数据丢失的严重后果。
1.1 SQL语句错误
SQL语句错误指的是由于SQL语句语法错误所导致的错误,出现类似错误时均有直接提示错误的地方,因此不做详述。这类错误的处理可参考《SQL*Plus User Guide and Reference》。
1.2 一般错误
一般错误包括诸如表空间无法扩展、由于数据库初始化参数设置问题等导致的客户端无法登录或应用无法正常运行等等。
在进行数据库故障检查时需要检查以下内容:
检查数据库错误日志。ORACLE数据库后台出现错误时,数据库的日志文件alert$SID.log文件将详细地记录ORACLE错误代码及错误原因,但对于应用程序
出错则不提供任何错误记录。
使用OS命令(如IBM的errpt、COMPAQ的dia/uerf)进行故障检测,确认是否由于OS的错误导致ORACLE故障,检查OS错误日志。
使用ipcs命令检查信号量和共享内存是否分配正常。
检查UNIX空间使用情况及内存、CPU资源使用情况。
检查数据库相关文件属性。
检查tnsnames.ora、listener.ora、init.ora、config.ora等配置文件。
检查数据库环境变量是否正确。
ORACLE数据库提供了一个简单的ORACLE故障检测命令,$ oerr ora error_no,通过这个命令可以很方便地判断出故障原因;同时这个命令还提供了一个故障解决的建议,通过它可以方便地进行故障处理。(注:ORACLE的故障信息库保存在$ORACLE_HOME/rdbms/mesg目录下)
例1:在ORACLE错误日志中出现ORA-1542错误,处理方式:
$ oerr ora 1542
01542, 00000, "tablespace '%s' is offline, cannot allocate space in it"
// *Cause: Tried to allocate space in an offline tablespace
// *Action: Bring the tablespace online or create the object in
// other tablespace
通过oerr命令我们可以清楚的了解到由于表空间处于offline状态,因而故障解决方法就是online相应的表空间。
例2:ORA-01652错误
$ oerr ora 1652
……
//Cause: Failed to allocate extent for temp segment in tablespace
//Action:Use the ALTER TABLESPACE ADD DATAFILE statement to add one or
more files to the specified tablespace or create the object in another tablespace.
通过oerr命令我们知道由于无法扩展临时表空间导致应用出错,解决方法是增加临时表空间或指定更大的临时表空间。
一般来说系统管理人员可以通过监控应用运行情况、数据库性能指标,并及时调整数据库的初始化参数(如dml_locks、open_cursors、open_links等)、数据据库表空间大小、数据库对象的存储策略以避免出现以上错误影响系统正常运行。
1.3 严重错误
严重错误导致的故障主要包括数据库无法正常启动、数据库出现坏块、数据库需要进行恢复等等。对于数据库的故障处理,最重要的事情是保证数据的安全!因此在进行这种类型的数据库故障处理前,必须注意以下几点:
●如果数据库已经处于打开状态,不要随意关闭数据库;甚至如果某个用户语句已经登录
数据库,不要随意退出;
●保留$ORACLE_BASE/admin/$SID/bdump/alert$SID.log文件中错误信息及与错误信
息相对应的trace文件($ORACLE_BASE/admin/$SID/udump/*.trc);
●分析alert.log文件中出现的主要错误;
●根据实际情况确定是否对数据库进行物理备份(包括数据库控制文件、重做日志文件、
回滚表空间、用户数据表空间,临时表空间不需要进行备份);
●故障处理应从简单到复杂,不要一开始就采用诸如增加ORACLE隐含参数如
_corrupted_rollback_segment等试图强行打开数据库;
●故障处理完毕后,可能需要对数据库进行再次备份;
●增加某些隐含参数强制打开数据库后,可能需要重建数据库;
例1:ORA-01578错误(一般伴随着ORA-01110、ORA-01109等错误)$ oerr ora 1578
……
// Cause:The given data block was corrupted,probably due to program errors
// Action:Try to restore the segment containing the given data block,This may involve dropping the segment and recreating it,If there is a trace file,report the messages recorded in it to customer support.
该错误是ORACLE认为一个数据块可能被破坏而发生的,通常引起该错误的原因有以下几种:
I/O的硬件或firmware损坏
操作系统I/O或cache故障
内存或页交换出错(例如ORA-01578错误伴随ORA-00600[3374]则表明内存出错,通过重新启动主机可能可以解决故障)
部分数据文件被覆盖、试图访问未格式化块、磁盘修复或其他原因
该错误的最佳解决方法(数据库运行在归档模式下)是恢复备份的数据文件及控制文件,执行recover操作。如果数据库运行在非归档模式下或数据库没有进行良好的备份,则:
●查看log以及trace文件,检查是否有其他错误发生
●定位错误
sql>select * from v$datafile where file#=
sql>select owner,segment_name,segment_type from dba_extents
> where file_id=
> block_id and block_id+blocks-1;
基于返回的segment_type:
-segment类型为temporary、cache或无返回值,检查SQL语句
-segment类型为rollback segment,则数据库需要恢复
-segment类型为index,检查其所在的表,重建索引即可
-仍然出现1578错误,数据库需要恢复
-segment类型为表,拯救表中的数据。
●分析一个实体是否存在永久性数据破坏,建议把以下语句多执行一两次,有助
于鉴别该错误是永久性的(磁盘物理损坏)还是随机性的(内存或硬件错误所
引起)。
sql> analyze table validate structure cascade;
sql> analyze table clustername validate structure cascade;
●出现类似错误后需要及时进行数据的恢复(可以采用创建临时表,同时插入损
坏的块前/后的数据或设置skip_corrupted标志忽略损坏数据块并导出数据的
方式进行数据恢复),具体数据恢复方式可参见《ORACLE故障处理手册》等
书,在此不做详述。