Oracle实践:00600[4193]错误导致服务频繁宕掉问题

    问题来源于项目的现网服务器的oracle服务异常宕掉,手动重启后运行一段时间再次宕掉。还好系统未正式投入使用,有充分的时间解决问题。由于是客户的现网服务器出现的问题,不敢轻易操作。经过仔细分析并请oracle的高手来帮助,最终使问题得以顺利解决,未造成不良影响。现记录下来为以后工作中的类似问题提供借鉴。

关键字:oracle 00600: 4193 undo

一、问题发现

环境:RHEL6.0/ORACLE10g

时间:2013.05.20

原因:数据库服务器发生断电。

现象:oracle服务频繁自动宕掉,可手动重启,重启后不足半个小时即宕掉,运行时oracle进程的系统资源占用率持续偏高。

二、问题分析

经过网络搜索,分析此现象可能原因

  1. Oracle数据文件损坏;
  2. 系统资源耗尽将oracle进程停掉;
  3. Oracle版本问题,oracle的bug,需要升级补丁;
  4. 系统Bug导致;
  5. 磁盘损坏。

逐一排查:由于系统已经运行了一段时间,之前未发生过此情况,除服务器发生过一次掉电,未做过其他操作;首先考虑4的可能性较小。对于2需要继续了解系统资源耗尽的原因,进一步判断。经过分析,1和3的可能性较大,同时1和3也可能导致2的出现。如果是5问题就相当悲催了。分析原因当然要从日志入手了。

 

确定oracle版本

安装的版本是10.2,未打过补丁,不能排除此原因。

> select * from v$version;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for Linux: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 – Production

通过日志分析

主要通过alert_sid.log分析,查看/app/oracle/admin/test/bdump/alert_uetap.log发现报错信息。

Errors in file /app/oracle/admin/test/bdump/test_smon_12220.trc:

ORA-00600: internal error code, arguments: [4193], [5158], [5162], [], [], [], [], []

问题判定

通过日志‘ORA-00600: internal error code, arguments: [4193] ’分析,4193错误通常是因为恢复时redo与undo不一致所导致,目前解决方法是重建undo表空间,期待问题可以解决。

三、问题解决

查看磁盘空间使用情况

$ df –h

文件系统              容量  已用  可用 已用%% 挂载点

/dev/sda2             145G  120G   18G  88% /

tmpfs                 1.8G  100K  1.8G   1% /dev/shm

/dev/sda1              97M   27M   66M  29% /boot

/dev/sda5             1.6T   46G  1.4T   4% /data

df: "/root/.gvfs": 权限不够

 

查询数据文件的存储位置

$ ls -lh /data/oradata/test/

总用量 45G

-rw-r----- 1 oracle oinstall 5.1G  5月 22 15:04 sysaux01.dbf

-rw-r----- 1 oracle oinstall  11G  5月 22 15:05 system01.dbf

-rw-r----- 1 oracle oinstall  21G  5月 11 06:00 temp01.dbf

-rw-r----- 1 oracle oinstall 4.9G  5月 22 14:59 test.dbf

-rw-r----- 1 oracle oinstall  21G  5月 22 15:04 undotbs01.dbf

-rw-r----- 1 oracle oinstall 5.1G  5月 22 14:59 users01.dbf

 

查询当前的undo配置参数

SQL> show parameter undo 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS1

 

数据备份

发现问题应第一时间进行数据备份。

注:在操作之前做好备份是很关键的,否则出现问题后果不堪设想。

重做undo表空间过程

1.停止业务程序

2.重建undo表空间

$ su - oracle

$ sqlplus / as sysdba

SQL>create undo tablespace undotbs2 datafile '/data/oradata/test/undotbs2.dbf' size 21504m;

SQL>alter system set undo_tablespace=undotbs2 scope=both; 

SQL>shutdown immediate;

SQL>startup;

SQL>show parameter undo  ----执行结果如下,成功创建的新的undo表空间。

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_management               string      AUTO

undo_retention                    integer     900

undo_tablespace                 string      UNDOTBS2

 

3.删除原有的undo表空间

SQL>drop tablespace undotbs1 including contents and datafiles;

4.启动业务程序

5.观察数据库运行是否正常

查询日志,不再出现ORA-00600: internal error code, arguments: [4193]的错误了,运行也正常了,非常感谢王工程师的帮助和支持,使问题得以快速的定位并顺利解决。

 

Ps:断电的危害很大,如果预知要断电,一定要正确的方式关机来避免悲剧的发生。

附录

1. undo和redo

  • 什么是REDO?

REDO记录transaction logs,分为online和archived。以恢复为目的。 

比如,机器停电,那么在重起之后需要online redo logs去恢复系统到失败点。

比如,磁盘坏了,需要用archived redo logs和online redo logs区恢复数据。 

比如,truncate一个表或其他的操作,想恢复到之前的状态,同样也需要。 

  • 什么是UNDO?

REDO是为了重新实现你的操作,而UNDO相反,是为了撤销你做的操作,比如你得一个TRANSACTION执行失败了或你自己后悔了,则需要用ROLLBACK命令回退到操作之前。回滚是在逻辑层面实现而不是物理层面,因为在一个多用户系统中,数据结构,blocks等都在时时变化,比如我们INSERT一个数据,表的空间不够,扩展了一个新的EXTENT,我们的数据保存在这新的EXTENT里,其它用户随后也在这EXTENT里插入了数据,而此时我想ROLLBACK,那么显然物理上讲这EXTENT撤销是不可能的,因为这么做会影响其他用户的操作。所以,ROLLBACK是逻辑上回滚,比如对INSERT来说,那么ROLLBACK就是DELETE了。

 

2.undo配置信息释义

SQL> show parameter undo

NAME                           TYPE                VALUE

----------------------------------------------------

undo_management                 string            AUTO   

undo_retention                  integer           900

undo_tablespace                 string           UNDOTBS1

 

Undo配置参数含义

-UNDO_MANAGEMENT     undo的管理模式,分自动和手动

-UNDO_TABLESPACE     当前正在被使用的undo表

-UNDO_RETENTION      规定多长时间内,数据不能被覆盖。

----------------------------------------- 

AUTO             表示undo 为自动管理模式。

900               表示在900秒内,undo上的数据不能被覆盖。

UNDOTBS1       是当前正在使用的undo表空间。

posted on 2013-05-27 19:27  不吃鱼的小胖猫  阅读(702)  评论(0编辑  收藏  举报