1. 程式人生 > 資料庫 >SQL Server誤設定max server memory的處理方法

SQL Server誤設定max server memory的處理方法

昨天網上一網友說,由於他同事誤將“max server memory”設定為10M後,SQL Server資料庫登入不了,當時我簡單測試了一下,今天有空就順手將整個過程整理一下,記錄在此。

在SSMS的UI介面設定“max server memory”,即使你設定為10M大小,但是它會“悄悄”預設修改為128M,你用Profile跟蹤或者設定後會發現,它偷偷“修改”了你的設定值(改為了128M),

EXEC sys.sp_configure N'max server memory (MB)',N'128'
GO
RECONFIGURE WITH OVERRIDE
GO
 
Configuration option 'max server memory (MB)' changed from 4096 to 128. Run the RECONFIGURE statement to install.

如果你沒有注意這些細節,或者不信這個事情,那麼也可以用指令碼測試一下,如下所示,它提示你這個值(10M)不是一個有效值。

當你對“max server memory”做了錯誤設定後,那麼基本上,任何查詢或連線都會出現類似下面這樣的錯誤:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------
There is insufficient system memory in resource pool 'internal' to run this query. (Microsoft SQL Server,Error: 701)







------------------------------
ADDITIONAL INFORMATION:

A connection was successfully established with the server,but then an error occurred during the pre-login handshake. (provider: TCP Provider,error: 0 - 遠端主機強迫關閉了一個現有的連線。) (Microsoft SQL Server,Error: 10054)

For help,click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=10054&LinkId=20476

------------------------------
遠端主機強迫關閉了一個現有的連線。

你檢查資料庫的錯誤日誌,就會發現有很多額外資訊,摘抄部分如下:

.........................................................
.........................................................
2019-12-24 10:15:32.84 spid53 There is insufficient system memory in resource pool 'internal' to run this query.
2019-12-24 10:15:52.88 spid53 Error: 18056,Severity: 20,State: 29. (Params:). The error is printed in terse mode because there was error during formatting. Tracing,ETW,notifications etc are skipped.
2019-12-24 10:15:55.89 Server Error: 17300,Severity: 16,State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing,notifications etc are skipped.
2019-12-24 10:16:12.70 Server Failed allocate pages: FAIL_PAGE_ALLOCATION 1
2019-12-24 10:16:12.70 Server

Process/System Counts Value
---------------------------------------- ----------
Available Physical Memory 6614454272
Available Virtual Memory 140726213148672
Available Paging File 7776440320
Working Set 95432704
Percent of Committed Memory in WS 100
Page Faults 57030
System physical memory high 1
System physical memory low 0
Process physical memory low 1
Process virtual memory low 0
2019-12-24 10:16:12.70 Server
Memory Manager KB
---------------------------------------- ----------
VM Reserved 10652776
VM Committed 57972
Locked Pages Allocated 86472
Large Pages Allocated 0
Emergency Memory 1024
Emergency Memory In Use 16
Target Committed 131072
Current Committed 144448
Pages Allocated 84176
Pages Reserved 0
Pages Free 0
Pages In Use 144432
Page Alloc Potential -19912
NUMA Growth Phase 2
Last OOM Factor 1
Last OS Error 0
2019-12-24 10:16:12.70 Server
Memory node Id = 0 KB
---------------------------------------- ----------
VM Reserved 10652712
VM Committed 57952
Locked Pages Allocated 86472
Pages Allocated 84176
Pages Free 0
Target Committed 131048
Current Committed 144424
Foreign Committed 0
Away Committed 0
Taken Away Committed 0
2019-12-24 10:16:12.70 Server
Memory node Id = 64 KB
---------------------------------------- ----------
VM Reserved 0
VM Committed 20
Locked Pages Allocated 0
2019-12-24 10:16:12.70 Server
MEMORYCLERK_SQLGENERAL (node 0) KB
---------------------------------------- ----------
.........................................................
.........................................................

要解決這個問題,你需要關閉資料庫服務, 然後以單使用者模式+最小配置啟動資料庫例項,然後去修改max server memory引數。 關閉資料庫過程中如果遇到一些問題,可以通過重啟伺服器解決問題(這個要根據具體實際情況決定,有時候不會遇到問題,有時候會遇到一些問題,例如net stop mssqlserver命令卡住,出現service_state[MSSQLSERVER]): Stop pending)

注意:如果以單使用者模式啟動,然後以sqlcmd去連線資料庫,就會出現下面錯誤,所以必須以單使用者模式+最小配置啟動資料庫例項

EXEC sys.sp_configure 'max server memory (MB)',4096; #根據實際情況設定記憶體大小。
 
RECONFIGURE
 
GO

然後重啟SQL Server例項,問題就解決了。 當然你也可以還原master庫的備份到其它測試資料庫,然後用還原後master資料庫的相關檔案替換當前資料庫master的相關檔案來解決問題。但是那樣會相對麻煩,沒有這種方法簡便、有效!

C:\Windows\system32>net stop mssqlserver

The SQL Server (MSSQLSERVER) service is stopping.

The SQL Server (MSSQLSERVER) service was stopped successfully.

C:\Windows\system32>net start mssqlserver

The SQL Server (MSSQLSERVER) service is starting.

The SQL Server (MSSQLSERVER) service was started successfully.

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。