sql-server - 如何确定解决此错误:.NET Framework执行由于内存不足而被升级策略中止了?

标签 sql-server memory out-of-memory .net-assembly

首先,这是我们的设置:


SQL Server 2014 SP2标准版64位
128GB RAM(标准版允许的最大值),其中120GB分配给SQL Server
服务器当前托管约5000个数据库,这些数据库都是相似的(相同的表,存储的proc等),总共有690GB的数据(仅MDF文件)


现在会发生什么:

在服务器启动一段时间后,我们不时地在某些数据库上执行查询时会收到此错误:

.NET Framework execution was aborted by escalation policy because of out of memory


当我们使用Red Gate SQL Multi Script执行所有客户端数据库的更新(当我们启动功能时)时,此错误更经常发生。在大约5000个DBS中,其中70个存在错误。再次运行更新脚本,该错误会在一部分上发生,依此类推,直到我们正确更新所有数据库为止。这真烦人。

长期以来,我们一直存在此错误。我们的服务器具有64GB的RAM,因此我们只是增加了更多内存以最大限度地提高SQL Server Standard Editor的性能,但是几天后错误再次出现。我们认为该错误可能是其他原因的征兆。

一些可能有助于获得答案的事情:


我们的SQL Server版本是64位,因此我们认为不必处理Virtual Address Space Reservation
从以PHP / Linux编写的客户端应用程序运行时,也会发生该错误,因此我们不是在谈论客户端代码的.NET框架。
在我们的数据库中,.NET框架的唯一用法是GROUP_CONCAT,它是具有用户定义函数的.NET CLR程序集,可帮助我们模拟MySQL GROUP_CONCAT聚合。我们的5000个客户数据库中的每个数据库都有一个程序集的副本。
我们已经尝试将max server memory设置降低到96GB,但是仍然遇到这些错误


如果需要更多信息,我将更新我的问题。

最佳答案

自尝试修复以来已经有4个月了,但我再也没有遇到该错误。不过,我没有该错误的确切解释,但是这是我尝试过的方法,它似乎可以工作:

我的猜测是,在我们的5000多个数据库中的每个数据库中都具有相同的.NET CLR程序集可能是问题所在,并且以某种方式增加了.NET的内存使用量。


我创建了一个名为DotNetClrUtils之类的新数据库。
我在此数据库中为GROUP_CONCAT复制了.NET CLR程序集
我在所有客户端代码和存储过程中都更改了GROUP_CONCAT的所有用法,以引用DotNetClrUtils数据库中的单个实例(这样调用:DotNetClrUtils.dbo.GROUP_CONCAT_D(col, ',')


仅此而已,现在这个问题就解决了!

关于sql-server - 如何确定解决此错误:.NET Framework执行由于内存不足而被升级策略中止了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44071008/

相关文章:

sql - 仅当按顺序排列时才省略重复项

php - 允许的内存大小为 67108864 字节耗尽

c - 结构函数的不兼容返回类型 - C

android - 增加堆大小和内存不足错误

sql - 数据透视表行到列

sql - MS SQL - 一对多关系 - 需要返回单行

sql-server - 如何对字母文本字段进行排序?

JavaFX占用内存并不断增加?

android - 如何在 Android 中改变 map 选择的颜色?

c# - 将照片 (CameraCaptureTask) 保存到隔离存储 - OutOfMemoryException