Wie kann ich zuverlässig feststellen, ob eine bestimmte SQL Server-Instanz über das Recht "Seiten im Speicher sperren" verfügt?

12

Das Recht "Seiten im Speicher sperren" kann dem von SQL Server verwendeten Dienstkonto gewährt werden. Dadurch kann SQL Server verhindern, dass Speicher auf die Festplatte ausgelagert wird.

Ich habe festgestellt, dass auf einigen unserer SQL Server-Computer die lokale Richtlinie nicht konfiguriert ist, um dieses Recht für das von SQL Server verwendete Dienstkonto zuzulassen. Da wir über eine große Anzahl von Servern verfügen, ist es bestenfalls mühsam, die einzelnen Server manuell über die Verwaltungskonsole "Lokale Systemrichtlinie" zu überprüfen.

Gibt es eine T-SQL-Abfrage, eine erweiterte gespeicherte Prozedur oder eine andere Methode, mit der ich feststellen kann, ob der betreffende Server das Recht hat oder nicht?

Ich möchte nicht verwenden, EXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted';da es auf der Überprüfung des aktuellen SQL Server-Fehlerprotokolls beruht; und dieses Fehlerprotokoll enthält möglicherweise nicht den relevanten Eintrag, vorausgesetzt, das Protokoll wurde seit dem letzten Neustart des Servers verschoben. Ich stelle fest, dass ich ältere Protokolle überprüfen kann, indem ich den ersten Parameter von 0bis 1usw. ändere. Wir behalten jedoch nur 10 Fehlerprotokolle bei, und das reicht möglicherweise nicht aus. Ich möchte eine ausfallsichere Methode zur Bestätigung der Einstellung.

Max Vernon
quelle

Antworten:

11

Wenn dies xp_cmdshelleine Option ist, wird in diesem Skript Folgendes verwendet 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.exehat die Fähigkeit, alle Rechte zu melden, die das ausführende Konto besitzt whoami. In Kombination mit der können Sie auf xp_cmdshellzuverlässige Weise feststellen, ob die Instanz von SQL Server über das erforderliche Recht zum Sperren von Seiten im Speicher verfügt.

Wenn xp_cmdshellnicht aktiviert, wird dieser Code zurückgegeben UNKNOWN. Angenommen, es xp_cmdshell ist aktiviert und das Recht ist für das SQL Server-Konto aktiviert. ENABLEDAndernfalls wird es zurückgegeben DISABLED.

FilamentUnities
quelle
9

Es gibt auch andere Methoden. Vielleicht kannst du zwei DMVs verwenden. Bitte beachten Sie, dass beide nur für SQL Server 2008 und höher funktionieren.

Ein Wert ungleich Null für locked_page_allocations_kbwürde Ihnen mitteilen, dass das SQL Server-Konto über gesperrte Seiten im Speicher verfügt.

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'

...und:

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

Wenn in der Spalte Locked_pages_allocation_KBein Wert ungleich Null angezeigt wird, verfügt auch das SQL Server-Dienstkonto über die Berechtigung "Gesperrte Seiten im Speicher".

...und:

Der Abschnitt "Speichermanager" der DBCC MEMORYSTATUSAusgabe zeigt einen Wert ungleich Null für "AWE Allocated" an oder wenn das SQL Server-Dienstkonto über gesperrte Seiten im Speicher verfügt.

HINWEIS:

Wenn das SQL Server-Dienstkonto mit dem Konto "Lokales System" (NT Authority \ System) ausgeführt wird, verfügt SQL Server standardmäßig über die Berechtigung "Gesperrte Seiten im Speicher".

Aktualisieren:

Vor SQL Server 2012 für Standard Edition müssen wir das Ablaufverfolgungsflag t -845 aktivieren, um LPIM nutzen zu können. Selbst wenn Sie SQL Server mit einem Konto mit LPIM-Berechtigung ausführen, würde der SQL Server den LPIM-Vorteil nur verwenden, wenn das Ablaufverfolgungsflag aktiviert ist.

Ab 2012 müssen wir das Trace-Flag in der Standard-Edition nicht mehr aktivieren, um den LPIM-Vorteil zu nutzen.

Shanky
quelle
4

Microsoft vereinfacht dies in neueren Versionen des Produkts, wenn Sie wirklich wissen möchten, ob SQL Server mit einem Speichermodell ausgeführt wird, das LPIM nutzt (anstatt über die richtigen Berechtigungen zu verfügen). Diese Informationen befinden sich in sys.dm_os_sys_info, abhängig von Ihrer Version von SQL Server. Die Verbesserung wurde in einem Blog-Beitrag angekündigt :

Mit SQL Server 2016 SP1 und SQL Server 2012 SP4 gibt es zwei neue Spalten, nämlich sql_memory_model und sql_memory_model_desc, die zu sys.dm_os_sys_info hinzugefügt werden, um zu ermitteln, ob dem SQL Server-Dienstkonto LPIM-Berechtigungen zugewiesen wurden.

Beachten Sie, dass die neuen Spalten das SQL-Speichermodell angeben, das seit dem Start der SQL Server-Instanz verwendet wird. Hierbei handelt es sich um die gewünschten Informationen. Auf Betriebssystemebene werden keine Prüfungen auf LPIM-Berechtigungen für das SQL-Dienstkonto durchgeführt. Wenn während des SQL Server-Starts das LPIM-Privileg im SQL Server-Dienstkonto-Prozesstoken vorhanden ist, verwendet SQL Server gesperrte Seiten (nicht auslagerbar), um SQL-Speicher zuzuweisen. Wenn Sie SQL Server Enterprise Edition mit LPIM-Berechtigungen ausführen, die dem SQL-Dienstkonto und dem aktivierten Ablaufverfolgungsflag 834 zugewiesen sind, verwendet SQL Server große Seiten, um SQL-Speicher zuzuweisen.

Um zu überprüfen, ob die Berechtigung "Seiten im Speicher sperren" für eine bestimmte SQL Server-Instanz gültig ist, können Sie sql_memory_model in sys.dm_os_sys_info abfragen und nach Werten suchen, die größer als 1 sind.

Wenn im Prozess-Token des Dienstkontos keine LPIM-Berechtigungen vorhanden sind, wird ein herkömmliches Speichermodell verwendet und dasselbe wird von DMV gemeldet (sql_memory_model = 1). Wenn jetzt dem SQL-Server Sperrseiten mit Speicherrechten zugewiesen werden, der SQL-Dienst jedoch nicht neu gestartet wird, meldet DMV weiterhin das herkömmliche Speichermodell, da dies das seit dem Start gültige Speichermodell ist. Nach dem Neustart verwendet SQL Server gesperrte Seiten im Speichermodell und das Gleiche wird von sql_memory_model und sql_memory_model_desc in sys.dm_os_sys_info gemeldet.

Wenn ich die folgende Abfrage auf einem meiner Server ausführe:

SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;

Das aktuell verwendete Speichermodell ist CONVENTIONAL, was bedeutet, dass LPIM zum Zeitpunkt des Serverstarts nicht gewährt wurde. Es ist jedoch möglich, LPIM zu gewähren, den SQL Server-Dienst jedoch nicht neu zu starten. Daher ist diese DMV je nach Art Ihrer Frage möglicherweise nicht für Sie nützlich.

Joe Obbish
quelle