Bir SQL Server veritabanının durumunu izlemek için kullanılacak en iyi sorgu nedir?


20

Bir veritabanının durumu hakkında önemli bilgileri almak için bir sorgu çalıştırmak istiyorum. Yani, sorgunun veritabanının iyi durumda olup olmadığını söyleyebilmesini istiyorum.

Bu kontrol için miras aldığım sorgu:

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)

Bu sorgu herhangi bir sonuç döndürürse, yapılan varsayım, veritabanının şüpheli veya potansiyel olarak kötü durumda olduğudur.

Bunu yapmanın daha iyi bir yolu var mı?


Daha ayrıntılı sağlık denetimleriyle ilgileniyorsanız, Deadlock, Disk

@RQDC - SQL Server 2008'de yola çıkıyorsanız Yönetim Veri Yazılımını kurmak muhtemelen daha kolaydır.

@brett rogers - 'En İyi / İyi' öznel sorular olarak kabul edilir. Lütfen yeniden ifade edin.
CoderHawk

Lütfen nasıl yeniden ifade edeceğinize dair bir öneri sunun. Memnuniyetle düşüneceğim. "En iyi uygulama" da olduğu gibi "en iyi" yi arıyorum. Bana ifade etmenin doğru yolu gibi görünüyor.
brett rogers

@brett - iyi! 'en iyi' var sevindim :)
CoderHawk

Yanıtlar:


12

SQL 2005+ kullanıyorsanız ve yalnızca DB "ONLINE" durumunda değil DB adını döndürmek istiyorsanız bunu kullanacağım:

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

Yansıtma veya günlük gönderime katılan veritabanlarının çevrimiçi olmayacağını veya düzenli olarak durum değiştirebileceğini unutmayın. Sys.databases DMV hakkında daha fazla bilgi için buradaki belgelere bakın: http://msdn.microsoft.com/en-us/library/ms178534.aspx


9

Ben daha yeni kullanmayı tercih ediyorum sys.databases değil sydatabases ama aksi takdirde bu Tamam

En az değil, DATABASEPROPERTY çağrılarına ihtiyacınız yok

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

2

db durumunu görmek için buldum yolu şu şekilde DATABASEPROPERTYEX (veritabanı, özellik) işlevini kullanmaktır:

DATABASEPROPERTYEX'i seçin ('AdventureWorks', 'Durum').

Durumlar oldukça açıklayıcıdır:

ONLINE = Veritabanı sorgu için kullanılabilir.

OFFLINE = Veritabanı açıkça çevrimdışına alındı.

RESTORING = Veritabanı geri yükleniyor.

RECOVERING = Veritabanı kurtarılıyor ve henüz sorgular için hazır değil.

SUSPECT = Veritabanı kurtarılmadı.

EMERGENCY = Veritabanı acil durum, salt okunur durumda. Erişim sysadmin üyeleriyle sınırlıdır

İçinde Ola Hallengren blogunda (bir SQL MVP), veritabanı bütünlüğünü doğrulamak için onun aracında, onun bir db durumunu sorgulamak için görünüm sys.database_recovery_status kullanıyor bulundu. Db bu görünümde bir satır varsa, o zaman canlı ve tekme, değilse, çevrimdışı.

Not: Kullandığınız databaseproperty işlevi gelecek sürümlerde kaldırılacaktır, bu nedenle databasepropertyex bunu değiştirecektir.


Askerin özel kurtarma bilgileri aradığını düşünmüyorum, daha ziyade genel sağlık kontrolü için bir sorgu. sys.databases, çevrimdışı veritabanlarını görmek için yeterli ayrıcalıklarla çalıştığınızı varsayarak db durumunu bulmak için daha iyi bir yerdir. Eğer sys.databases içinde değilse, bırakılır veya ayrılır.
AndrewSQL

1
Evet, ne demek istediğini biliyorum, ama db bu görünümde var olup olmadığını kontrol ettiğini söyledim, evet ise, veritabanını erişilebilir olarak değerlendirdiğinden, değilse, db'ye erişilemez olarak davrandı. Yani bu ikinci bir kontrol olabilir :). Bana göre, iyi bir başlangıç ​​sağlık kontrolü bu db herhangi bir küçük tablo sorgulamak olacaktır ve bu sorgu herhangi bir veri döndürürse, ben ilk bakışta erişilebilir db düşünecektim.
Marian

2

Belirli koşulları sorgulamak yerine, sys.databases içinde state_desc <> 'ONLINE' olan herhangi bir şeye bakarım. Ayrıca, ne yapmak istediğinize bağlı olarak, has_dbaccess bazı yanlış pozitifler atabilir.


0

Bunu beğendim:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.