2009-08-20 8 views
11

Я запускаю сценарий 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?

EDIT: команда RESTORE DATABASE, с которой я работаю, не использует параметр NO RECOVERY.

ответ

23

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

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

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

Метод 1

SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status') 

См SQL Server Books Online: DATABASEPROPERTYEX (Transact-SQL)

Метод 2

Обзор вид системы sys.databases для определения t состояния базы данных. Например:

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

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

См Sys.Databases для документации по этой точки зрения системы.

+3

state_description теперь state_desc в SQL 2008 r2 – Iain

+2

@Iain: это также state_desc в SQL Server 2005 –

1

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

RESTORE FILELISTONLY FROM DISK = N'C:\dbname.bak' 
1

Метод 2:

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

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

Смежные вопросы