暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle故障处理秘籍(三)

呆呆的私房菜 2025-02-28
46
    Whoami:5年+金融、政府、医疗领域工作经验的DBA
    Certificate:PGCM、OCP、YCP
    Skill:Oracle、Mysql、PostgreSQL、国产数据库
    Platform:CSDN、墨天轮、公众号(呆呆的私房菜)
    复制
    阅读本文可以了解Oracle常见故障及解决办法,帮助DBA快速排查和解决生产故障问题。


    01

    空间问题
    • 现象1:SYSAUX表空间满了,但是没有存储可以扩容。
    • 原因:业务表存放在SYSAUX或一些辅助表的空间太大。
    • 解决方法:检查SYSAUX表空间对象情况,定位哪些对象占用大量空间,判断是否可以清理。
      SYSAUX表空间不可用时,数据库核心功能还是可以继续运行的,只不过存放在SYSAUX表空间里的功能使用会受限。
      col segment_name format a30
      col segment_type format a30
      set linesize 300
      select OWNER, SEGMENT_NAME, SEGMENT_TYPE, BYTES/1024/1024/1024 GB 
      from dba_segments
      where TABLESPACE_NAME='SYSAUX'
      order by 4;
      复制
      • 现象2:临时表空间使用过度,需要使用临时表空间的SQL运行缓慢。
      • 原因:部分SQL大量使用了临时段。
      • 解决方法:
        1. 查看单节点临时表空间使用情况
        SELECT A.tablespace_name tablespace,
               D.mb_total,
               SUM(A.used_blocks * D.block_size) / 1024 / 1024 mb_used,
               D.mb_total - SUM(A.used_blocks * D.block_size) / 1024 / 1024 mb_free
          FROM v$sort_segment A,
               (SELECT B.name, C.block_size, SUM(C.bytes) / 1024 / 1024 mb_total
                  FROM v$tablespace B, v$tempfile C
                 WHERE B.ts# = C.ts#
                 GROUP BY B.name, C.block_size) D
         WHERE A.tablespace_name = D.name
         GROUP by A.tablespace_name, D.mb_total;
         
         2. 查询会话使用临时段的情况
         SELECT S.sid || ',' || S.serial# sid_serial,
               S.username,
               S.osuser,
               P.spid,
               S.module,
               S.program,
               s.sql_id
               SUM(T.blocks) * TBS.block_size / 1024  mb_used,
               T.tablespace,
               COUNT(*) sort_ops
          FROM v$sort_usage T, v$session S, dba_tablespaces TBS, v$process P
         WHERE T.session_addr = S.saddr
           AND S.paddr = P.addr
           AND T.tablespace = TBS.tablespace_name
         GROUP BY S.sid,
                  S.serial#,
                  S.username,
                  S.osuser,
                  P.spid,
                  S.module,
                  S.program,
                  TBS.block_size,
                  T.tablespace
         ORDER BY sid_serial;
         
         3. 如果确认是由于某些会话过度使用临时段引发,与业务确认后kill会话
         alter system kill session '<sid>,<serial#>' immediate;
         
         4. 如果确认这些会话使用的临时段空间属正常,则加大临时表空间
         alter tablespace TEMP add tempfile '/xx/xx/tempxx.dbf' size 5GB;
        复制
        • 现象3:undo表空间无法自动扩展,后台日志报ORA-1628:max extents reached for rollback segment错误,致使数据库调度任务无法完成。
        • 原因:回滚段的max extents达到了参数设置的最大值,造成不能分配下一个extent。
        • 解决方法:
          1. 分析trace文件,定位到运行的大事务,针对该大事务进行分解,减少对UNDO表空间资源的需求量;
          2. 扩容undo表空间的大小
          复制

          02

          执行计划问题
          • 现象:SQL执行计划发生变化,导致SQL运行缓慢。
          • 原因:统计信息变化 或 SQL语句变化。
          • 解决方法:
            1. 通过sql_id确定统计信息是否一致(如下语句会将AWR中所有信息查找出来)
            set lines 155
            col execs for 999,999,999
            col avg_etime for 999,999.999
            col avg_lio for 999,999,999.9
            col begin_interval_time for a30
            col node for 99999
            break on plan_hash_value on startup_time skip 1
            select ss.snap_id,
                   ss.instance_number node,
                   begin_interval_time,
                   sql_id,
                   plan_hash_value,
                   nvl(executions_delta, 0) execs,
                   (elapsed_time_delta
                   decode(nvl(executions_delta, 0), 01, executions_delta))  1000000 avg_etime,
                   (buffer_gets_delta
                   decode(nvl(buffer_gets_delta, 0), 01, executions_delta)) avg_lio,
                   (disk_reads_delta
                   decode(nvl(buffer_gets_delta, 0), 01, executions_delta)) avg_pio
              from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
             where sql_id = nvl('&sql_id''5xqs2g5tmnk82')
               and ss.snap_id = S.snap_id
               and ss.instance_number = S.instance_number
               and s.instance_number like nvl('&instance_number', s.instance_number)
               and executions_delta > 0
             order by 1, 2, 3
            /


            2. 如果统计信息不一致,需要检查统计信息是否是最新,如果统计信息更新时间比较久了,则手动收集统计信息。
            3. 如果统计信息正常,检查相关业务表数据量是否大幅增加。
            4. 如果数据量大幅增加,则需要考虑清理数据或做SQL优化。
            复制

            03

            动态采样问题
            • 现象:SQL在执行过程中异常缓慢,查看执行计划后发现,SQL在执行过程中采用了动态采样。
              Note
              -----
                 - dynamic sampling used for this statement
              复制
              • 原因:动态采样是Oracle的一个特性,用于在没有统计信息的情况下,自动收集相关表的统计信息。但也存在某些特殊情况下会仍用动态采用,从而引起执行效率低下。
              • 解决方法:禁用动态采样
                1. 禁用动态采样
                select /*+dynamic_sampling(t 0) */
                2. 如果命中bug 9272549,则及时更新补丁。
                复制


                本文内容就到这啦,阅读完本篇,相信你已经掌握如何正确处理Oracle故障问题了吧!我们下篇再见!


                点击上方公众号,关注我吧!

                文章转载自呆呆的私房菜,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论