แบบสอบถามที่ดีที่สุดที่จะใช้เพื่อตรวจสอบสถานะของฐานข้อมูล SQL Server คืออะไร


20

ฉันต้องการที่จะเรียกใช้แบบสอบถามเพื่อรับข้อมูลที่สำคัญเกี่ยวกับสถานะของฐานข้อมูล เช่นฉันต้องการให้แบบสอบถามสามารถบอกได้ว่าฐานข้อมูลอยู่ในสภาพดีหรือไม่

นี่คือแบบสอบถามที่ฉันสืบทอดมาสำหรับการตรวจสอบนี้:

SELECT name AS [SuspectDB],
  DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
  DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
  DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency],
  has_dbaccess(name) AS [HasDBAccess]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
   OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
   OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
   OR (has_dbaccess(name) = 0)

หากเคียวรีนั้นส่งคืนผลลัพธ์ใด ๆ ข้อสันนิษฐานที่กำลังทำอยู่คือฐานข้อมูลอยู่ในสถานะสงสัยหรืออาจไม่ดี

มีวิธีที่ดีกว่าในการทำเช่นนี้?


หากคุณสนใจการตรวจสอบสุขภาพเชิงลึกมากขึ้นคุณอาจต้องการตรวจสอบเคาน์เตอร์วัดประสิทธิภาพ WMI ที่สำคัญกว่าเช่น Deadlocks, Disk IO รอเวลาธุรกรรมต่อวินาทีเป็นต้น

@RQDC - หากคุณกำลังเดินไปบนถนนใน SQL Server 2008 อาจจะง่ายกว่าในการตั้งค่าการจัดการคลังข้อมูล

@brett rogers - 'ดีที่สุด / ดี' ถือว่าเป็นคำถามอัตนัย โปรดวลีอีกครั้ง
CoderHawk

โปรดให้คำแนะนำเกี่ยวกับวิธีการใช้ถ้อยคำใหม่และฉันยินดีที่จะพิจารณา ฉันกำลังมองหา "ดีที่สุด" ใน "การปฏิบัติที่ดีที่สุด" ดูเหมือนว่าวิธีที่เหมาะสมในการวลีให้ฉัน
brett rogers

@ เบร็ท - ดี! ดีใจที่คุณได้ 'ดีที่สุด' :)
CoderHawk

คำตอบ:


12

หากคุณใช้ SQL 2005+ และต้องการส่งคืนชื่อฐานที่ฐานข้อมูลไม่อยู่ในสถานะ "ออนไลน์" ฉันจะใช้สิ่งนี้:

SELECT
    name
FROM sys.databases
WHERE state != 0;

โปรดจำไว้ว่าฐานข้อมูลที่เข้าร่วมในการมิเรอร์หรือบันทึกการจัดส่งจะไม่ออนไลน์หรืออาจเปลี่ยนสถานะเป็นประจำ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ sys.database DMV ดูเอกสารประกอบที่นี่: http://msdn.microsoft.com/en-us/library/ms178534.aspx


9

ฉันจะใช้sys.databases ที่ใหม่กว่าไม่ใช่sydatabaseแต่อย่างอื่นก็โอเค

ไม่อย่างน้อยคุณไม่ต้องการการโทร DATABASEPROPERTY

SELECT
   name, state_desc
FROM
   sys.databases
WHERE
   state IN (4, 5, 6)

2

วิธีที่ฉันพบเพื่อดูสถานะ db คือการใช้ฟังก์ชัน DATABASEPROPERTYEX (ฐานข้อมูลคุณสมบัติ) เช่นนี้:

เลือก DATABASEPROPERTYEX ('AdventureWorks', 'สถานะ')

สถานะเป็นคำอธิบายที่ค่อนข้างดี:

ONLINE = ฐานข้อมูลพร้อมสำหรับการสืบค้น

ออฟไลน์ = ฐานข้อมูลถูกออฟไลน์อย่างชัดเจน

RESTORING = ฐานข้อมูลกำลังถูกกู้คืน

RECOVERING = ฐานข้อมูลกำลังกู้คืนและยังไม่พร้อมสำหรับการสืบค้น

SUSPECT = ฐานข้อมูลไม่สามารถกู้คืนได้

EMERGENCY = ฐานข้อมูลอยู่ในสถานะฉุกเฉินอ่านอย่างเดียว การเข้าถึงถูก จำกัด ให้กับสมาชิกดูแลระบบ

ในบล็อกของ Ola Hallengren (SQL MVP) ในเครื่องมือของเขาเพื่อตรวจสอบความถูกต้องของฐานข้อมูลฉันพบว่าเขาใช้มุมมอง sys.database_recovery_status เพื่อค้นหาสถานะ db ถ้า db มีแถวในมุมมองนี้แสดงว่าเป็นแบบสดและเตะถ้าไม่เป็นแบบออฟไลน์

PS: ฟังก์ชันฐานข้อมูลคุณสมบัติที่คุณใช้จะถูกลบในรุ่นอนาคตดังนั้นฐานข้อมูลคุณสมบัติจะถูกแทนที่


ฉันไม่คิดว่าผู้ถามกำลังมองหาข้อมูลการกู้คืนที่เฉพาะเจาะจง แต่เป็นคำถามสำหรับการตรวจสุขภาพทั่วไป sys.database เป็นจุดที่ดีกว่าในการค้นหาสถานะ db สมมติว่าคุณกำลังทำงานด้วยสิทธิ์เพียงพอที่จะดูฐานข้อมูลออฟไลน์ ถ้ามันไม่ได้อยู่ใน sys.database มันจะถูกปล่อยหรือแยกออก
AndrewSQL

1
ใช่ฉันรู้ว่าคุณหมายถึงอะไร แต่ฉันบอกว่าเขาเพิ่งตรวจสอบว่ามีฐานข้อมูลอยู่ในมุมมองนั้นหรือไม่ถ้าใช่มากกว่าที่เขาปฏิบัติกับฐานข้อมูลที่เข้าถึงได้ถ้าไม่ใช่เขาถือว่าฐานข้อมูลไม่สามารถเข้าถึงได้ ดังนั้นนี่อาจเป็นการตรวจสอบครั้งที่สอง :) สำหรับฉันการตรวจสอบสุขภาพเริ่มต้นที่ดีคือการสอบถามตารางเล็ก ๆ เดียวจากฐานข้อมูลนั้นและหากแบบสอบถามนั้นส่งคืนข้อมูลใด ๆ ฉันจะพิจารณาว่า db สามารถเข้าถึงได้ตั้งแต่แรกเห็น
Marian

2

แทนที่จะค้นหาเงื่อนไขที่เฉพาะเจาะจงฉันจะดูอะไรใน sys.database ที่ state_desc <> 'ONLINE' นอกจากนี้ขึ้นอยู่กับสิ่งที่คุณต้องการทำ has_dbaccess อาจส่งผลบวกที่ผิดพลาด


0

ฉันชอบอันนี้:

SELECT name, state_desc 
FROM   sys.databases

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