特定のSQL Serverインスタンスに「メモリ内のページをロック」権限があるかどうかを確実に判断するにはどうすればよいですか?


12

「メモリ内のページのロック」権限は、SQL Serverが使用するサービスアカウントに付与できます。これにより、SQL Serverはメモリがディスクにページングされるのを防ぐことができます。

SQL Serverマシンのいくつかには、SQL Serverが使用するサービスアカウントにこの権利を許可するように構成されたローカルポリシーがないことに気付きました。多数のサーバーがあるため、「ローカルシステムポリシー」管理コンソールを使用して各サーバーを手動で確認するのはせいぜい面倒です。

問題のサーバーに権限があるかどうかを判断するために使用できるT-SQLクエリ、拡張ストアドプロシージャ、またはその他の方法はありますか?

私はしたいと思いません使用しEXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted';、それは現在のSQL Serverエラーログを確認するに依存しているからです。サーバーが最後に再起動されてからログがロールオーバーされたと仮定すると、そのエラーログに関連するエントリが含まれない場合があります。最初のパラメーターをからなどに変更することで古いログを確認できることを理解しています01、エラーログは10個しか保持されておらず、十分ではない場合があります。設定を確認するフェールセーフな方法が必要です。

回答:


11

場合はxp_cmdshellオプションがあり、ここを利用したスクリプトですwhoami

DECLARE @LockPagesInMemory VARCHAR(255);
SET @LockPagesInMemory = 'UNKNOWN';
DECLARE @Res TABLE
(
    [output] NVARCHAR(255) NULL
);

IF (SELECT value_in_use
    FROM sys.configurations c
    WHERE c.name = 'xp_cmdshell'
    ) = 1
BEGIN
    INSERT INTO @Res
    EXEC xp_cmdshell 'WHOAMI /PRIV';

    IF EXISTS (SELECT *
        FROM @Res 
        WHERE [output] LIKE 'SeLockMemoryPrivilege%'
        )
        SET @LockPagesInMemory = 'ENABLED';
    ELSE
        SET @LockPagesInMemory = 'DISABLED';
END

SELECT LockPagesInMemoryEnabled = @LockPagesInMemory;

whoami.exeアカウント実行によって保持されたすべての権利を報告する能力がありますwhoami。これと組み合わせて、xp_cmdshellSQL Serverのインスタンスがメモリ内のページをロックするために必要な権利を持っているかどうかを判断する信頼できる方法を提供します。

xp_cmdshellが有効になっていない場合、このコードはを返しますUNKNOWN。仮定がxp_cmdshell されて有効になっており、右のは、それが返すSQL Serverアカウントで有効になっているENABLEDそれ以外の場合は返します、DISABLED


9

他の方法もあります。おそらく、2つのDMVを使用できます。どちらもSQL Server 2008以降でのみ機能することに注意してください。

のゼロ以外の値はlocked_page_allocations_kb、SQL Serverアカウントにメモリ内のロックされたページ特権があることを示します。

select osn.node_id, 
osn.memory_node_id, 
osn.node_state_desc, 
omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn
inner join sys.dm_os_nodes osn on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'

...そして:

select
(physical_memory_in_use_kb/1024)Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024 )Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

列にLocked_pages_allocation_KBゼロ以外の値が表示される場合は、SQL Serverサービスアカウントにもメモリ内のロックされたページの特権があります。

...そして:

DBCC MEMORYSTATUS出力の[ メモリマネージャ]セクションには、[ AWE Allocated]のゼロ以外の値が表示されます。または、SQL Serverサービスアカウントにメモリ特権ページがロックされている場合。

注意:

SQL Serverサービスアカウントがローカルシステム(NT Authority \ System)アカウントで実行されている場合、既定では、SQL Serverにはメモリ内のロックされたページ特権があります。

更新:

SQL Server 2012 for Standard Editionの前に、LPIMを利用するには、トレースフラグt -845を有効にする必要があります。LPIM特権を持つアカウントでSQL Serverを実行している場合でも、トレースフラグが有効になっていない限り、SQL Serverは実際にはLPIMの利点を使用しません。

2012年以降、LPIMを活用するために標準版でトレースフラグを有効にする必要はありません。


4

SQL ServerがLPIMを利用するメモリモデルで実行されている場合(適切な権限を持っているのではなく)本当に知りたい場合、Microsoftは製品の新しいバージョンでこれを簡単にします。この情報は、SQL Serverのバージョンに応じてsys.dm_os_sys_infoにあります。拡張機能はブログ投稿で発表されました:

SQL Server 2016 SP1およびSQL Server 2012 SP4では、sys.dm_os_sys_infoにsql_memory_modelおよびsql_memory_model_descという2つの新しい列が追加されました。これらの列は、メモリ内のページのロック(LPIM)権限がSQL Serverサービスアカウントに割り当てられているかどうかを識別するために使用できます。

知っておくべき重要なことの1つは、新しい列が、必要な情報であるSQL Serverインスタンスの起動以降に使用中のSQLメモリモデルを報告することです。SQLサービスアカウントのLPIM権限について、OSレベルで実行されるチェックはありません。SQL Serverの起動中に、SQL ServerサービスアカウントプロセストークンにLPIM特権が存在する場合、SQL Serverはロックされたページ(ページング不可)を使用してSQLメモリを割り当てます。さらに、SQLサービスアカウントに割り当てられたLPIM特権とトレースフラグ834を有効にしてEnterprise EditionのSQL Serverを実行している場合、SQL Serverはラージページを使用してSQLメモリを割り当てます。

特定のSQL Serverインスタンスに対してメモリ内のページのロック特権が有効かどうかを確認するには、sys.dm_os_sys_infoでsql_memory_modelを照会し、1より大きい値を検索できます。

LPIM権限がサービスアカウントプロセストークンにない場合、コンベンショナルメモリモデルが使用され、DMVによって同じものが報告されます(sql_memory_model = 1)。現在、メモリ内のロックページ権限がSQLサーバーに割り当てられているが、SQLサービスが再起動されていない場合、DMVは従来のメモリモデルを報告し続けます。再起動後、SQL Serverはメモリモデルでロックされたページを使用し、sys.dm_os_sys_infoのsql_memory_modelおよびsql_memory_model_descによって同じことが報告されます。

サーバーの1つで次のクエリを実行した場合:

SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;

現在使用されているメモリモデルはですCONVENTIONAL。これは、サーバーの起動時にLPIMが許可されなかったことを意味します。ただし、LPIMを付与することはできますが、SQL Serverサービスを再起動することはできないため、質問の正確な性質によっては、このDMVは役に立たない場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.