如何明确修复此错误:由于内存不足,.NET Framework执行因升级策略而中止?

时间:2017-05-19 13:09:52

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

首先,这是我们的设置:

  • SQL Server 2014 SP2标准版64位
  • 128GB的RAM(标准版允许的最大值),其中120GB分配给SQL Server
  • 服务器当前托管~5000个数据库,这些数据库都相似(相同的表,存储过程等),共计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标准编辑器,但是,几天之后错误又回来了。我们认为错误可能是其他原因的症状。

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

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

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

1 个答案:

答案 0 :(得分:0)

我尝试修复已经有4个月,而且我没有再次遇到这个错误。尽管如此,我还没有对bug的确切解释,但这是我尝试过的,它似乎有效:

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

  1. 我创建了一个名为DotNetClrUtils
  2. 的新数据库
  3. 我在此数据库中复制了GROUP_CONCAT的.NET CLR程序集
  4. 我在所有客户端代码和存储过程中更改了GROUP_CONCAT的所有用法,以引用DotNetClrUtils数据库中的单个实例(称之为:DotNetClrUtils.dbo.GROUP_CONCAT_D(col, ',')
  5. 就是这样,现在这个问题已经消失了!