Проверка, находится ли база данных в состоянии восстановления - PullRequest
12 голосов
/ 20 августа 2009

Я запускаю сценарий T-SQL, который удаляет базу данных, а затем восстанавливает ее. Сценарий работает с базой данных SQL Server 2008. Иногда возникает проблема с файлом резервной копии, и база данных застревает в состоянии восстановления.

IF EXISTS (SELECT 1 FROM master.dbo.sysdatabases WHERE name = 'dbname')
BEGIN
    ALTER DATABASE [dbname]
    SET SINGLE_USER WITH 
    ROLLBACK IMMEDIATE
END

IF EXISTS (SELECT 1 FROM master.dbo.sysdatabases WHERE name = 'dbname')
BEGIN
    DROP DATABASE [dbname]
END

RESTORE DATABASE [dbname]
FROM  DISK = N'C:\dbname.bak'
WITH  FILE = 1,
NOUNLOAD,
STATS = 10

При следующем запуске скрипта скрипт выдаст сообщение об ошибке

ALTER DATABASE is not permitted while a database is in the Restoring state.

Как лучше всего проверить, находится ли база данных в состоянии восстановления, прежде чем пытаться выполнить команду ALTER DATABASE?

РЕДАКТИРОВАТЬ: Команда RESTORE DATABASE, которую я выполняю, не использует опцию NO RECOVERY.

Ответы [ 4 ]

25 голосов
/ 20 августа 2009

Звучит так, как будто вы выполняете восстановление базы данных с опцией NORECOVERY. Причина, по которой вы захотите это сделать, заключается в том, что вы планировали применить последующие резервные копии журнала транзакций после первоначального восстановления.

Если вы хотите восстановить только одну резервную копию базы данных, удалите предложение NORECOVERY. Если вы восстанавливаете резервные копии журнала транзакций, окончательное восстановление должно быть выполнено без предложения NORECOVERY или, если последнее было применено с NORECOVERY, вы можете RESTORE DATABASE DbName WITH RECOVERY завершить.

Чтобы ответить на ваш вопрос:

Метод 1

SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status')

См. Электронную документацию по SQL Server: DATABASEPROPERTYEX (Transact-SQL)

Метод 2

Просмотрите системное представление sys.databases, чтобы определить текущее состояние базы данных. Например:

SELECT
    state,
    state_desc
    FROM sys.databases
WHERE [name] = 'DatabaseName'

Состояние 1 = ВОССТАНОВЛЕНИЕ

См. Sys.Database для документации относительно этого системного представления.

3 голосов
/ 20 августа 2009

SELECT DATABASEPROPERTYEX ('MyDb', 'Status')

1 голос
/ 29 марта 2017

Метод 2:

SELECT
    state,
    state_desc
     FROM sys.databases
WHERE [name] = 'Databasename'

Это даст мне точный результат.

1 голос
/ 09 января 2014

У других была похожая проблема , делающая RESTORE с pyodbc. Моя вариация проблемы (с симптомами, похожими на ваши) оказалась неверным файлом bak. Это можно обнаружить с помощью следующего T-SQL, который ищет неправильные .mdf или .ldf имена файлов или базы данных:

RESTORE FILELISTONLY FROM DISK = N'C:\dbname.bak'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...