2009-08-20 10 views
11

Używam skryptu T-SQL, który usuwa bazę danych, a następnie ją przywraca. Skrypt działa na bazie danych SQL Server 2008. Czasami występuje problem z plikiem kopii zapasowej i baza danych utknie w stanie przywracania.Sprawdzanie, czy baza danych przy przywracaniu stanu

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 

Następnym razem skrypt uruchamia skrypt generuje komunikat o błędzie

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

Jaki jest najlepszy sposób, aby sprawdzić, czy baza danych jest w stanie przywracającej przed próbą uruchomienia polecenia ALTER DATABASE?

EDYCJA: Komenda RESTORE DATABASE, którą uruchomiłem, nie korzysta z opcji BEZ ODZYSKIWANIA.

Odpowiedz

23

Wygląda na to, że wykonuje się przywracanie bazy danych za pomocą opcji NORECOVERY. Powodem, dla którego chcesz to zrobić, jest to, że planujesz zastosować kolejne kopie dzienników transakcji po początkowym przywróceniu.

Jeśli chcesz przywrócić tylko jedną kopię zapasową bazy danych, usuń klauzulę NORECOVERY. Jeśli przywracasz kopie zapasowe dzienników transakcji, ostateczne odtworzenie musi zostać wykonane bez klauzuli NORECOVERY lub jeśli ostatnia została zastosowana z NORECOVERY, aby można było wykonać ostateczną wersję RESTORE DATABASE DbName WITH RECOVERY.

Aby odpowiedzieć na to pytanie:

Metoda 1

SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status') 

Zobacz SQL Server Books Online: DATABASEPROPERTYEX (Transact-SQL)

Metoda 2

Przegląd widok System sys.databases w celu ustalenia waluty t stan bazy danych. Na przykład:

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

Stan 1 = PRZYWRÓCENIU

Zobacz Sys.Databases dla dokumentacji odnośnie tego punktu widzenia systemu.

+3

state_description jest teraz state_desc w SQL 2008 r2 – Iain

+2

@Iain: To także state_desc w SQL-Server 2005 –

1

Inni mieli similar problem robi RESTORE z pyodbc. Mój variation of the problem (z podobnymi objawami jak twój) okazał się nieprawidłowym plikiem bak. To może być wykryte za pomocą następującego T-SQL, szukając nieprawidłowy .mdf lub .ldf nazw plików lub nazw baz danych:

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

Metoda 2:

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

Jest mi dać dokładny wynik.