关于数据库备份的问题

来源:互联网 发布:nba2k16球员动作数据 编辑:程序博客网 时间:2024/05/17 23:23

首先我们来看数据库帮助上面的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就不能覆盖重写已经存在的NorthwindNorthwind_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内容取到!接下来的操作,我不用说你也会了。