一个SQL就让内存耗光了
一个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就让内存耗光了的更多相关文章
- composer安装包的时候触发PHP fatal error,提示允许的内存耗光
在composer require之前加COMPOSER_MEMORY_LIMIT=-1
- Windows Server 2008 R2 服务器内存使用率过高几乎耗光
系统环境: Windows Server 2008 R2 Enterprise 搭建有 web服务器(iis) 和 文件服务 问题描述: Windows Server 2008 R2系统内存耗光 ...
- Performance Monitor3:监控SQL Server的内存压力
SQL Server 使用的资源受到操作系统的调度,同时,SQL Server在内部实现了一套调度算法,用于管理从操作系统获取的资源,主要是对内存和CPU资源的调度.一个好的数据库系统,必定在内存中缓 ...
- SQL Server占用内存的认识
SQL Server占用的内存主要由三部分组成:数据缓存(Data Buffer).执行缓存(Procedure Cache).以及SQL Server引擎程序.SQL Server引擎程序所占用缓存 ...
- 用scala实现一个sql执行引擎-(上)
前言 在实时计算中,通常是从队列中收集原始数据,这种原始数据在内存中通常是一个java bean,把数据收集过来以后,通常会把数据落地到数据库,供后面的ETL使用.举个一个简单的例子,对一个游戏来说, ...
- SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划
我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...
- SQL Server 2012 内存管理 (memory management) 改进
SQL Server 2012 的内存管理和以前的版本相比,有以下的一些变化. 一.内存分配器的变化 SQL Server 2012以前的版本,比如SQL Server 2008 R2等, 有sing ...
- 解决 SQL Server 耗尽内存的情况
如果您碰到SQL Server服务造成内存不断扩展最终系统死机等情况,请按照以下方法解决. 原理:SQL Server 2000引入的动态内存分配机制,一般不能很好的回收内存,如果计算机一直不关 ...
- 自己实现一个SQL解析引擎
自己实现一个SQL解析引擎 功能:将用户输入的SQL语句序列转换为一个可运行的操作序列,并返回查询的结果集. SQL的解析引擎包含查询编译与查询优化和查询的执行,主要包含3个步骤: 查询分析: 制定逻 ...
- 浅谈SQL Server 对于内存的管理
简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...
随机推荐
- SMOS-II 电梯综合监控系统程序(电梯IC卡解决方案)安装的注意点
命令提示符下输入命令dir "D:\SMOS-II-CH V3.2" /b /s 回车可返回SMOS II 3.2对应的各文件路径 D:\SMOS-II-CH V3.2\Setup ...
- 序列化-serialVersionUID作用
Serializable接口 作用:标记一个类可以被序列化,如果没有实现该接口,则会抛出异常. ObjectOutputStream中源码: 实验: serialVersionUID 作用:表示一个序 ...
- Pytorch 手写数字识别 深度学习基础分享
本篇是一次内部分享,给项目开发的同事分享什么是深度学习.用最简单的手写数字识别做例子,讲解了大概的原理. 手写数字识别 展示首先数字识别项目的使用.项目实现过程: 训练出模型 准备html手写板 fl ...
- RAG七十二式:2024年度RAG清单
回顾2024,大模型日新月异,智能体百家争鸣.作为AI应用的重要组成部分,RAG也是"群雄逐鹿,诸侯并起".年初ModularRAG持续升温.GraphRAG大放异彩,年中开源工具 ...
- acode连接termux
在acode中安装AcodeX - Terminal插件 在termux中运行 curl -sL https://raw.githubusercontent.com/bajrangCoder/acod ...
- .NET Core 异常(Exception)底层原理浅谈
中断与异常模型图 内中断 内中断是由 CPU 内部事件引起的中断,通常是在程序执行过程中由于 CPU 自身检测到某些异常情况而产生的.例如,当执行除法运算时除数为零,或者访问了不存在的内存地址,CPU ...
- [转载] 十问 TiDB :关于架构设计的一些思考 TiDB
做 TiDB 的缘起是从思考一个问题开始的:为什么在数据库领域有这么多永远也躲不开的坑?从 2015 年我们写下第一行代码,3 年以来我们迎面遇到无数个问题,一边思考一边做,尽量用最小的代价来快速奔跑 ...
- C#中 CancellationTokenSource的妙用
在.NET中,CancellationTokenSource.CancellationToken和Task是处理异步操作和取消任务的重要工具.本文将通过一些简单的例子,帮助你理解它们的用法和协作方式. ...
- arch 输入法
输入法配置 输入法采用fcitx + Sogou的组合,安装需要的包: yay -S fcitx fcitx-im fcitx-configtool fcitx-sogoupinyin 然后写一个fc ...
- 人工生命(AL:Artificial life)兰顿蚂蚁多版本代码html\go\php\python\java
背景介绍 人工生命(AL:Artificial life)这一概念由美国计算机科学家.人工生命领域创始人之一克里斯托弗・盖尔・兰顿(Christopher G. Langton)提出.1986 年,兰 ...