首页 > 数据库 >好烦啊,1个SQL干崩核心系统长达12小时!

好烦啊,1个SQL干崩核心系统长达12小时!

时间:2024-07-05 18:55:16浏览次数:13  
标签:12 -- 分区 索引 好烦 分区表 SQL 执行

作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验,
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、
高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理

微信:jem_db
QQ交流群:587159446
公众号:IT邦德

文章目录

前言

1个SQL干崩核心系统长达12小时!分享一下这次的故障排查过程

1.故障现象

大周末的接到项目组的电话,反馈应用从凌晨4点开始持续卡顿,起初并未关注,到下午2点左右,核心系统是彻底干绷了,远程接入后发现,数据库后台有大量的异常等待事件

enq:TX -index contention
cursor: pin S wait on X
direct path read

通过监控发现服务器IO和CPU使用率已经高达90%
整个数据库算是夯住了!
根据经验判断应该是性能的问题

2.排查过程

2.1 AWR分析

对于这种性能的问题,首先采集到AWR报告并结合ASH报告分析一下

Direct path read事件尽然排到了第一位!占DB time高达63%,这个等待事件是让一些不常使用的大表数据(冷数据),在全表扫描时,每次都从磁盘读到用户的私有内存(PGA),而不要去挤占有限的、宝贵的、频繁使用的数据(热数据)所在的共享内存(SGA-buffer cache)。

2.2 定位异常SQL

对该TOP SQL分析发现,sql执行频繁,怀疑是执行计划发生变化,如果不把导致问题的根本原因找到,那么很有可能下次还会再发生!

2.3 分析执行计划

通过定位SQL Id,我们去看内存中的执行计划,明显看到了执行计划发生了变化,全表扫占用大量的IO,这里查看执行计划的方法很多。

--该方法是从共享池得到
如果SQL已被age out出share pool,则查找不到
select * from table
(dbms_xplan.display_cursor('&sql_id',null,'typical'));

--该方法是通过awr中得到
select * from table(dbms_xplan.display_awr('&sql_id'));

此时再追踪历史的执行计划发现,从凌晨故障发生开始,执行计划就发生了变化,SQL执行耗费到CPU的平均时间高达上百秒,历史执行计划再次验证了我的判断!

2.4 故障定位

跟业务确认得知,在凌晨业务人员发现,存储空间不够,删除了分区的来释放空间,此处相当于对表结构做了修改,执行计划发生了变化,再加上故障SQL的对应分区,统计信息一直未收集导致这次执行计划发生改变!

3.处理过程

1.定位到SQL的内存地址,从内存中刷出执行计划
select address,hash_value,
executions,parse_calls 
from  v$sqlarea where
sql_id='4ca86dg34xg62';

--刷出内存
exec sys.dbms_shared_pool.purge('C000000A4C502F40,4103674309','C');  

2.收集分区统计信息

BEGIN
    -- 为整个表加上统计信息(包括所有分区)
    DBMS_STATS.GATHER_TABLE_STATS(
        ownname     => 'YOUR_SCHEMA', -- 替换为你的模式名
        tabname     => 'YOUR_PARTITIONED_TABLE', -- 替换为你的分区表名
        cascade     => TRUE, -- 收集所有分区的统计信息
        estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, -- 自动估算采样百分比
        method_opt  => 'FOR ALL COLUMNS SIZE AUTO', -- 为所有列自动决定采样大小
        degree      => DBMS_STATS.DEFAULT_DEGREE -- 使用默认并行度
    );
END;
/

此时我们再次查看执行计划,正确了!

4.技能拓扑

分区索引的失效,会引起执行计划的改变
1.TRUNCATE、DROP 操作可以导致该分区表的全局索引失效,
而分区索引依然有效,如果操作的分区没有数据,
那么不会影响索引的状态。
需要注意的是,
对分区表的 ADD 操作对分区索引和全局索引没有影响。
2.如果执行 SPLIT 的目标分区含有数据,
那么在执行 SPLIT 操作后,全局索引和分区索引都会
被被置为 UNUSABLE。
如果执行 SPLIT 的目标分区没有数据,
那么不会影响索引的状态。
3.对分区表执行 MOVE 操作后,
全局索引和分区索引都会被置于无效状态。
4.对于分区表而言,除了 ADD 操作之外,
TRUNCATE、DROP、EXCHANGE 和 SPLIT
操作均会导致全局索引失效,
但是可以加上 UPDATE GLOBAL INDEXES 子句让全局索引不失效。

在 12C 之前的版本,对分区表进行删除分区或者 TRUNCATE 分区,合并或者分裂分区MOVE 分区等 DDL 操作时,分区表上的全局索引会失效,通常要加上 UPDATE GLOBAIINDEXES 或者 ONLINE 关键字,可是加上这些关键字之后,本来很快的 DDL 操作可能就要花费很长的时间,而且还要面临锁的问题。“

Oracle 12C推出了分区表全局索引异步维护特性这个特性有效的解决了这个问题,在对分区表进行上述 DDL 操作时,既能快速完成操作,也能保证全局索引有效,然后通过调度JOB 在固定的时候对全局索引进行维护。“

5.总结

警惕Oracle数据库性能“隐形杀手”——Direct Path Read, 如果不把导致问题的根本原因找到,那么很有可能下次还会再发生!

标签:12,--,分区,索引,好烦,分区表,SQL,执行
From: https://blog.csdn.net/weixin_41645135/article/details/140216368

相关文章

  • 征途发布网www.sf1223.cn,海量优质私服发布平台326
    征途新开私服发布网(sf1223.cn)作为一种非官方版本的征途游戏,极大地丰富了游戏体验,并吸引了大批忠实的玩家。然而,众多新服平台的存在也给玩家们带来了选择困难。在海量优质好服发布平台首先,征途的发布平台扮演着至关重要的角色。一个好的平台能够为玩家们提供稳定、安全、......
  • 征途发布网www.sf1223.cn,海量优质私服发布平台656
    征途新开私服发布网(sf1223.cn)作为一种非官方版本的征途游戏,极大地丰富了游戏体验,并吸引了大批忠实的玩家。然而,众多新服平台的存在也给玩家们带来了选择困难。在海量优质好服发布平台首先,征途的发布平台扮演着至关重要的角色。一个好的平台能够为玩家们提供稳定、安全、......
  • Mybatis PageHelper编译SQL引发的一次性能问题.18286262
    起源最近一直在跟大佬们做公司项目的性能优化,我这种小卡乐咪基本上负责的就是慢接口优化,但实际上只有以下几种情况需要进行接口代码级别的改造:循环查库、RPC数据库设计不合理业务流程太长,代码耦合性太高等随着对接口分析的深入,我们越来越发现系统中有很多拖后腿的问题是与......
  • 在windows中把mysql8.0.3设置为允许外部ip访问
    在windows中把mysql8.0.3设置为允许外部ip访问要在Windows系统中设置MySQL8.0.3允许外部IP访问,你需要按照以下步骤操作:登录到MySQL首先,你需要使用管理员账号登录到MySQL:mysql-uroot-p输入密码后,你将进入MySQL命令行界面。2.更新用户权限接下来,你需要更新......
  • Sqlalchemy 连接SQL Server 登录失败
    实验系统环境Windows平台Sqlalchemy2.0.23Python3.10SQLServer2012aioodbc0.5.0问题详情sqlalchemy.exc.InterfaceError:(pyodbc.InterfaceError)('28000','[28000][Microsoft][ODBCDriver17forSQLServer][SQLServer]登录失败。该登录名来自不受信任的域,不......
  • CCF-CSP 202212-1 现值计算
    题目:试题编号:202212-1试题名称:现值计算时间限制:1.0s内存限制:512.0MB问题描述:问题描述评估一个长期项目的投资收益,资金的时间价值是一个必须要考虑到的因素。简单来说,假设银行的年利率为 5%,那么当前的 100 元一年后就会变成 105 元,两年后变成 110.25 元。因此,现在收到......
  • 【Unity几种数据存储之间的区别】PlayerPrefs、Json、XML、二进制、SQLite数据存储之
    ......
  • Mysql之基本操作(库,表,用户管理)
    库中有表,表中有数据一、查看帮助信息点击查看代码mysql>helpcreate//help后面跟上具体命令可以查看帮助二、查看支持的字符集点击查看代码showcharset;//查看支持的字符集默认拉丁文字latin1utf8|UTF-8Unicode//阉割版的utf8mb4|UTF-8Unicod......
  • 面试必会之Mysql篇
    1.Mysql查询语句的书写顺序Select[distinct]<字段名称>from表1[<join类型>join表2on<join条件>]where<where条件>groupby<字段>having<having条件>orderby<排序字段>limit<起始偏移量,行数>2.Mysql查询语句的执行顺序(8)Sele......
  • linux(CentOS)搭建MySQL数据库--详细版
    1、MySQL数据库去mysql官网下载需要安装的mysql版本,我这里用的是mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz将该压缩包放到/usr/local/mysql_store目录下,mysql_store目录需要自己手动创建,cd/usr/localmkdirmysql_store然后解压该压缩包,输入如下指令:tar-zxvfmy......