我正在运行一个删除数据库的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选项。
答案 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 problem与RESTORE
进行了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'
这是给我准确的结果。