使用NORECOVERY选项恢复数据库时卡在还原状态的问题
SQL Server 完整+差异备份还原问题解决
问题1:数据库卡在还原状态并报错ALTER DATABASE is not permitted while a database is in the Restoring state
原因
使用WITH NORECOVERY还原完整备份后,数据库会进入还原中状态,此时SQL Server禁止执行任何ALTER DATABASE操作(包括切换单/多用户)。原脚本中在还原完整备份后添加的WAITFOR DELAY、ALTER DATABASE SET MULTI_USER等操作完全多余,直接触发了该错误。
问题2:调整脚本后报错日志或差异备份无法还原,因为没有文件可前滚。RESTORE DATABASE 异常终止。
原因
- 差异备份与当前还原的完整备份不属于同一备份链:SQL Server要求差异备份必须基于最近的完整备份创建,两者的日志序列号(LSN)必须匹配。
- 数据库状态异常:可能存在未完成的还原操作或残留的还原锁。
解决方案
1. 修正差异还原的SQL脚本逻辑
遵循SQL Server标准的差异还原流程,去掉所有多余的状态切换操作,直接按顺序还原完整备份+差异备份:
else if (Differential_Opt.Checked == true) // 差异还原分支 { // 还原完整备份,保持NORECOVERY状态以接收差异备份 strTemp = "USE MASTER RESTORE DATABASE [" + DB_NAME + "] FROM DISK = '" + BackupFile_Txt.Text + "' WITH NORECOVERY"; Writer.WriteLine(strTemp); Writer.WriteLine("GO"); // 还原差异备份,使用RECOVERY完成还原,使数据库可用 strTemp = "USE MASTER RESTORE DATABASE [" + DB_NAME + "] FROM DISK = '" + txt_Quick.Text + "' WITH RECOVERY"; Writer.WriteLine(strTemp); Writer.WriteLine("GO"); }
2. 验证备份链的有效性
确认差异备份是基于所选完整备份创建的,执行以下SQL查询验证LSN匹配:
-- 查询完整备份的日志信息 RESTORE HEADERONLY FROM DISK = '你的完整备份路径.Fbk'; -- 查询差异备份的日志信息 RESTORE HEADERONLY FROM DISK = '你的差异备份路径.qbk';
检查完整备份结果中的LastLSN值,是否与差异备份结果中的DatabaseBackupLSN值完全一致。如果不匹配,说明该差异备份无法用于当前完整备份的还原,需要重新获取对应链的差异备份。
3. 确保脚本执行的完整性
原脚本开头的ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATE可以保留,用于强制断开数据库连接,避免还原时的锁冲突。后续的触发器创建、权限配置代码需放在还原完成之后,原脚本的结构已经满足要求。
内容的提问来源于stack exchange,提问作者nikhil
相关产品推荐
相关产品推荐

