共用方式為


解決記憶體不足問題

SQL Server In-Memory OLTP 會使用比 SQL Server 更多的記憶體和不同的方式。 您所安裝並配置給記憶體內部 OLTP 的記憶體數量可能會變得不足以支應成長的需求。 若是如此,您可能會用完記憶體。 本主題將說明如何從 OOM 情況中復原。 如需避免許多 OOM 狀況的指引,請參閱 監視與疑難排解記憶體使用量

本主題所涵蓋的內容

主題 概觀
解決由於 OOM 所造成的資料庫還原失敗 若您收到錯誤訊息:「資料庫 '<databaseName>' 的還原作業因為資源集區 '<resourcePoolName>' 中的記憶體不足而失敗」,該怎麼辦。
解決低記憶體或 OOM 狀況對於工作負載的影響 如果您發現低記憶體問題對於效能造成負面影響,該怎麼辦。
解決有足夠的記憶體可用但卻記憶體不足所造成的頁面配置失敗 若您收到錯誤訊息:「不允許資料庫 '<databaseName>' 的頁面配置,因為資源集區 '<resourcePoolName>' 中的記憶體不足」,該怎麼辦。 ...」(前提是可用的記憶體足夠供執行作業)。

解決由於 OOM 所造成的資料庫還原失敗

當您嘗試還原資料庫時,可能會收到錯誤訊息:「資料庫 』<databaseName' 的還原作業失敗,因為資源集區 'resourcePoolName>>' 中的記憶體不足。<您必須先讓更多記憶體可用,才能成功還原資料庫,才能解決記憶體不足的問題。

若要解決因記憶體不足 (OOM) 而導致的復原失敗,請使用以下任一或全部方法,暫時增加復原作業可用的記憶體。

  • 暫時關閉執行中的應用程式。
    藉由關閉一或多個執行中的應用程式,例如 Visual Studio、Internet Explorer、OneNote 和其他應用程式,您可以讓記憶體可供還原作業使用。 您可以在成功還原之後重新啟動這些應用程式。

  • 提高 MAX_MEMORY_PERCENT 的值。
    這個程式碼片段會將資源集區 PoolHk 的 MAX_MEMORY_PERCENT 變更為已安裝記憶體的 70%。

    這很重要

    如果伺服器是在 VM 上執行,而且不是專用的,請將 MIN_MEMORY_PERCENT 設成與 MAX_MEMORY_PERCENT 相同的值。
    請參閱最佳做法:在 VM 環境使用記憶體內部 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。 有兩個步驟可以從 OOM 中復原:

  1. 開啟 DAC (專用管理員連接)

  2. 採取更正動作

開啟 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 值

如果您尚未針對記憶體中的資料表建立具名資源集區,就應該先建立集區,並且將記憶體內部 OLTP 資料庫繫結至該集區。 如需如何建立記憶體內部 OLTP 資料庫並將其繫結至資源集區的指引,請參閱將包含記憶體最佳化資料表的資料庫繫結至資源集區主題。

如果您的記憶體內部 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 環境使用記憶體內部 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 之最大值的資訊,請參閱主題章節: 可用於記憶體最佳化資料表和索引的記憶體百分比

安裝額外記憶體

最佳的終極解決方案還是安裝額外的實體記憶體 (如果可行)。 如果您這樣做,請記住,因為 SQL Server 不太可能需要更多記憶體,所以您或許能夠一併提高 MAX_MEMORY_PERCENT 的值 (請參閱變更現有集區上的 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 子主題),以便將大部分新安裝的記憶體提供給資源集區。

這很重要

如果伺服器是在 VM 上執行,而且不是專用的,請將 MIN_MEMORY_PERCENT 與 MAX_MEMORY_PERCENT 設為相同值。
請參閱最佳做法:在 VM 環境使用記憶體內部 OLTP 主題,以了解詳細資訊。

解決有足夠的記憶體可用但卻記憶體不足所造成的頁面配置失敗

如果您收到錯誤訊息:「不允許資料庫 『<databaseName』 的頁面配置,因為資源集區 『resourcePoolName>>』 中的記憶體不足。< 如需詳細資訊,請參閱錯誤https://go.microsoft.com/fwlink/?LinkId=330673記錄檔。」當可用的物理記憶體足以配置頁面時,可能是因為資源管理員已停用。 若資源管理員已停用,MEMORYBROKER_FOR_RESERVE 會產生虛假的記憶體壓力。

為了解決此問題,您必須啟用資源管理員。

如需有關限制事項的資訊以及使用物件總管、資源管理員屬性或 Transact-SQL 來啟用資源管理員的指導,請參閱 啟用資源管理員

另請參閱

管理內存 OLTP 的記憶體
監視與疑難排解記憶體使用量
將具備記憶體最佳化資料表的資料庫繫結至資源集區
最佳做法:在 VM 環境中使用 In-Memory OLTP