2009-08-20 13 views
11

Sto eseguendo uno script T-SQL che elimina un database e quindi lo ripristina. Lo script viene eseguito su un database SQL Server 2008. A volte c'è un problema con il file di backup e il database si blocca nello stato di ripristino.Controllo del database in stato di ripristino

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 

La prossima volta che lo script viene eseguito lo script genera il messaggio di errore

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

Qual è il modo migliore per verificare se il database è in stato di ripristino prima di tentare di eseguire il comando ALTER DATABASE?

MODIFICA: il comando RESTORE DATABASE che sto utilizzando non utilizza l'opzione NO RECOVERY.

risposta

23

Sembra che si stia eseguendo un ripristino del database con l'opzione NORECOVERY. Il motivo per cui si desidera eseguire questa operazione è se si stesse pianificando l'applicazione di successivi backup del log delle transazioni dopo il ripristino iniziale.

Se si desidera ripristinare un singolo backup del database, rimuovere la clausola NORECOVERY. Se si stanno ripristinando i backup del log delle transazioni, il ripristino finale deve essere eseguito senza la clausola NORECOVERY o se l'ultimo è stato applicato con NORECOVERY per la finalizzazione di RESTORE DATABASE DbName WITH RECOVERY.

Per rispondere alla tua domanda:

Metodo 1

SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status') 

See linea di SQL Server: DATABASEPROPERTYEX (Transact-SQL)

Metodo 2

Review vista di sistema sys.databases per determinare il curren t stato di un database. Per esempio:

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

Uno stato di 1 = RIPRISTINO

Vedi Sys.Databases per la documentazione riguardo a questa vista di sistema.

+3

state_description è ora state_desc in SQL 2008 r2 – Iain

+2

@Iain: è anche state_desc in SQL-Server 2005 –

1

altri avevano un similar problem facendo un RESTORE con pyodbc. Il mio variation of the problem (con sintomi simili ai tuoi) si è rivelato un file bak errato. Questo può essere scoperto con la seguente T-SQL, alla ricerca di errato o .mdf.ldf nomi di file o database:

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

Metodo 2:

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

E 'darmi risultato esatto.

Problemi correlati