Який найкращий запит використовувати для моніторингу стану бази даних SQL Server?


20

Я хочу мати змогу запустити запит, щоб отримати важливу інформацію про стан бази даних. Тобто, я хочу, щоб запит мав змогу сказати, чи є база даних у хорошому стані.

Це запит, який я успадкував для цієї перевірки:

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)

Якщо цей запит повертає якісь результати, робиться припущення про те, що база даних знаходиться в підозрілому або потенційно поганому стані.

Чи є кращий спосіб зробити це?


Якщо вас цікавлять більш глибокі перевірки стану здоров’я, можливо, ви захочете відстежувати деякі важливіші лічильники продуктивності WMI, такі як тупики, час очікування дискового

@RQDC - Якщо ви їдете по дорозі в SQL Server 2008, можливо, простіше створити Управління інформаційними даними.

@brett rogers - "Кращий / хороший" вважаються суб'єктивними питаннями. Будь ласка, переформулюйте фразу.
CoderHawk

Надайте, будь ласка, пропозицію щодо перефразовування, і я з радістю розгляну це. Я шукаю "найкраще", як у "найкращій практиці". Здається, це правильний спосіб викласти це мені.
Бретт Роджерс

@brett - добре! рада, що ви отримали "найкраще" :)
CoderHawk

Відповіді:


12

Якщо ви використовуєте SQL 2005+ або хочете повернути ім'я БД лише там, де БД не перебуває у стані "ONLINE", я б це використав:

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

Пам’ятайте, що бази даних, що беруть участь у дзеркальному відображенні або доставці журналів, не будуть в Інтернеті або можуть регулярно змінювати стан. Для отримання додаткової інформації про sys.databases DMV див. Документацію тут: http://msdn.microsoft.com/en-us/library/ms178534.aspx


9

Я б використовував новіші sys.databases не sydatabases, але в іншому випадку це нормально

Не в останню чергу, вам не потрібні дзвінки DATABASEPROPERTY

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

2

так, як я виявив бачити статус db, - це використовувати функцію DATABASEPROPERTYEX (база даних, властивість), наприклад:

Виберіть DATABASEPROPERTYEX ('AdventureWorks', 'Status').

Статуси досить зрозумілі:

ONLINE = База даних доступна для запиту.

OFFLINE = База даних явно була взята в автономний режим.

RESTORING = База даних відновлюється.

RECOVERING = База даних відновлюється і ще не готова до запитів.

SUSPECT = База даних не відновилася.

EMERGENCY = База даних знаходиться в аварійному стані, лише для читання. Доступ обмежений членами sysadmin

У своєму блозі Ола Галленгрена (SQL MVP), в його інструменті для перевірки цілісності бази даних я виявив, що він використовує view sys.database_recovery_status для запиту стану DB. Якщо у db є рядок у цьому режимі перегляду, то він живий і натискає, якщо ні, це офлайн.

PS: функція властивостей баз даних, яку ви використовуєте, буде видалена в наступних версіях, тому databasepropertyex замінює її.


Я не думаю, що запитувач шукав конкретну інформацію про відновлення, а скоріше запит на загальну перевірку здоров’я. sys.databases - це краще місце для пошуку статусу db, якщо ви працюєте з достатніми привілеями для перегляду офлайн-баз даних. Якщо його немає в sys.databases, він випадає або відривається.
AndrewSQL

1
Так, я знаю, що ви маєте на увазі, але я сказав, що він просто перевіряє, чи існує db в такому представленні, якщо так, то він ставився до бази даних як до доступної, якщо ні, він вважав db недоступним. Тож це може бути друга перевірка :). Для мене точним початком перевірки стану здоров'я буде запит будь-якої єдиної невеликої таблиці з цього db, і якщо цей запит поверне будь-які дані, я вважаю, що db є доступним з першого погляду.
Маріан

2

Замість того, щоб запитувати конкретні умови, я перегляну будь-що в базі sys.databases, де state_desc <> 'ONLINE'. Крім того, залежно від того, що ви хочете зробити, has_dbaccess може викинути деякі помилкові позитиви.


0

Мені подобається цей:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.