SQL Server In-Memory OLTP 使用比 SQL Server 更多的内存和不同的方式。 为 In-Memory OLTP 安装和分配的内存量可能不足以满足不断增长的需求。 如果是这样,可能会耗尽内存。 本主题介绍如何从 OOM 情况中恢复。 有关可帮助您避免许多内存不足(OOM)情况的指导,请参阅 监视和排查内存使用情况。
本主题中介绍
| 主题 | 概述 |
|---|---|
| 解决因 OOM 导致的数据库还原失败 | 如果收到错误消息“由于资源池”<resourcePoolName>“中的内存不足,数据库”<databaseName>“还原作失败,该怎么办。 |
| 解决低内存或 OOM 条件对工作负荷的影响 | 如果发现内存不足问题对性能产生负面影响,该怎么办。 |
| 解决在内存充足时因内存不足导致页面分配失败的问题 | 如果收到错误消息,因为资源池“<resourcePoolName>”中的内存不足,禁止对数据库“<databaseName>”进行页分配,该怎么办。 ..."当可用内存足以执行操作时。 |
解决因 OOM 导致的数据库还原失败
尝试还原数据库时,可能会收到错误消息:“由于资源池”resourcePoolName“<中的内存不足,数据库'databaseName>>'的还原作失败。<在成功还原数据库之前,必须通过提供更多可用内存来解决内存不足的问题。
若要解决因 OOM(内存不足)导致的恢复失败,请使用以下任何或所有方法来暂时增加可用于恢复操作的内存。
暂时关闭正在运行的应用程序。
通过关闭一个或多个正在运行的应用程序(如 Visual Studio、Internet Explorer、OneNote 等),可以释放这些程序占用的内存以进行还原操作。 可以在成功还原后重启它们。增加MAX_MEMORY_PERCENT的值。
此代码片段将资源池 PoolHk MAX_MEMORY_PERCENT更改为已安装内存的 70%。重要
如果服务器在 VM 上运行且不专用,请将MIN_MEMORY_PERCENT的值设置为与MAX_MEMORY_PERCENT相同的值。
有关详细信息,请参阅主题 最佳做法:在 VM 环境中使用 In-Memory OLTP 。-- disable resource governor ALTER RESOURCE GOVERNOR DISABLE -- change the value of MAX_MEMORY_PERCENT ALTER RESOURCE POOL PoolHk WITH ( MAX_MEMORY_PERCENT = 70 ) GO -- reconfigure the Resource Governor -- RECONFIGURE enables resource governor ALTER RESOURCE GOVERNOR RECONFIGURE GO有关MAX_MEMORY_PERCENT最大值的信息,请参阅内存优化表和索引可用的内存百分比部分
重新配置 最大服务器内存。
有关配置 最大服务器内存 的信息,请参阅主题 :使用内存配置选项优化服务器性能。
解决低内存或 OOM 条件对工作负荷的影响
显然,最好不要进入内存不足或 OOM(内存不足)的情况。 良好的规划和监视有助于避免 OOM 情况。 不过,即使是最好的规划也不能总是预见到实际会发生的事情,你可能会因此面临内存不足或出现内存溢出的问题。 从 OOM 恢复有两个步骤:
打开 DAC(专用管理员连接)
Microsoft SQL Server 提供专用管理员连接(DAC)。 DAC 允许管理员访问正在运行的 SQL Server 数据库引擎实例,以排查服务器上的问题,即使服务器对其他客户端连接无响应也是如此。 DAC 通过 sqlcmd 实用工具和 SQL Server Management Studio(SSMS)提供。
有关使用 sqlcmd 和 DAC 的指导,请参阅 使用专用管理员连接。 有关通过 SSMS 使用 DAC 的指导,请参阅 如何:将专用管理员连接与 SQL Server Management Studio 配合使用。
采取纠正措施
若要解决 OOM 条件,需要通过减少使用量来释放现有内存,或使内存中表有更多的内存可用。
释放现有内存
删除非基本内存优化表行并等待垃圾回收
可以从内存优化表中删除非必要行。 垃圾回收器将这些行使用的内存返回到可用内存。 . 内存中 OLTP 引擎主动收集垃圾行。 但是,长时间运行的事务可能会阻止垃圾回收。 例如,如果一个事务运行了5分钟,那么在事务处于活动状态时,由于更新/删除操作而创建的任何行版本都无法进行垃圾回收。
将一行或多行移到基于磁盘的表
以下 TechNet 文章提供有关将行从内存优化表移动到基于磁盘的表的指导。
增加可用内存
增加资源池上MAX_MEMORY_PERCENT的值
如果尚未为内存中表创建命名资源池,则应执行此作并将 In-Memory OLTP 数据库绑定到该池。 有关创建 In-Memory OLTP 数据库并将其绑定到资源池的指导,请参阅本主题将 包含 Memory-Optimized 表的数据库绑定到 资源池。
如果 In-Memory OLTP 数据库绑定到资源池,则可以增加池可以访问的内存百分比。 有关更改资源池中MIN_MEMORY_PERCENT和MAX_MEMORY_PERCENT值的指导,请参阅子主题 更改现有池的MIN_MEMORY_PERCENT和MAX_MEMORY_PERCENT。
增加MAX_MEMORY_PERCENT的值。
此代码片段将资源池 PoolHk MAX_MEMORY_PERCENT更改为已安装内存的 70%。
重要
如果服务器在 VM 上运行且不专用,请将MIN_MEMORY_PERCENT的值设置为相同的值,并将MAX_MEMORY_PERCENT的值设置为相同的值。
有关详细信息,请参阅主题 最佳做法:在 VM 环境中使用 In-Memory OLTP 。
-- disable resource governor
ALTER RESOURCE GOVERNOR DISABLE
-- change the value of MAX_MEMORY_PERCENT
ALTER RESOURCE POOL PoolHk
WITH
( MAX_MEMORY_PERCENT = 70 )
GO
-- reconfigure the Resource Governor
-- RECONFIGURE enables resource governor
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
有关MAX_MEMORY_PERCENT最大值的信息,请参阅 内存优化表和索引可用的内存百分比部分。
安装其他内存
最终,如果可能,最好的解决方案是安装额外的物理内存。 如果这样做,请记住,你可能可以增加 MAX_MEMORY_PERCENT 的值(请参阅子主题 更改现有池上的 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT),因为 SQL Server 可能不需要更多的内存,这样您就可以使大部分甚至所有新安装的内存都可用于资源池。
重要
如果服务器在 VM 上运行且不专用,请将MIN_MEMORY_PERCENT的值设置为相同的值,并将MAX_MEMORY_PERCENT的值设置为相同的值。
有关详细信息,请参阅主题 最佳做法:在 VM 环境中使用 In-Memory OLTP 。
解决在有足够内存时因内存不足导致的页面分配失败
如果收到错误消息“由于资源池'<resourcePoolName>'中的内存不足,不允许数据库'<databaseName>'的页面分配。 请查看错误日志中的“https://go.microsoft.com/fwlink/?LinkId=330673”以获取详细信息。当可用物理内存足以分配页面时,可能是由于资源调节器已禁用。 当资源调控器被禁用时,MEMORYBROKER_FOR_RESERVE会引发人工内存压力。
若要解决此问题,需要启用资源调控器。
有关限制和约束的信息,请参阅启用资源调控器,以及有关使用对象资源管理器、资源调控器属性或 Transact-SQL 来启用资源调控器的指导。
另请参阅
管理 In-Memory OLTP 的内存
监视和排查内存使用情况问题
将具有 Memory-Optimized 表的数据库绑定到资源池
最佳做法:在 VM 环境中使用 In-Memory OLTP