数据库"DBName"的日志尾部未被备份。

55

我尝试使用以下查询语句还原数据库:

ALTER DATABASE [DatabaseName] SET Single_User WITH Rollback Immediate GO
RESTORE DATABASE DatabaseName FROM DISK = 'C:\DBName-Full Database Backup'
ALTER DATABASE [DatabaseName] SET Multi_User GO

但是我在恢复数据库时,遇到了以下错误:

Msg 3159,级别 16,状态 1,行 2

数据库“DatabaseName”的日志尾部未备份。如果日志中包含您不想丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 来备份日志。使用 RESTORE 语句的 WITH REPLACEWITH STOPAT 子句仅覆盖日志内容。Msg 3013,级别 16,状态 1,行 2 RESTORE DATABASE 异常终止。


在我的情况下,这是因为我已经在同一个 SQL Server 上有了一个同名的数据库。我只需删除具有相同名称的数据库并运行还原命令即可。注意:我删除了具有相同名称的数据库,因为它是我不再需要的旧副本。但是,如果您仍然需要旧副本,则可以备份它或重命名旧数据库或新数据库。但是,如果您没有具有相同名称的数据库,则应按照错误消息所要求的操作。 - nam
5个回答

117

如果您不关心现有的数据库或日志,那么您收到的错误消息会告诉您需要做什么。

RESTORE DATABASE DAtabaseName FROM DISK = 'C:\DBName-Full Database Backup' 
WITH REPLACE

在SQL Server Management Studio(Tasks > Restore)中,您可以通过打开左侧的“选项”页面并勾选“覆盖现有数据库”来添加WITH REPLACE选项。


还有一个运输问题。必须运行 USE master; ALTER DATABASE RAVEN SET RECOVERY SIMPLE; 只需记得在完成后将其改回 FULL。 - Yogurt The Wise

31

对于那些使用 Management Studio 的人,应该可以使用以下方法:

在此输入图像描述


如果您通常从SSMS生成脚本,则它基本上只在[With]参数列表中添加一个[replace]关键字。 - Iman
图片不再可见 :/ - rpr
1
@rpr,我这边显示正常。顺便说一下,我已经把它上传到这里供您使用:https://imgur.com/a/ki9elxa - Adil Malik

7

或者,您可以将数据库恢复模型更改为简单而不是完整

  1. 右键单击数据库
  2. 选择属性->选项
  3. 恢复模型更改为简单

然后,您编写的内容应该可以正常工作,而不会产生错误。

我用这种方法也成功了。


2

或者,您可以将数据库恢复模式更改为“简单”而不是“完整”。

右键单击数据库,选择“属性”,“选项”,将“恢复模式”更改为“简单”。

然后,您所编写的内容应该可以正常运行,而不会产生错误。


0
使用BACKUP LOG WITH NORECOVERY备份日志,如果其中包含您不想丢失的工作。
使用RESTORE语句的WITH REPLACE或WITH STOPAT子句,只需覆盖日志的内容。
实际上,这就是答案。在消息中就在那里。你想做什么?备份尾部以避免丢失?替换未备份的日志?由你决定。

1
由于我很少使用SQL Server,我通过转到任务、备份并执行备份来备份数据库,现在想要恢复它,但它不让我这样做,所以我不确定上述错误的原因,大多数论坛都说可以正常工作而没有任何错误。 - tereško
4
这个错误提示您,如果继续进行还原操作,将会丢失当前日志的末尾。换句话说,一些操作尚未备份。它提供了两个选项:要么备份当前日志的末尾以便在其他位置或稍后进行还原,以保留其内容;要么使用RESTORE的WITH REPLACE子句,告诉SQL Server您不关心当前日志末尾可能会丢失的操作,并且只是简单地用正在还原的备份文件中的内容替换当前内容。 - Remus Rusanu

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