检查数据库是否处于恢复状态

时间:2009-08-20 13:36:43

标签: sql-server tsql

我正在运行一个删除数据库的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 个答案:

答案 0 :(得分:24)

听起来好像是使用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.Databases

答案 1 :(得分:3)

SELECT DATABASEPROPERTYEX('MyDb','Status')

答案 2 :(得分:1)

其他人similar problemRESTORE进行了pyodbc。我的variation of the problem(与你的症状相似)原来是一个不正确的bak文件。可以使用以下T-SQL发现这一点,查找不正确的.mdf.ldf文件名或数据库名称:

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

答案 3 :(得分:1)

方法2:

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

这是给我准确的结果。