주어진 SQL Server 인스턴스에 "메모리의 페이지 잠금"권한이 있는지 어떻게 확인할 수 있습니까?


12

SQL Server에서 사용하는 서비스 계정에 "메모리의 페이지 잠금"권한을 부여 할 수 있습니다. 이를 통해 SQL Server는 메모리가 디스크에 페이징되지 않도록 할 수 있습니다.

일부 SQL Server 컴퓨터에는 SQL Server에서 사용하는 서비스 계정에 대해이 권한을 허용하도록 로컬 정책이 구성되어 있지 않습니다. 많은 서버가 있으므로 "로컬 시스템 정책"관리 콘솔을 사용하여 각 서버를 수동으로 확인하는 것이 지루합니다.

T-SQL 쿼리, 확장 저장 프로 시저 또는 문제의 서버에 권한이 있는지 확인하는 데 사용할 수있는 다른 방법이 있습니까?

현재 SQL Server 오류 로그를 확인하는 데 의존 하기 때문에 사용 하고 싶지 않습니다EXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted'; . 서버가 마지막으로 다시 시작된 이후 로그가 롤오버되었다고 가정하면 해당 오류 로그에 관련 항목이 포함되지 않을 수 있습니다. 첫 번째 매개 변수를 0to 1등 으로 수정하여 이전 로그를 확인할 수는 있지만 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

다른 방법들도 있습니다. 두 개의 DMV를 사용할 수 있습니다. 둘 다 SQL Server 2008 이상에서만 작동합니다.

0이 아닌 값은 locked_page_allocations_kbSQL 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_KB0이 아닌 값이 표시 되면 SQL Server 서비스 계정에도 메모리에 잠금 페이지 권한이있는 것입니다.

...과:

출력의 "메모리 관리자"섹션 DBCC MEMORYSTATUS에는 "AWE 할당 됨"또는 SQL Server 서비스 계정에 잠금 페이지의 메모리 권한이있는 경우 0이 아닌 값이 표시됩니다.

노트:

SQL Server 서비스 계정이 로컬 시스템 (NT Authority \ System) 계정으로 실행되는 경우 기본적으로 SQL Server는 메모리에서 잠금 페이지를 갖습니다.

최신 정보:

SQL Server 2012 for Standard Edition 이전에 LPIM을 활용하려면 추적 플래그 t -845를 활성화해야합니다. LPIM 권한이있는 계정으로 SQL Server를 실행하더라도 추적 플래그를 사용하지 않으면 SQL Server는 실제로 LPIM 이점을 사용하지 않습니다.

2012 년부터 LPIM을 활용하기 위해 Standard Edition에서 추적 플래그를 활성화 할 필요가 없습니다.


4

Microsoft는 SQL Server가 LPIM을 활용하는 메모리 모델로 실행 중인지 (올바른 사용 권한이 아닌) 최신 버전의 제품에서이를 더 쉽게 만듭니다. 이 정보는 SQL Server 버전에 따라 sys.dm_os_sys_info 에 있습니다. 개선 사항은 블로그 게시물 에서 발표되었습니다 .

SQL Server 2016 SP1 및 SQL Server 2012 SP4에는 sys.dm_os_sys_info에 추가 된 두 개의 viz sql_memory_model 및 sql_memory_model_desc 열이 있습니다.이 열은 LPIM (메모리 잠금 페이지) 권한이 SQL Server 서비스 계정에 할당되어 있는지 식별하는 데 사용할 수 있습니다.

알아야 할 중요한 사항 중 하나는 새 정보 열이 SQL Server 인스턴스 시작 이후 사용중인 SQL 메모리 모델을보고한다는 것입니다. sql 서비스 계정에 대한 LPIM 권한에 대한 OS 레벨 검사는 수행되지 않습니다. SQL Server 시작 중에 LPIM 권한이 SQL Server 서비스 계정 프로세스 토큰에 존재하면 SQL Server는 잠긴 페이지 (페이지를 사용할 수 없음)를 사용하여 SQL 메모리를 할당합니다. 또한 SQL 서비스 계정에 할당 된 LPIM 권한과 추적 플래그 834가 설정된 SQL Server Enterprise Edition을 실행하는 경우 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는 메모리 모델에서 잠긴 페이지를 사용하며 sys.dm_os_sys_info의 sql_memory_model 및 sql_memory_model_desc에 의해 동일하게보고됩니다.

내 서버 중 하나에서 다음 쿼리를 실행하면

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.