首先,这是我们的设置:
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/