Truy vấn tốt nhất để sử dụng để theo dõi trạng thái của cơ sở dữ liệu SQL Server là gì?


20

Tôi muốn có thể chạy truy vấn để có được thông tin quan trọng về trạng thái của cơ sở dữ liệu. Tức là, tôi muốn truy vấn có thể cho biết cơ sở dữ liệu có ở trạng thái tốt hay không.

Đây là truy vấn mà tôi đã kế thừa cho kiểm tra này:

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)

Nếu truy vấn đó trả về bất kỳ kết quả nào, giả định được đưa ra là cơ sở dữ liệu ở trạng thái nghi ngờ hoặc có khả năng xấu.

Có cách nào tốt hơn để làm điều này?


Nếu bạn quan tâm đến việc kiểm tra sức khỏe chuyên sâu hơn, bạn có thể muốn theo dõi một số bộ đếm hiệu suất WMI quan trọng hơn như Deadlocks, thời gian chờ của đĩa IO, giao dịch mỗi giây, v.v.

@RQDC - Nếu bạn đang đi xuống trong SQL Server 2008, có thể dễ dàng hơn để thiết lập Kho dữ liệu quản lý.

@brett rogers - 'Tốt nhất / Tốt' được coi là những câu hỏi chủ quan. Hãy diễn đạt lại.
CoderHawk

Vui lòng cung cấp một đề xuất về cách viết lại và tôi sẽ vui lòng xem xét nó. Tôi đang tìm kiếm "tốt nhất" như trong "thực hành tốt nhất". Có vẻ như cách thích hợp để diễn đạt nó với tôi.
Brett rogers

@brett - tốt! rất vui vì bạn đã nhận được 'tốt nhất' :)
CoderHawk

Câu trả lời:


12

Nếu bạn đang sử dụng SQL 2005+ và chỉ muốn trả về tên DB trong đó DB không ở trạng thái "TRỰC TUYẾN", tôi sẽ sử dụng điều này:

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

Hãy nhớ rằng cơ sở dữ liệu tham gia phản chiếu hoặc vận chuyển nhật ký sẽ không trực tuyến hoặc có thể thay đổi trạng thái thường xuyên. Để biết thêm thông tin về sys.database DMV, xem tài liệu tại đây: http://msdn.microsoft.com/en-us/l Library / ms178534.aspx


9

Tôi muốn sử dụng các phiên bản mới hơn sys.databases không sydatabases nhưng mặt khác đây là OK

Ít nhất, bạn không cần các cuộc gọi DATABASEPROPERTY

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

2

cách mà tôi thấy để thấy trạng thái db là sử dụng hàm DATABASEPROPERTYEX (cơ sở dữ liệu, thuộc tính), như sau:

CHỌN DATABASEPROPERTYEX ('AdventureWorks', 'Status').

Các trạng thái là khá tự giải thích:

TRỰC TUYẾN = Cơ sở dữ liệu có sẵn để truy vấn.

OFFLINE = Cơ sở dữ liệu đã được thực hiện ngoại tuyến.

RESTORING = Cơ sở dữ liệu đang được khôi phục.

THU HỒI = Cơ sở dữ liệu đang phục hồi và chưa sẵn sàng cho các truy vấn.

SUSPECT = Cơ sở dữ liệu không phục hồi.

KHẨN CẤP = Cơ sở dữ liệu ở trạng thái khẩn cấp, chỉ đọc. Quyền truy cập bị hạn chế đối với các thành viên sysadmin

Trong blog của Ola Hallengren (SQL MVP), trong công cụ của mình để xác minh tính toàn vẹn của cơ sở dữ liệu, tôi thấy anh ta đang sử dụng chế độ xem sys.database_recovery_status để truy vấn trạng thái db. Nếu db có một hàng trong chế độ xem này, thì nó trực tiếp và đá, nếu không, nó ngoại tuyến.

PS: chức năng databaseproperty mà bạn sử dụng sẽ bị xóa trong các phiên bản trong tương lai, vì vậy databasepropertyex sẽ thay thế nó.


Tôi không nghĩ rằng người hỏi đang tìm kiếm thông tin phục hồi cụ thể, mà là một truy vấn để kiểm tra sức khỏe tổng quát. sys.database là vị trí tốt hơn để tìm trạng thái db giả sử bạn đang chạy với đủ đặc quyền để xem cơ sở dữ liệu ngoại tuyến. Nếu nó không có trong sys.database, nó sẽ bị rớt hoặc tách ra.
AndrewQuery

1
Vâng, tôi biết ý của bạn là gì, nhưng tôi đã nói rằng anh ta chỉ kiểm tra xem db có tồn tại trong chế độ xem đó không, nếu có, hơn là anh ta coi cơ sở dữ liệu là có thể truy cập, nếu không, anh ta coi db là không thể truy cập. Vì vậy, đây có thể là một kiểm tra thứ hai :). Đối với tôi, kiểm tra sức khỏe bắt đầu tốt sẽ là truy vấn bất kỳ bảng nhỏ nào từ db đó và nếu truy vấn đó trả về bất kỳ dữ liệu nào, tôi sẽ xem xét db có thể truy cập ngay từ cái nhìn đầu tiên.
Mary

2

Thay vì truy vấn các điều kiện cụ thể, tôi sẽ xem xét mọi thứ trong cơ sở dữ liệu sys.dat trong đó state_desc <> 'TRỰC TUYẾN'. Ngoài ra, tùy thuộc vào những gì bạn muốn làm, has_dbaccess có thể đưa ra một số kết quả dương tính giả.


0

Tôi thích cái này:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
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.