it-swarm.asia

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

Saya ingin dapat menjalankan kueri untuk mendapatkan informasi penting tentang status database. Yaitu, saya ingin agar kueri 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 berada dalam kondisi tersangka atau berpotensi buruk.

Apakah ada cara yang lebih baik untuk melakukan ini?

21
brett rogers

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

12
AndrewSQL

Saya akan menggunakan yang lebih baru sys.databases tidak sydatabases tetapi selain itu tidak apa-apa

Paling tidak, Anda tidak perlu panggilan DATABASEPROPERTY

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

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 pertanyaan.

SUSPECT = Basis data tidak pulih.

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

Dalam blog Ola Hallengren (sebuah SQL MVP), di alatnya untuk memverifikasi integritas database, 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.

2
Marian

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 positif palsu.

2
Ben Thul

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
1
isxaker