2009-08-20 9 views
11

Estoy ejecutando un script T-SQL que descarta una base de datos y luego la restaura. La secuencia de comandos se ejecuta en una base de datos de SQL Server 2008. A veces hay un problema con el archivo de copia de seguridad y la base de datos se atasca en el estado de restauración.Comprobando si la base de datos está restaurando el estado

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 próxima vez que el script se ejecuta la secuencia de comandos genera el mensaje de error

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

¿Cuál es la mejor manera de comprobar si la base de datos se encuentra en estado de restauración antes de intentar ejecutar el comando ALTER DATABASE?

EDITAR: El comando RESTORE DATABASE que estoy ejecutando no utiliza la opción NO RECOVERY.

Respuesta

23

Parece que está realizando una restauración de la base de datos con la opción NORECOVERY. La razón por la que desearía hacer esto es si planeaba aplicar copias de seguridad posteriores del registro de transacciones después de la restauración inicial.

Si solo desea restaurar una única copia de seguridad de la base de datos, elimine la cláusula NORECOVERY. Si está restaurando copias de seguridad de registros de transacciones, la restauración final debe realizarse sin la cláusula NORECOVERY o si la última se aplicó con NORECOVERY puede finalizar RESTORE DATABASE DbName WITH RECOVERY.

Para responder a su pregunta:

Método 1

SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status') 

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

Método 2

Revisión de la vista del sistema sys.databases para determinar el curren t estado de una base de datos. Por ejemplo:

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

Un estado de 1 = RESTABLECIMIENTO

Ver Sys.Databases para la documentación con respecto a este punto de vista del sistema.

+3

state_description ahora es state_desc en SQL 2008 r2 – Iain

+2

@Iain: también es state_desc en SQL-Server 2005 –

1

Otros tenían un similar problem haciendo un RESTORE con pyodbc. Mi variation of the problem (con síntomas similares a los suyos) resultó ser un archivo bak incorrecto. Esto puede ser descubierto con la siguiente T-SQL, en busca de .mdf incorrecta o .ldf nombres de archivo o base de datos:

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

Método 2:

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

Es dame resultado exacto.

Cuestiones relacionadas