ฉันจะพิจารณาอย่างน่าเชื่อถือได้อย่างไรว่าอินสแตนซ์ของ 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 ปัจจุบัน และบันทึกข้อผิดพลาดนั้นอาจไม่มีรายการที่เกี่ยวข้องสมมติว่าบันทึกได้ถูกยกเลิกเนื่องจากเซิร์ฟเวอร์รีสตาร์ทครั้งล่าสุด ฉันรู้ว่าฉันสามารถตรวจสอบบันทึกเก่าโดยแก้ไขพารามิเตอร์แรกจาก0เป็น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.exewhoamiมีความสามารถในการรายงานสิทธิทั้งหมดที่จัดขึ้นโดยบัญชีการดำเนินการ สิ่งนี้รวมกับxp_cmdshellวิธีการที่เชื่อถือได้เพื่อตรวจสอบว่าอินสแตนซ์ของ SQL Server มีสิทธิ์ที่จำเป็นในการล็อกหน้าในหน่วยความจำ

ถ้าไม่ได้เปิดใช้รหัสนี้ผลตอบแทนxp_cmdshell UNKNOWNสมมติว่าxp_cmdshell มีการเปิดใช้งานและขวาถูกเปิดใช้งานสำหรับบัญชี SQL Server ก็จะส่งกลับมิฉะนั้นผลตอบแทนENABLEDDISABLED


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

หากคอลัมน์Locked_pages_allocation_KBแสดงค่าที่ไม่เป็นศูนย์ดังนั้นบัญชีบริการ SQL Server ก็มีหน้าที่ถูกล็อคในสิทธิ์ของหน่วยความจำ

...และ:

ส่วน "ตัวจัดการหน่วยความจำ" ของDBCC MEMORYSTATUSผลลัพธ์จะแสดงค่าที่ไม่ใช่ศูนย์สำหรับ "การจัดสรร AWE" หรือถ้าบัญชีบริการ SQL Server มีหน้าที่ถูกล็อกในสิทธิ์ของหน่วยความจำ

บันทึก:

หากบัญชีบริการ SQL Server ทำงานด้วยบัญชี Local System (NT Authority \ System) โดยค่าเริ่มต้น SQL Server จะมีหน้าที่ถูกล็อคในสิทธิ์ของหน่วยความจำ

ปรับปรุง:

ก่อน SQL Server 2012 สำหรับ Standard Edition เราจำเป็นต้องเปิดใช้งานการตั้งค่าสถานะการติดตาม t -845 เพื่อใช้ประโยชน์จาก LPIM แม้ว่าคุณกำลังเรียกใช้ SQL Server ด้วยบัญชีที่มีสิทธิ์ LPIM SQL Server จะไม่ใช้ประโยชน์จาก LPIM จริง ๆ เว้นแต่ว่าการตั้งค่าสถานะการสืบค้นกลับถูกเปิดใช้งาน

ตั้งแต่ 2012 เป็นต้นไปเราไม่จำเป็นต้องเปิดใช้งานการตั้งค่าสถานะการติดตามในรุ่นมาตรฐานเพื่อใช้ประโยชน์จาก LPIM


4

Microsoft ทำให้สิ่งนี้ง่ายขึ้นในผลิตภัณฑ์รุ่นใหม่ถ้าสิ่งที่คุณต้องการทราบจริงๆคือถ้า SQL Server ทำงานด้วยรุ่นหน่วยความจำที่ใช้ประโยชน์จาก LPIM (ตรงข้ามกับการได้รับสิทธิ์ที่ถูกต้อง) ข้อมูลนี้อยู่ในsys.dm_os_sys_infoขึ้นอยู่กับรุ่นของ SQL Server ของคุณ ประกาศการปรับปรุงในโพสต์บล็อก :

ด้วย SQL Server 2016 SP1 และ SQL Server 2012 SP4 มีคอลัมน์ใหม่สองคอลัมน์ ได้แก่ sql_memory_model และ sql_memory_model_desc ที่เพิ่มไปยัง sys.dm_os_sys_info ซึ่งสามารถใช้เพื่อระบุว่าสิทธิ์การล็อกหน้าในหน่วยความจำ (LPIM) หรือไม่

สิ่งสำคัญสิ่งหนึ่งที่ควรระวังคือคอลัมน์ใหม่รายงานรูปแบบหน่วยความจำ sql ที่ใช้งานตั้งแต่เริ่มต้นอินสแตนซ์ SQL Server ซึ่งเป็นข้อมูลที่ต้องการ ไม่มีการตรวจสอบที่ดำเนินการในระดับระบบปฏิบัติการสำหรับสิทธิ์ LPIM สำหรับบัญชีบริการ sql หากในระหว่างการเริ่มต้นเซิร์ฟเวอร์ SQL สิทธิ์ LPIM จะมีอยู่ในโทเค็นกระบวนการบัญชีบริการเซิร์ฟเวอร์ SQL, SQL Server ใช้เพจที่ถูกล็อค (ไม่เพจ) เพื่อจัดสรรหน่วยความจำ sql นอกจากนี้หากคุณใช้ SQL Server รุ่น Enterprise ที่มีสิทธิ์ LPIM ที่กำหนดให้กับบัญชีบริการ sql และการตั้งค่าสถานะการติดตาม 834 เปิดอยู่ SQL Server จะใช้หน้าเว็บขนาดใหญ่เพื่อจัดสรรหน่วยความจำ sql

ในการตรวจสอบว่าสิทธิ์การล็อกหน้าในหน่วยความจำมีผลกับอินสแตนซ์ของ SQL Server ที่กำหนดหรือไม่คุณสามารถเคียวรี sql_memory_model ใน sys.dm_os_sys_info และค้นหาค่าที่มากกว่า 1

หากไม่มีการอนุญาต LPIM ในโทเค็นกระบวนการบัญชีบริการโมเดลหน่วยความจำทั่วไปจะถูกใช้และรายงานเดียวกันโดย DMV (sql_memory_model = 1) หากตอนนี้หน้าล็อคในสิทธิ์ของหน่วยความจำได้รับการกำหนดให้กับเซิร์ฟเวอร์ SQL แต่ไม่ได้เริ่มบริการ 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 นี้อาจไม่เป็นประโยชน์สำหรับคุณขึ้นอยู่กับลักษณะที่แท้จริงของคำถามของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.