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

17

我正在运行一个 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个回答

32

看起来你正在使用 NORECOVERY 选项进行数据库恢复。你这样做的原因是如果你打算在初始恢复后应用后续的事务日志备份。

如果你只想恢复单个数据库备份,那么请删除 NORECOVERY 子句。如果你正在还原事务日志备份,则最终恢复必须在没有 NORECOVERY 子句的情况下完成,或者如果上一次使用了 NORECOVERY,则可以使用 RESTORE DATABASE DbName WITH RECOVERY 来完成最终恢复。

回答你的问题:

方法1

SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status')

请参阅SQL Server Books Online:DATABASEPROPERTYEX(Transact-SQL)

方法2

查看sys.databases系统视图以确定数据库的当前状态。例如:

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

状态为1表示正在恢复(RESTORING)

有关此系统视图的文档,请参见Sys.Databases


3
在SQL 2008 r2中,state_description现在被改为state_desc。 - Iain
2
@Iain:在 SQL Server 2005 中也是 state_desc。 - Stefan Steiger

3

1
方法二:
SELECT
    state,
    state_desc
     FROM sys.databases
WHERE [name] = 'Databasename'

它给我精确的结果。


1

其他人在使用pyodbc进行RESTORE时遇到了一个类似的问题。 我遇到的问题变体(症状类似于你的问题)最终被发现是一个不正确的bak文件。 使用以下T-SQL可以发现这个问题,查找不正确的.mdf.ldf文件名或数据库名称:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接