Какой запрос лучше всего использовать для мониторинга состояния базы данных 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;

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

AndrewSQL
источник
9

Я бы использовал более новые sys.databases, а не sydatabases, но в противном случае это нормально

Не в последнюю очередь, вам не нужны вызовы DATABASEPROPERTY

SELECT
   name, state_desc
FROM
   sys.databases
WHERE
   state IN (4, 5, 6)
ГБН
источник
2

способ, который я нашел, чтобы увидеть состояние БД, это использовать функцию DATABASEPROPERTYEX (база данных, свойство), например так:

ВЫБЕРИТЕ DATABASEPROPERTYEX («AdventureWorks», «Статус»).

Статусы довольно понятны:

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

OFFLINE = База данных была явно отключена.

ВОССТАНОВЛЕНИЕ = База данных восстанавливается.

RECOVERING = База данных восстанавливается и еще не готова к запросам.

SUSPECT = База данных не восстановлена.

EMERGENCY = База данных находится в аварийном состоянии и доступна только для чтения. Доступ ограничен членами сисадмина

В блоге Олы Хелленгрен (SQL MVP), в его инструменте для проверки целостности базы данных, я обнаружил, что он использует представление sys.database_recovery_status для запроса статуса БД. Если у БД есть строка в этом представлении, то она жива и пинает, если нет, то она оффлайн.

PS: используемая вами функция databaseproperty будет удалена в будущих версиях, поэтому databasepropertyex заменяет ее.

Мэриан
источник
Я не думаю, что спрашивающий искал конкретную информацию для восстановления, а скорее запрос для общей проверки работоспособности. sys.databases - это лучшее место для определения статуса БД, если у вас достаточно прав для просмотра автономных баз данных. Если его нет в sys.database, он удаляется или отключается.
AndrewSQL
1
Да, я знаю, что вы имеете в виду, но я сказал, что он просто проверял, существует ли БД в этом представлении, если да, то он рассматривал базу данных как доступную, если нет, он рассматривал БД как недоступную. Так что это может быть вторая проверка :). Для меня хорошей начальной проверкой работоспособности будет запрос любой маленькой таблицы из этой базы данных, и если этот запрос вернет какие-либо данные, я считаю, что база данных доступна с первого взгляда.
Marian
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
isxaker
источник