如何可靠地确定给定的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个错误日志,这可能是不够的。我想要确认设置的故障保护方法。

Answers:


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_cmdshell提供了一种可靠的方法来确定SQL Server实例是否具有将页锁定在内存中的必要权限。

如果xp_cmdshell未启用,则此代码返回UNKNOWN。假设xp_cmdshell 启用,并且为SQL Server帐户启用了权限,则返回ENABLED,否则返回DISABLED


9

还有其他方法。也许您可以使用两个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

如果column Locked_pages_allocation_KB显示的值非零,则SQL Server服务帐户也具有“锁定页面的内存”特权。

...和:

输出的“内存管理器”部分DBCC MEMORYSTATUS将显示“分配的AWE”或SQL Server服务帐户具有“内存中的锁定页面”特权的非零值。

注意:

如果SQL Server服务帐户与本地系统(NT Authority \ System)帐户一起运行,则默认情况下,SQL Server将具有“锁定页面在内存中”特权。

更新:

在SQL Server 2012 Standard Edition之前,我们需要启用跟踪标志t -845才能利用LPIM。即使您使用具有LPIM特权的帐户运行SQL Server,除非启用了跟踪标志,否则SQL Server实际上不会使用LPIM优势。

从2012年起,我们无需启用标准版中的跟踪标志即可利用LPIM。


4

如果您真正想知道的是SQL Server是否正在使用利用LPIM的内存模型(而不是具有正确的权限)运行,Microsoft会在产品的新版本中使此操作变得更容易。此信息位于sys.dm_os_sys_info中,具体取决于您的SQL Server版本。该增强功能已在博客文章中宣布:

使用SQL Server 2016 SP1和SQL Server 2012 SP4,有两个新列即sys_dm_os_sys_info中添加的sql_memory_model和sql_memory_model_desc,可用于标识是否将内存中的锁定页面(LPIM)权限分配给了SQL Server服务帐户。

要注意的一件事是,新列报告自启动SQL Server实例以来正在使用的sql内存模型,这是所需的信息。没有在操作系统级别上检查SQL服务帐户的LPIM权限。如果在SQL Server启动期间,SQL Server服务帐户进程令牌中存在LPIM特权,则SQL Server使用锁定的页面(不可分页)来分配sql内存。此外,如果您运行的SQL Server企业版具有分配给sql服务帐户的LPIM特权,并且跟踪标志834已打开,则SQL Server将使用大页来分配sql内存。

要检查“给内存中的锁定页”特权是否对给定的SQL Server实例有效,可以在sys.dm_os_sys_info中查询sql_memory_model并查找大于1的值。

如果服务帐户进程令牌中缺少LPIM权限,则使用常规内存模型,并且DMV将报告相同的内存模型(sql_memory_model = 1)。如果现在已将内存特权中的锁定页面分配给SQL Server,但SQL服务没有重新启动,则DMV将继续报告常规内存模型,因为这是自启动以来一直有效的内存模型。重新启动后,SQL Server使用内存模型中的锁定页面,并且sql.memory_model和sql_memory_model_desc在sys.dm_os_sys_info中报告了相同的页面。

如果我在其中一台服务器上运行以下查询:

SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;

当前使用的内存模型为CONVENTIONAL,这意味着在服务器启动时未授予LPIM。但是,可以授予LPIM但不重新启动SQL Server服务,因此,根据问题的确切性质,此DMV对您可能没有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.