Làm cách nào tôi có thể xác định một cách đáng tin cậy nếu một phiên bản SQL Server cụ thể có Trang khóa Khóa trong Bộ nhớ đúng không?


12

Quyền "Khóa trang trong bộ nhớ" có thể được cấp cho tài khoản dịch vụ được sử dụng bởi SQL Server. Điều này cho phép SQL Server ngăn bộ nhớ được phân trang vào đĩa.

Tôi đã nhận thấy một số máy SQL Server của chúng tôi không được cấu hình chính sách cục bộ để cho phép quyền này đối với tài khoản dịch vụ được sử dụng bởi SQL Server. Vì chúng tôi có một số lượng lớn máy chủ, nên sẽ rất tẻ nhạt khi kiểm tra thủ công từng máy bằng cách sử dụng bảng điều khiển quản lý "Chính sách hệ thống cục bộ".

Có một truy vấn T-SQL, thủ tục lưu trữ mở rộng hoặc một số phương pháp khác mà tôi có thể sử dụng để xác định xem máy chủ đang đề cập có đúng hay không?

Tôi muốn không sử dụng EXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted';vì nó dựa trên việc kiểm tra lỗi SQL Server đăng nhập hiện hành; và nhật ký lỗi đó có thể không chứa mục nhập có liên quan giả sử nhật ký đã được cuộn lại kể từ khi máy chủ được khởi động lại lần cuối. Tôi nhận ra tôi có thể kiểm tra các bản ghi cũ bằng cách thay đổi các tham số đầu tiên từ 0đến 1, vv, tuy nhiên chúng tôi chỉ giữ lại 10 bản ghi lỗi, và đó có thể không đủ. Tôi muốn một cách không an toàn để xác nhận cài đặt.

Câu trả lời:


11

Nếu xp_cmdshelllà một tùy chọn, đây là một tập lệnh sử dụng 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.execó khả năng báo cáo tất cả các quyền được giữ bởi việc thực thi tài khoản whoami. Điều này, kết hợp với việc xp_cmdshellcung cấp một cách đáng tin cậy để xác định xem phiên bản của SQL Server có quyền cần thiết để khóa các trang trong bộ nhớ hay không.

Nếu xp_cmdshellkhông được bật, mã này trả về UNKNOWN. Giả sử xp_cmdshell được bật và quyền được kích hoạt cho tài khoản SQL Server, nó sẽ trả về ENABLED, nếu không nó sẽ trả về DISABLED.


9

Có những phương pháp khác là tốt. Có lẽ bạn có thể sử dụng hai DMV. Xin lưu ý rằng cả hai sẽ chỉ hoạt động cho SQL Server 2008 trở lên.

Giá trị khác không locked_page_allocations_kbcho bạn biết rằng tài khoản SQL Server có các trang bị khóa trong đặc quyền bộ nhớ.

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'

... và:

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

Nếu cột Locked_pages_allocation_KBhiển thị giá trị khác không thì tài khoản dịch vụ SQL Server cũng có các trang bị khóa trong đặc quyền bộ nhớ.

... và:

Phần "Trình quản lý bộ nhớ" của DBCC MEMORYSTATUSđầu ra sẽ hiển thị giá trị khác không cho "AWE Allocated" hoặc nếu tài khoản dịch vụ SQL Server có các trang bị khóa trong đặc quyền bộ nhớ.

GHI CHÚ:

Nếu tài khoản dịch vụ SQL Server đang chạy với tài khoản Hệ thống cục bộ (NT Author \ System), theo mặc định, SQL Server sẽ có các trang bị khóa trong đặc quyền bộ nhớ.

Cập nhật:

Trước SQL Server 2012 cho Phiên bản Chuẩn, chúng tôi cần bật cờ theo dõi t -845 để tận dụng lợi thế của LPIM. Ngay cả khi bạn đang chạy SQL Server với tài khoản có đặc quyền LPIM, SQL Server sẽ không thực sự sử dụng lợi thế LPIM trừ khi cờ theo dõi được bật.

Từ năm 2012 trở đi, chúng tôi không cần bật cờ theo dõi trong phiên bản tiêu chuẩn để tận dụng lợi thế LPIM.


4

Microsoft làm điều này dễ dàng hơn trong các phiên bản mới hơn của sản phẩm nếu điều bạn thực sự muốn biết là nếu SQL Server đang chạy với mô hình bộ nhớ có lợi thế LPIM (trái ngược với việc có quyền). Thông tin này có trong sys.dm_os_sys_info tùy thuộc vào phiên bản SQL Server của bạn. Cải tiến đã được công bố trong một bài đăng trên blog :

Với SQL Server 2016 SP1 và SQL Server 2012 SP4, có hai cột mới viz sql_memory_model và sql_memory_model_desc được thêm vào sys.dm_os_sys_info có thể được sử dụng để xác định nếu các quyền Khóa trong bộ nhớ (LPIM) được gán cho tài khoản SQL.

Một điều quan trọng cần lưu ý là, các cột mới báo cáo mô hình bộ nhớ sql được sử dụng kể từ khi khởi động phiên bản SQL Server là thông tin mong muốn. Không có kiểm tra nào được thực hiện ở cấp HĐH cho quyền LPIM cho tài khoản dịch vụ sql. Nếu trong quá trình khởi động SQL Server, đặc quyền LPIM có trong mã thông báo quy trình tài khoản dịch vụ máy chủ SQL, SQL Server sử dụng các trang bị khóa (không thể phân trang) để phân bổ bộ nhớ sql. Hơn nữa, nếu bạn đang chạy phiên bản Enterprise của SQL Server với các đặc quyền LPIM được gán cho tài khoản dịch vụ sql và cờ theo dõi 834 được BẬT, SQL Server sử dụng các trang lớn để phân bổ bộ nhớ sql.

Để kiểm tra xem các trang Khóa trong đặc quyền bộ nhớ có hiệu lực đối với phiên bản SQL Server cụ thể không, bạn có thể truy vấn sql_memory_model trong sys.dm_os_sys_info và tìm giá trị lớn hơn 1.

Nếu quyền LPIM bị thiếu trong mã thông báo quy trình tài khoản dịch vụ, mô hình bộ nhớ thông thường được sử dụng và DMV (sql_memory_model = 1) được báo cáo tương tự. Nếu bây giờ, các trang khóa trong đặc quyền bộ nhớ được gán cho máy chủ SQL nhưng dịch vụ SQL không được khởi động lại, DMV sẽ tiếp tục báo cáo mô hình bộ nhớ thông thường vì đó là mô hình bộ nhớ có hiệu lực kể từ khi khởi động. Sau khi khởi động lại, SQL Server sử dụng các trang bị khóa trong mô hình bộ nhớ và điều tương tự được báo cáo bởi sql_memory_model và sql_memory_model_desc trong sys.dm_os_sys_info.

Nếu tôi chạy truy vấn sau trên một trong các máy chủ của mình:

SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;

Mô hình bộ nhớ hiện đang sử dụng là CONVENTIONAL, điều đó có nghĩa là LPIM không được cấp tại thời điểm máy chủ khởi động. Tuy nhiên, có thể cấp LPIM nhưng không khởi động lại dịch vụ SQL Server, vì vậy DMV này có thể không hữu ích cho bạn tùy thuộc vào bản chất chính xác của câu hỏi của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.