不能被覆盖。数据库正在使用它

时间:2017-12-28 10:23:36

标签: sql-server database-restore

RESTORE DATABASE Tes
FROM DISK = '{7522204E-0256-47B3-9864-137D6D1FD449}6' 
WITH MOVE 'Test' TO 'C:\Program Files (x86)\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\Tes.mdf',
MOVE 'Test_log' TO 'C:\Program Files (x86)\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\Tes.ldf'

上面的恢复命令适用于新的dbs,但很少有旧数据库显示错误,如

  

文件' C:\ Program Files(x86)\ Microsoft SQL Server \ MSSQL12.SQLEXPRESS \ MSSQL \ DATA \ db1.mdf'不能被覆盖。它正被数据库' windb'使用。   消息3156,第16级,状态4,第1行   档案' windb'无法还原到' C:\ Program Files(x86)\ Microsoft SQL Server \ MSSQL12.SQLEXPRESS \ MSSQL \ DATA \ db1.mdf'。使用WITH MOVE标识文件的有效位置

我发现只有dbs有多个ndf文件有这个问题..

这个问题有什么解决方案吗?

3 个答案:

答案 0 :(得分:3)

尝试从还原数据库向导还原数据库。为此,在对象资源管理器中,右键单击数据库 - >选择还原数据库... 。在显示的窗口中,设置目标的必要详细信息。在左侧窗格中,选择选项文件,具体取决于您拥有的SSMS版本。

在显示的表格中,找到还原为列。在每一行中,提供一个新文件名,而不是显示的名称。例如,在您的情况下,它可能会将文件名显示为与<Folder Path>\DATA\Tes.mdf<Folder Path>\DATA\Tes.ldf类似的内容。提供 Tes 以外的其他名称。 (DATA文件夹中尚不存在的名称)。

注意:文件名与数据库名称无关,但稍后会很容易引用以提供有意义的名称,以防您必须备份或查找文件

答案 1 :(得分:0)

如果您尝试将数据库移动到新位置,则最好先分离源数据库或首先使其脱机

答案 2 :(得分:0)

在使用MS SQL Server 2012时,我遇到了这个问题。

我正尝试使用下面的脚本还原数据库

USE master;
GO

ALTER DATABASE my_db SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

    
RESTORE DATABASE my_db.dev
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\com.mydb.dev.bak'
    WITH REPLACE,
         STATS = 10,
         RESTART,
    MOVE 'com.mydb.dev' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.mydb.dev.mdf',
    MOVE 'com.mydb.dev_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.mydb.dev_log.ldf'
GO
    
ALTER DATABASE com.mydb.dev SET MULTI_USER;
GO

然后,当我尝试执行还原任务时,这将引发以下错误:

The file 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.mydb.dev.mdf' cannot be overwritten.  It is being used by database restdb

The file 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.mydb.dev_log.ldf' cannot be overwritten.  It is being used by database restdb

这是我修复的方式

问题是我以前用于此数据库还原操作的数据库备份文件曾用于将数据还原到同一服务器上的另一个数据库。

我要做的就是将逻辑文件的物理名称更改为要还原到的数据库的物理名称。从com.mydb.dev.mdfmy_db.mdf,从com.mydb.dev_log.ldfmy_db_log.ldf

USE master;
GO

ALTER DATABASE my_db SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

    
RESTORE DATABASE my_db
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\com.mydb.dev.bak'
    WITH REPLACE,
         STATS = 10,
         RESTART,
    MOVE 'com.my_db.dev' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\my_db.mdf',
    MOVE 'com.mydb.dev_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\my_db_log.ldf'
GO
    
ALTER DATABASE my_db SET MULTI_USER;
GO

这一次,数据库还原任务成功运行。

仅此而已。

我希望这会有所帮助