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

Eri*_*ess 12 t-sql sql-server

我正在运行一个删除数据库然后恢复数据库的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
Run Code Online (Sandbox Code Playgroud)

脚本下次运行时脚本会生成错误消息

ALTER DATABASE is not permitted while a database is in the Restoring state.
Run Code Online (Sandbox Code Playgroud)

在尝试运行ALTER DATABASE命令之前,检查数据库是否处于恢复状态的最佳方法是什么?

编辑:我正在运行的RESTORE DATABASE命令不使用NO RECOVERY选项.

Joh*_*som 25

听起来好像您正在使用该NORECOVERY选项执行数据库还原.您希望这样做的原因是您计划在初始恢复后应用后续事务日志备份.

如果您只希望还原单个数据库备份,请删除该NORECOVERY子句.如果要还原事务日志备份,最后恢复必须没有完成NORECOVERY条款或如果最后与应用NORECOVERY,你可以RESTORE DATABASE DbName WITH RECOVERY敲定.

回答你的问题:

方法1

SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status')
Run Code Online (Sandbox Code Playgroud)

请参见SQL Server联机丛书:DATABASEPROPERTYEX(Transact-SQL)

方法2

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

SELECT
    state,
    state_desc
    FROM sys.databases
WHERE [name] = 'DatabaseName'
Run Code Online (Sandbox Code Playgroud)

状态为1 =恢复

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

  • state_description现在是SQL 2008 r2中的state_desc (3认同)
  • @Iain:它也是SQL-Server 2005中的state_desc (2认同)