一个SQL内存为什么就没了呢

最近遇到一个故障,研发新上线一个功能,成功把主机内存耗光,导致实例重启.复现一个SQL如何把数据库的内存耗光.

实验环境

Oracle Database 19c(故障发生在11G,12C增加了新参数,可以避免此类故障发生)

相关脚本

执行脚本,使用python执行,目的:一个会话一直执行dbms_xplan.display()

import cx_Oracle
from time import sleep conn = cx_Oracle.connect("user01/user01@192.168.56.110:1521/pdb")
cur = conn.cursor()
cur.execute("explain plan for select * from t1")
i = input("explan 执行完成,输入Y:")
if i == 'Y':
for j in range(100):
cur.execute("select * from table(dbms_xplan.display())")
i = input("select已执行100次,输入Y进入死循环:")
if i == 'Y':
while True:
try:
cur.execute("select * from table(dbms_xplan.display())")
# sleep(1)
except cx_Oracle.DatabaseError as e:
print(e)

`

执行步骤及观察信息

  • 拉起脚本

    python -u "c:\Users\Li\Desktop\pga\pga1.py"

  • PGA参数信息

      NAME                                 TYPE        VALUE
    ----------------------------------- ----------- ------------------------------
    pga_aggregate_limit big integer 300M
    pga_aggregate_target big integer 164M
  • 观察PGA的使用情况

      	OSpid     Orapid Sess id Serial#      PGA alloc        PGA used oracleuser   Program
    -------- ------- ------- ---------------------- --------------- ------------ --------------------
    9470 36 41 42514 3,243,093 2,249,949 USER01 python.exe <==explan执行完
    9470 36 41 42514 17,988,693 14,451,645 USER01 python.exe <==100次select执行完
    12318 36 41 42514 239,041,621 234,468,989 USER01 python.exe <==死循环后,限制了300M最大内存使用量,已经使用240M

结论

观察到pga的分配已经超过pga_aggregate_target值后还在一直分配内存,并最终在接近pga_aggregate_limit会话被KILL.日志如下:

2024-02-04T16:28:14.964620+08:00
PGA memory used by PDB 3 exceeds PGA_AGGREGATE_LIMIT of 300 MB
(3):KILL SESSION for sid=(41, 42514):
(3): Reason = pga_aggregate_limit
(3): Mode = KILL HARD SAFE -/-/-
(3): Requestor = DBRM (orapid = 14, ospid = 7699, inst = 1)
(3): Owner = Process: USER (orapid = 36, ospid = 12318)
(3): Result = ORA-31

如果PLAN_TABLE中有内容,一直执行dbms_xplan包去访问PLAN_TABLE,最终会导致操作系统内存被耗尽.

官方描述

Keep in mind that the PGA_AGGREGATE_TARGET does not limit the amount of PGA memory usage. It is only a target and is used to dynamically size the process work areas. It does not affect other areas of the PGA that are allowed to grow beyond this limit.

12c introduced the database parameter PGA_AGGREGATE_LIMIT to limit overall total process memory usage on a database instance.

规避措施

  • 因为11G中没有硬限制,只能在11G的库中做好监控,如果有进程使用PGA超过某个阈值,断开会话时会释放PGA内存,避免内存被耗尽.
  • 12C以上版本配置pga_aggregate_limit参数为非0且合适大小的值,如果触发这个值,会(有顺序的)杀掉数据库会话,保证数据库实例安全.

一个SQL就让内存耗光了的更多相关文章

  1. composer安装包的时候触发PHP fatal error,提示允许的内存耗光

    在composer require之前加COMPOSER_MEMORY_LIMIT=-1

  2. Windows Server 2008 R2 服务器内存使用率过高几乎耗光

    系统环境: Windows Server 2008 R2 Enterprise 搭建有 web服务器(iis) 和  文件服务   问题描述: Windows Server 2008 R2系统内存耗光 ...

  3. Performance Monitor3:监控SQL Server的内存压力

    SQL Server 使用的资源受到操作系统的调度,同时,SQL Server在内部实现了一套调度算法,用于管理从操作系统获取的资源,主要是对内存和CPU资源的调度.一个好的数据库系统,必定在内存中缓 ...

  4. SQL Server占用内存的认识

    SQL Server占用的内存主要由三部分组成:数据缓存(Data Buffer).执行缓存(Procedure Cache).以及SQL Server引擎程序.SQL Server引擎程序所占用缓存 ...

  5. 用scala实现一个sql执行引擎-(上)

    前言 在实时计算中,通常是从队列中收集原始数据,这种原始数据在内存中通常是一个java bean,把数据收集过来以后,通常会把数据落地到数据库,供后面的ETL使用.举个一个简单的例子,对一个游戏来说, ...

  6. SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划

    我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...

  7. SQL Server 2012 内存管理 (memory management) 改进

    SQL Server 2012 的内存管理和以前的版本相比,有以下的一些变化. 一.内存分配器的变化 SQL Server 2012以前的版本,比如SQL Server 2008 R2等, 有sing ...

  8. 解决 SQL Server 耗尽内存的情况

       如果您碰到SQL Server服务造成内存不断扩展最终系统死机等情况,请按照以下方法解决. 原理:SQL Server 2000引入的动态内存分配机制,一般不能很好的回收内存,如果计算机一直不关 ...

  9. 自己实现一个SQL解析引擎

    自己实现一个SQL解析引擎 功能:将用户输入的SQL语句序列转换为一个可运行的操作序列,并返回查询的结果集. SQL的解析引擎包含查询编译与查询优化和查询的执行,主要包含3个步骤: 查询分析: 制定逻 ...

  10. 浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

随机推荐

  1. AtCoder Beginner Contest 379

    Contest Link C 妙妙贪心题,居然需要高斯求和公式. Submission D 妙妙套路题,维护全局 lazytag,easy to solve. Submission E 妙妙拆贡献题, ...

  2. 全面解读TaurusDB透明压缩特性,降低数据库使用成本

    本文分享自华为云社区<[华为云MySQL技术专栏]TaurusDB透明压缩>,作者: GaussDB 数据库. 背景介绍 某一部分特定比例的客户群体,对数据库的读写性能要求并不高.相比之下 ...

  3. pg_index

    在pg11之后,引入了indnkeyatts字段,根据官方文档解释其作用:The number of key columns in the index, not counting any includ ...

  4. window下cmd显示乱码

    前情 最近在维护一些老项目,本地开发环境跑不起来,需要根据cmd中的报错来解决一些环境问题 坑位 在解决环境错误的时候,cmd命令行日志打印出来的是一堆乱码,导致看不清具体是什么错误 Why? cmd ...

  5. 执行docker-compose up -d时出现ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule

    原因是因为防火墙关闭之后需要重启docker服务. 执行: service docker restart 即可.

  6. HikariCP不断打印WARN日志Failed to validate connection com.mysql.jdbc.JDBC4Connection@xxxxx (...) Possibly consider using a shorter maxLifetime value.

    最终解决方案(结论) maxLifeTime参数需要设置为小于min(数据库的wait_timeout,HA代理的超时时间,其他代理的超时时间);也就是说maxLifeTime不仅要像HikariCP ...

  7. ssh远程执行命令方法和Shell脚本实例

    写这篇博客之前,我google了一堆相关文章,大都是说修改/etc/sudoers,然后NOPASSWD:指定的cmd,但是真心不管用,没有远程虚拟终端这个方法就是浮云,ubuntu10.04 ser ...

  8. STK V11.2 64位下载及视频

    1.AGI Systems Tool Kit (STK) 11.2 64位+含补丁激活教程:下载地址 2.STK视频学习资料(一):下载地址

  9. 配置Ubuntu上的NFS

    $sudo apt-get install nfs-kernel-server nfs-common 配置 $sudo vim /etc/exports#添加#/home/pi/project/roo ...

  10. 收藏几个常用的vue自定义组件,抄自 他人,以防丢失

    在 Vue,除了核心功能默认内置的指令 ( v-model 和 v-show ),Vue 也允许注册自定义指令.它的作用价值在于当开发人员在某些场景下需要对普通 DOM 元素进行操作. Vue自定义指 ...