Я хочу иметь возможность выполнить запрос, чтобы получить важную информацию о состоянии базы данных. Т.е. я хочу, чтобы запрос мог определить, находится ли база данных в хорошем состоянии.
Это запрос, который я унаследовал для этой проверки:
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)
Если этот запрос возвращает какие-либо результаты, предполагается, что база данных находится в подозрительном или потенциально плохом состоянии.
Есть лучший способ это сделать?
sql-server
sql-server-2008
бретт роджерс
источник
источник
Ответы:
Если вы используете SQL 2005+ и хотите вернуть имя БД только в том случае, если БД не находится в состоянии «ONLINE», я бы использовал это:
Помните, что базы данных, участвующие в зеркалировании или доставке журналов, не будут подключены к сети или могут регулярно менять состояние. Для получения дополнительной информации о DMV sys.databases см. Документацию здесь: http://msdn.microsoft.com/en-us/library/ms178534.aspx
источник
Я бы использовал более новые sys.databases, а не sydatabases, но в противном случае это нормально
Не в последнюю очередь, вам не нужны вызовы DATABASEPROPERTY
источник
способ, который я нашел, чтобы увидеть состояние БД, это использовать функцию DATABASEPROPERTYEX (база данных, свойство), например так:
ВЫБЕРИТЕ DATABASEPROPERTYEX («AdventureWorks», «Статус»).
Статусы довольно понятны:
ONLINE = База данных доступна для запроса.
OFFLINE = База данных была явно отключена.
ВОССТАНОВЛЕНИЕ = База данных восстанавливается.
RECOVERING = База данных восстанавливается и еще не готова к запросам.
SUSPECT = База данных не восстановлена.
EMERGENCY = База данных находится в аварийном состоянии и доступна только для чтения. Доступ ограничен членами сисадмина
В блоге Олы Хелленгрен (SQL MVP), в его инструменте для проверки целостности базы данных, я обнаружил, что он использует представление sys.database_recovery_status для запроса статуса БД. Если у БД есть строка в этом представлении, то она жива и пинает, если нет, то она оффлайн.
PS: используемая вами функция databaseproperty будет удалена в будущих версиях, поэтому databasepropertyex заменяет ее.
источник
Вместо того, чтобы запрашивать конкретные условия, я бы посмотрел на что-нибудь в sys.databases, где state_desc <> 'ONLINE'. Кроме того, в зависимости от того, что вы хотите сделать, has_dbaccess может выдать несколько ложных срабатываний.
источник
Мне нравится этот:
источник