Apa permintaan terbaik untuk digunakan untuk memantau status database SQL Server?

20

Saya ingin dapat menjalankan kueri untuk mendapatkan informasi penting tentang status database. Yaitu, saya ingin query untuk dapat mengetahui apakah database dalam keadaan baik atau tidak.

Ini adalah kueri yang saya warisi untuk pemeriksaan ini:

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)

Jika kueri itu mengembalikan hasil apa pun, asumsi yang dibuat adalah bahwa database tersebut dalam kondisi tersangka atau berpotensi buruk.

Apakah ada cara yang lebih baik untuk melakukan ini?

brett rogers
sumber
Jika Anda lebih tertarik pada pemeriksaan kesehatan mendalam, Anda mungkin ingin memantau beberapa penghitung kinerja WMI yang lebih penting seperti Deadlock, waktu tunggu IO Disk, transaksi per detik, dll.
@RQDC - Jika Anda menggunakan SQL Server 2008 mungkin lebih mudah untuk mengatur Management Datawarehouse.
@brett rogers - 'Best / Good' dianggap sebagai pertanyaan subjektif. Harap ulang frasa.
CoderHawk
Tolong berikan saran tentang cara mengulangi dan saya akan dengan senang hati mempertimbangkannya. Saya mencari "terbaik" seperti dalam "praktik terbaik". Sepertinya cara yang tepat untuk mengungkapkannya kepadaku.
brett rogers
@ brett - yah! senang bahwa Anda mendapatkan yang 'terbaik' :)
CoderHawk

Jawaban:

12

Jika Anda menggunakan SQL 2005+ dan hanya ingin mengembalikan nama DB di mana DB tidak dalam keadaan "ONLINE", saya akan menggunakan ini:

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

Ingat bahwa database yang berpartisipasi dalam mirroring atau pengiriman log tidak akan online atau dapat berubah status secara teratur. Untuk info lebih lanjut tentang sys.databases DMV lihat dokumentasi di sini: http://msdn.microsoft.com/en-us/library/ms178534.aspx

AndrewSQL
sumber
9

Saya akan menggunakan sys.databases yang lebih baru bukan sydatabases tetapi jika tidak, ini OK

Tidak sedikit, Anda tidak perlu panggilan DATABASEPROPERTY

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

cara yang saya temukan untuk melihat status db adalah dengan menggunakan fungsi DATABASEPROPERTYEX (database, properti), seperti ini:

SELECT DATABASEPROPERTYEX ('AdventureWorks', 'Status').

Statusnya cukup jelas:

ONLINE = Basis data tersedia untuk kueri.

OFFLINE = Database secara eksplisit diambil offline.

RESTORING = Basis data sedang dipulihkan.

RECOVERING = Basis data sedang pulih dan belum siap untuk permintaan.

SUSPECT = Basis data tidak pulih.

EMERGENCY = Database dalam keadaan darurat, hanya baca. Akses dibatasi untuk anggota sysadmin

Dalam blog Ola Hallengren (sebuah MVP SQL), di alatnya untuk memverifikasi integritas basis data, saya menemukan dia menggunakan tampilan sys.database_recovery_status untuk meminta status db. Jika db memiliki baris dalam tampilan ini, maka itu langsung dan menendang, jika tidak, itu offline.

PS: fungsi databaseproperty yang Anda gunakan akan dihapus di versi mendatang, jadi databasepropertyex akan menggantinya.

Marian
sumber
Saya tidak berpikir si penanya mencari informasi pemulihan khusus, melainkan pertanyaan untuk pemeriksaan kesehatan umum. sys.databases adalah tempat yang lebih baik untuk menemukan status db dengan asumsi Anda menjalankan dengan hak istimewa yang cukup untuk melihat database offline. Jika tidak di sys.databases itu jatuh atau terlepas.
AndrewSQL
1
Ya, saya tahu apa yang Anda maksud, tetapi saya mengatakan bahwa ia hanya memeriksa apakah db ada dalam tampilan itu, jika ya, daripada ia memperlakukan database sebagai dapat diakses, jika tidak, ia memperlakukan db sebagai tidak dapat diakses. Jadi ini bisa menjadi cek kedua :). Bagi saya, pemeriksaan kesehatan awal yang baik akan menanyakan setiap tabel kecil dari db itu dan jika permintaan itu mengembalikan data apa pun, saya akan menganggap db dapat diakses pada pandangan pertama.
Marian
2

Daripada permintaan untuk kondisi tertentu, saya akan melihat apa saja di sys.databases di mana state_desc <> 'ONLINE'. Juga, tergantung pada apa yang ingin Anda lakukan, has_dbaccess mungkin membuang beberapa kesalahan positif.

Ben Thul
sumber
0

Saya suka yang ini:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
pembuat isx
sumber