Whoami:5年+金融、政府、医疗领域工作经验的DBA
Certificate:PGCM、OCP、YCP
Skill:Oracle、Mysql、PostgreSQL、国产数据库
Platform:CSDN、墨天轮、公众号(呆呆的私房菜)
复制
现象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表空间的大小
复制
现象: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), 0, 1, executions_delta)) 1000000 avg_etime,
(buffer_gets_delta
decode(nvl(buffer_gets_delta, 0), 0, 1, executions_delta)) avg_lio,
(disk_reads_delta
decode(nvl(buffer_gets_delta, 0), 0, 1, 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优化。
复制
现象:SQL在执行过程中异常缓慢,查看执行计划后发现,SQL在执行过程中采用了动态采样。
Note
-----
- dynamic sampling used for this statement
复制
原因:动态采样是Oracle的一个特性,用于在没有统计信息的情况下,自动收集相关表的统计信息。但也存在某些特殊情况下会仍用动态采用,从而引起执行效率低下。 解决方法:禁用动态采样
1. 禁用动态采样
select /*+dynamic_sampling(t 0) */
2. 如果命中bug 9272549,则及时更新补丁。
复制
本文内容就到这啦,阅读完本篇,相信你已经掌握如何正确处理Oracle故障问题了吧!我们下篇再见!

文章转载自呆呆的私房菜,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1216次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
739次阅读
2025-03-17 11:33:53
Oracle+Deepseek+Dify 实现数据库数据实时分析
bicewow
647次阅读
2025-03-06 09:41:49
【ORACLE】ORACLE19C在19.13版本前的一个严重BUG-24761824
DarkAthena
541次阅读
2025-03-04 14:33:31
Oracle避坑指南|同名表导出难题:如何精准排除指定用户下的表?
szrsu
502次阅读
2025-03-05 00:42:34
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
437次阅读
2025-03-04 21:56:13
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
436次阅读
2025-03-13 14:38:19
【ORACLE】char类型和sql优化器发生的“错误”反应
DarkAthena
398次阅读
2025-03-04 23:05:01
什么,oracle 主机用户被删了?原来是虚惊一场!
Lucifer三思而后行
393次阅读
2025-03-03 21:12:09
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
322次阅读
2025-03-12 21:27:56