Whoami:5年+金融、政府、医疗领域工作经验的DBACertificate:PGCM、OCP、YCPSkill:Oracle、Mysql、PostgreSQL、国产数据库Platform:CSDN、墨天轮、公众号(呆呆的私房菜)
现象1:SYSAUX表空间满了,但是没有存储可以扩容。 原因:业务表存放在SYSAUX或一些辅助表的空间太大。 解决方法:检查SYSAUX表空间对象情况,定位哪些对象占用大量空间,判断是否可以清理。
SYSAUX表空间不可用时,数据库核心功能还是可以继续运行的,只不过存放在SYSAUX表空间里的功能使用会受限。col segment_name format a30col segment_type format a30set linesize 300select OWNER, SEGMENT_NAME, SEGMENT_TYPE, BYTES/1024/1024/1024 GBfrom dba_segmentswhere 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_freeFROM v$sort_segment A,(SELECT B.name, C.block_size, SUM(C.bytes) / 1024 / 1024 mb_totalFROM v$tablespace B, v$tempfile CWHERE B.ts# = C.ts#GROUP BY B.name, C.block_size) DWHERE A.tablespace_name = D.nameGROUP 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_idSUM(T.blocks) * TBS.block_size / 1024 mb_used,T.tablespace,COUNT(*) sort_opsFROM v$sort_usage T, v$session S, dba_tablespaces TBS, v$process PWHERE T.session_addr = S.saddrAND S.paddr = P.addrAND T.tablespace = TBS.tablespace_nameGROUP BY S.sid,S.serial#,S.username,S.osuser,P.spid,S.module,S.program,TBS.block_size,T.tablespaceORDER 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表空间的大小
现象:SQL执行计划发生变化,导致SQL运行缓慢。 原因:统计信息变化 或 SQL语句变化。 解决方法:
1. 通过sql_id确定统计信息是否一致(如下语句会将AWR中所有信息查找出来)set lines 155col execs for 999,999,999col avg_etime for 999,999.999col avg_lio for 999,999,999.9col begin_interval_time for a30col node for 99999break on plan_hash_value on startup_time skip 1select ss.snap_id,ss.instance_number node,begin_interval_time,sql_id,plan_hash_value,nvl(executions_delta, 0) execs,(elapsed_time_deltadecode(nvl(executions_delta, 0), 0, 1, executions_delta)) 1000000 avg_etime,(buffer_gets_deltadecode(nvl(buffer_gets_delta, 0), 0, 1, executions_delta)) avg_lio,(disk_reads_deltadecode(nvl(buffer_gets_delta, 0), 0, 1, executions_delta)) avg_piofrom DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SSwhere sql_id = nvl('&sql_id', '5xqs2g5tmnk82')and ss.snap_id = S.snap_idand ss.instance_number = S.instance_numberand s.instance_number like nvl('&instance_number', s.instance_number)and executions_delta > 0order by 1, 2, 3/2. 如果统计信息不一致,需要检查统计信息是否是最新,如果统计信息更新时间比较久了,则手动收集统计信息。3. 如果统计信息正常,检查相关业务表数据量是否大幅增加。4. 如果数据量大幅增加,则需要考虑清理数据或做SQL优化。
现象:SQL在执行过程中异常缓慢,查看执行计划后发现,SQL在执行过程中采用了动态采样。
Note------ dynamic sampling used for this statement
原因:动态采样是Oracle的一个特性,用于在没有统计信息的情况下,自动收集相关表的统计信息。但也存在某些特殊情况下会仍用动态采用,从而引起执行效率低下。 解决方法:禁用动态采样
1. 禁用动态采样select /*+dynamic_sampling(t 0) */2. 如果命中bug 9272549,则及时更新补丁。
本文内容就到这啦,阅读完本篇,相信你已经掌握如何正确处理Oracle故障问题了吧!我们下篇再见!

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




