zoukankan      html  css  js  c++  java
  • 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表空间。

  • 相关阅读:
    Scala Ant Tasks
    Git挂钩
    读写文件
    DC10用CSS定位控制网页布局
    table设置colspan属性,列宽显示错位解决方法
    ATM和购物商城-错题集
    python 函数参数多种传递方法
    python 函数 初学
    python 集合 gather
    元组 字体高亮 购物车练习
  • 原文地址:https://www.cnblogs.com/downpour/p/3096301.html
Copyright © 2011-2022 走看看