首先我们来看数据库帮助上面的sql语句:
BACKUP DATABASE Northwind TO DISK = 'c:/Northwind.bak'
RESTORE FILELISTONLY FROM DISK = 'c:/Northwind.bak'
RESTORE DATABASE TestDB FROM DISK = 'c:/Northwind.bak'
WITH MOVE 'Northwind ' TO 'c:/test/testdb.mdf',
MOVE 'Northwind _log' TO 'c:/test/testdb.ldf'
上面第一条语句是将Northwind数据库备份到Northwind.bak,
第二条语句是将Northwind.bak中的*.mdf和*ldf以及其他信息显示出来。
第三条语句是将Northwind.bak中的*.mdf何*.ldf重新命名。
第三条语句是在当我出现这种情况,即若我保存的Northwind.bak文件还原的数据库为新的数据库名,SQL如下:
RESTORE DATABASE dd_DB FROM DISK = 'c:/Northwind.bak'
那么将会出现这样的问题:
服务器: 消息 1834,级别 16,状态 1,行 1
无法重写文件 'C:/Program Files/Microsoft SQL Server/MSSQL/data/Northwind.mdf'。数据库 'TestDB' 正在使用该文件。
服务器: 消息 3156,级别 16,状态 1,行 1
文件 Northwind 无法还原为 'C:/Program Files/Microsoft SQL Server/MSSQL/data/Northwind.mdf'。请使用 WITH MOVE 选项来标识该文件的有效位置。
服务器: 消息 1834,级别 16,状态 1,行 1
无法重写文件 'C:/Program Files/Microsoft SQL Server/MSSQL/data/Northwind_log.LDF'。数据库 'TestDB' 正在使用该文件。
服务器: 消息 3156,级别 16,状态 1,行 1
文件 Northwind_log 无法还原为 'C:/Program Files/Microsoft SQL Server/MSSQL/data/Northwind_log.LDF'。请使用 WITH MOVE 选项来标识该文件的有效位置。
服务器: 消息 3013,级别 16,状态 1,行 1
RESTORE DATABASE 操作异常终止。
原因是只要数据库Northwind存在,那么在还原成新数据库的时候,Northwind.bak里面的*.mdf和*.ldf就不能覆盖重写已经存在的Northwind和Northwind_log 文件,那么解决方法是就是前面提到的第三条语句:
RESTORE DATABASE dd_DB FROM DISK = 'c:/Northwind.bak'
WITH MOVE 'Northwind ' TO 'c:/test/dd_DB.mdf',
MOVE 'Northwind _log' TO 'c:/test/dd_DB.ldf'
但有这种情况,当我无法根据*.bak文件找到所对应的*.mdf和*.ldf,即如果我改变了.bak的文件名,那么我如何得到.mdf和.ldf文件才能创建新的数据库呢?
解决方案如下:
create table #restoreFileList (LogicalName varchar(255), PhysicalName varchar(255),Type varchar(20), FileGroupName varchar(255), Size varchar(20), MaxSize varchar(20))
declare @filename varchar(1000)
select @filename = 'c:/Northwind.bak'
insert into #restoreFileList execute('restore filelistonly from disk='''+@filename+'''')
即:创建临时表,将语句RESTORE FILELISTONLY FROM DISK = 'c:/Northwind.bak',中得到的数据放到 #restoreFileList 中,然后就可以将*.mdf和*.ldf内容取到!接下来的操作,我不用说你也会了。