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?
sql-server
sql-server-2008
brett rogers
sumber
sumber
Jawaban:
Jika Anda menggunakan SQL 2005+ dan hanya ingin mengembalikan nama DB di mana DB tidak dalam keadaan "ONLINE", saya akan menggunakan ini:
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
sumber
Saya akan menggunakan sys.databases yang lebih baru bukan sydatabases tetapi jika tidak, ini OK
Tidak sedikit, Anda tidak perlu panggilan DATABASEPROPERTY
sumber
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.
sumber
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.
sumber
Saya suka yang ini:
sumber