博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

oracle 8i RAC数据库常见错误诊断集锦

Posted on 2008-11-30 12:38  徐正柱-  阅读(634)  评论(0编辑  收藏  举报

oracle 8i RAC数据库常见错误诊断集锦

ORA-1652到ORA-1655
     简单地说,ORA-165X错误信息是指表空间没有足够的空间可分配,因此报错。这些错误包括ora-1652、ora-1653、ora-1654和ora-1655。
ORA-165X错误可能是日常维护中最常见的ORACLE错误信息,解决这些错误时需要了解问题产生的环境和条件。实际上,ORACLE将表空间作为逻辑结构单元;而表空间的物理结构是数据文件。数据文件在磁盘上物理地创建,表空间中的所有对象也存于磁盘。为了给表空间增加空间,必须增加数据文件或增加原有数据库文件的大小。
当产生O R A - 1 6 5 X错误信息时,问题可能在于特定表空间缺少可分配的空间。错误信息提供两个参数: S I Z E,提示维护人员系统没有找到Oracle块的数量;而TABLESPACE则提示数据库管理员需要表空间的地方。Oracle总是尽量分配连续空间。尽管有时表空间可能有足够的可分配空间,但如果这些空间是不连续的,错误仍将发生。
有时我们在对某表进行插入操作,却得到其它表空间(即不属于被插入表的表空间)的空间不足错误,这是因为在做插入等操作时可能会使用到系统的数据字典、回滚段、临时段等。以下对象有可能发生空间不足错误。
(1) 数据字典
如果数据字典对象需要扩展但S Y S T E M表空间又没有足够空间可用, O R A _ 1 6 5 x错误就会发生。这种情况下在ORA_165x 错误前先出现O R A _ 6 0 4错误。例如,创建一个表以扩展t a b $而S Y S T E M表空间没有足够的空间,创建的表将得到错误O R A - 6 0 4和O R A _ 1 6 5 x。
(2) 表和索引
如果需要额外空间以满足一个对象的插入或更改,将发生O R A _ 1 6 5 x错误。如果这个错误产生于表或索引的创建时,指定的存储参数或表空间缺省存储参数需要修改。
(3) 回滚段
如果错误发生在回滚段, O R A - 1 6 5 0错误总是在O R A - 1 6 5 x错误之前发生。O R A - 1 6 5 0指出不能扩展回滚段,O R A - 1 6 5 x错误说明了其原因是缺少空间。O R A - 1 6 5 0错误信息如下:
ORA-1650 "unable to extend rollback segment"
(4) 临时段
临时段是Oracle内核创建的,代表用户完成一个排序操作。用户执行的操作(如创建一个索引,执行有ORDER BY字段的查询或较长的连接语句)时有可能导致临时段(通常是建在临时表空间上)不足。
扩展表空间的方法请见本文的如何扩展表空间部分。
      ORA-01555(snapshot too old)
在电信行业这种数据量巨大的环境中,ora-01555错是一个很常见的错误。这个错误使得应用失败。例如,这一错误可能停止一个在深夜运行的批处理任务,随后也使依赖于该任务的其他任务失败。这使用户不能及时得到所需的信息(如报表没打印出来、数据未被导出等等)。尽管这一错误通常发生在大任务上,但在小任务上也会发生。
ORA-1555通常是一个偶然出现的错误。有时在发生了该错误以后,重新运行该任务就有可能不再碰到类似的错误。这个错误最麻烦的是它并不会立刻发生,运行时间长的任务在错误失败以前可能已经运行了一段时间了(可能几个小时)。只是简单地重新运行该任务并不能保证它能成功,可能在运行了一段时间以后仍然失败。
     ORA-1555错的根本原因是因为oracle要保证读一致性。读一致性是指当有多个用户对一个数据块内的行进行修改时,这些块变“脏”或处于变化之中直到被确认。在被确认以前,它们对事务中的所有语句都是可见的,但是对别的事务或语句而言是不可见的。一旦确认以后,对所有后继的事务或语句就都是可见的了。但在事务被确认前的语句不能看到修改,因为这些修改还未发生。
例如,事务T 1(如对某大表的exp操作)在2 2 :0 0开始而事务T 2(如对同一大表的update操作)在2 2 :0 1时开始,因为T 1需遍历一个很大的表,其读取要花很长的时间,而T 2可能对同一个表中的数据进行基于索引的更新操作。这样, T2可能在几秒钟之内完成,而T 1可能要运行很长时间,假定4 0分钟。当T 1到达T 2做过修改的地方时(根据当前的S C N时间戳可以识别出新作的改变),尽管T 2所进行的写已经被确认,但为了保证读一致性,它不会读到修改后的数据,它只访问在2 2 :0 0时的数据,在2 2 :0 1时所做的改变不能被读取 。T 1从回滚段中读取改变前的数据以保证读一致性。但因为事务T2已经提交,T2事务使用的回滚段oracle认为已经可以重新利用,当回滚段太少或事务较密集时,oracle有可能会用新事务覆盖掉原来T2事务的回滚段,这时T1事务读到被T2修改过的数据时,再从回滚段中就无法找到修改前的数据,这时就会报ORA-1555,snapshot too old错。
在9i中,因为引入了undotablespace,只要把undotablespace设的足够大,并把undo_retention设的足够大(大于完成大事务所需的时间),就有可能彻底解决ORA-1555错(但将undotablespace设的太大会引起系统性能下降)。
    ORA-04031
ora-4031错是另外一个oracle常见错。对于较复杂的应用来说,共享池(shared pool)的大小对于Oracle 性能来说都是很重要的。共享池中保存数据字典高速缓冲和完全解析或编译的PL/SQL 块和SQL 语句。当我们在共享池中试图分配大片的连续内存失败的时候,Oracle 首先刷新池中当前没使用的所有对象,使空闲内存块合并。如果仍然没有足够大单个的大块内存满足请求,就会产生ORA-04031 错误。当这个错误出现的时候你得到的错误信息如下:
Error: ORA 4031
Text: unable to allocate %s bytes of shared memory (%s,%s,%s).

以下几个初始化参数会影响这个错误的发生:
shared_pool_size
Shared pool由三部分组成,分别是Dictionary cache(包括数据字典的定义,如表结构、权限等),Library cache(包括共享的sql游标,sql原代码以及执行计划、存储过程和会话信息)和Control structure。它的大小由初始化参数shared_pool_size控制,它的作用是缓存已经被解析过的SQL,使其能被重用,不用再解析。

shared_pool_reserved_size
它的作用是在shared pool中保留一块区域以放置一些大对象(如大型软件包),如不设置此参数,系统缺省保留5%的shared  pool空间用于放置大对象。

Shared_Pool_reserved_alloc
这个参数的值控制保留内存的分配。如果一个足够尺寸的大块内存在共享池空闲列表中没能找到,内存就从保留列表中分配一块比这个值大的空间。默认的值对于大多数系统来说都足够了。如果你加大这个值,那么Oracle 服务器将允许从这个保留列表中更少的分配并且将从共享池列表中请求更多的内存。这个参数在Oracle 8i 以后是隐含参数。

发生ORA-04031错时可以考虑增加以上三个参数的值,特别是shared_pool_size。但如果shared_pool_size参数值已经很大(大于350M),那ORA-4031错发生的原因很可能是因为oracle数据库的BUG或是应用程序未能很好的使用绑定变量(bind variable)。这时应给数据库打最新的patch或调整应用程序(尽可能多的使用绑定变量),而单纯增加shared_pool的大小一般无法解决问题。

还可以用以下SQL查询shared_pool的使用情况,特别注意request_failures值,如果该值不为0,则说明ORA-4031错可能是因为shared_pool中的碎片太多所致。
SELECT free_space, avg_free_size,used_space,
avg_used_size,request_failures, last_failure_size
FROM v$shared_pool_reserved;

这种情况下可以用刷新shared_pool的方式来解决。以sys用户登陆sqlplus.
SQL>alter system flush shared_pool;
注意:
这条命令会清空当前的shared_pool,可以暂时解决ora-4031错的问题,但清空shared_pool后,会引起数据库暂时的性能下降。如果4031错是因为oracle的bug或应用程序写的不好引起的,不断刷新shared_pool并不是好的解决办法。
6.5  ORA-600
ORA-600是比较严重的错误,它属于oracle内部错误,它会在警告日志和跟踪文件中记录错误信息ORA-600,通常数据库还会生成一个core文件或trace文件。如下所示:
Errors in file C:\oracle\ora81\RDBMS\trace\stomedSMON.TRC:
ORA-00600: internal error code, arguments: [4136], [0], [], [], [], [], [], []

ORACLE Instance stomed (pid = 6) - Error 600 encountered while recovering transaction (2, 48).
Wed Feb 25 12:54:38 2004
Errors in file C:\oracle\ora81\RDBMS\trace\stomedSMON.TRC:
ORA-00600: internal error code, arguments: [4136], [0], [], [], [], [], [], []

ORA-600是在基本的正常检查失败时(如企图读取SYS.FET$中不存在的盘区时),由Oracle内核产生的一种内部错误。与其他Oracle错误不同的是,任何两个ORA-600错误不可能指向同一个错误状态。ORA-600表示了各种不同的内部错误。另外, ORA-600错误还可能伴随着其他ORA错误而产生(例如,当系统遇到坏块时,产生ORA-1578错误的同时也会产生ORA-600)。显示ORA-600错误时通常后面带有一组方括号括起来的参数(argument)。根据实际的内部错误,这些参数代表不同的事件。此外,Oracle版本不同,这些参数代表的事件也不同。但是并没有专门文档对此进行说明,通常只能要求Oracle技术支持部的资深分析员进行解释。一般来说,第一个参数提供了实际错误信息(例如1579代表块中断错误),而其他参数提供相关其他信息(例如块中断错误中,显示Oracle想要读的块号和实际读的块号)。
一般而言, ORA-600错误会导致系统生成一个或多个跟踪文件,这些跟踪文件提供了重要的诊断信息。在处理此类错误前,应该尽可能对发生的错误多一些了解,比如:
• 每当错误发生时,其准确的信息或参数(尤其是第一个参数)是什么。
• 在错误期间,系统是否不再反应。
• 在错误期间,系统性能是否受到了负面的影响
• 错误期间有多少活动的工作(活动的会话或进程)。
• 这些活动的工作所运行的是哪种DML /DDL语句。
• 在错误期间有没有后台或前台进程死亡。
• 是否发生了任何不可知的硬件或操作系统故障(可能需要一份OS的所有补丁程序的记
录)。
• 系统生成了多少个跟踪文件(这些文件有可能必须被送交Oracle技术支持部的)。

通常情况下,ora-600错应该提交给oracle公司进行分析,但很多时候为了加快处理时间,我们也可以自己对ora-600错进行分析。分析的方法是将ora-600的错误信息放到metalink(metalink.oracle.com是oracle的技术支持网站,上面有大量的文档和oracle问题处理案例,并提供了强大的查询功能)上进行搜索。如在metalink上输入:
ORA-00600 [4136], [0], [], [], [], [], [], []
然后查询,一般能查到很多类似错误的说明、案例等,根据这些信息,我们也有可能找出发生错误的真正原因,并得到正确的解决方案