我有一个数据库A.它有一些数据。 我为A.bak文件创build了一个备份。 然后我创build一个新的空数据库B.然后我尝试从A.bak恢复B. 但是,SQL服务告诉我以下错误:
文件“C:\ SQL目录\ DATA \ A.mdf”不能被覆盖。 它正在被数据库'A'使用。
但是,如果我从SQL Server中删除A,则retore可以。
我不明白为什么SQL需要写入原始数据库文件,而从一个单独的备份文件恢复?
谢谢〜
如果您还原数据库,SQL Server将默认尝试将所有数据和日志文件还原到其原始位置。 由于原始数据库(“A”)仍在使用这些原始位置,因此恢复将失败。 您需要使用WITH MOVE子句为数据库中的所有文件指定新的位置。
RESTORE DATABASE B FROM DISK = 'A.bak' WITH MOVE 'DataFileLogicalName' TO 'C:\SQL Directory\DATA\B.mdf', MOVE 'LogFileLogicalName' TO 'C:\SQL Directory\DATA\B.ldf', REPLACE --Needed if database B already exists
反正就是这样 使用RESTORE FILELISTONLY FROM DISK …在必要时查看备份中的逻辑文件名。
当您还原备份时,您可以指定要还原的数据文件。
看这里和这里 。 您可以使用“还原数据库文件”选项和“覆盖现有数据库”标志。
您是使用REPLACE选项,在TSQL命令中,还是作为选定的checkbox? 或者,您可以重命名文件,并调用其他的数据库。
你也会发现恢复正在使用的数据库有一点难度…..你需要杀死使用数据库的进程; 或者首先删除/删除数据库,closures连接(这可能是最简单的); 或者将你想要覆盖的数据库设置成类似限制用户模式的回滚立即,所以希望只有DBA可以使用; 或者甚至停止SQL Server,然后重新启动它 – 希望在任何人/任何东西使用该数据库之前获得恢复。
PS备份你将要覆盖的数据库,以防万一。
如果有人在使用“ Options页面并激活Overwrite the existing database (WITH REPLACE)选项后在Management Studio的GUI中search解决scheme:
只需单击“ Restore As列,然后更改*.mdf文件和*.ldf文件的文件名。