数据库无法还原

rootstock 2003-11-17 12:51:44
设备'E:\database.dat'的文件不是有效的Microsoft磁带格式备份集,restore dateabase异常终止

为什么?谢谢!
...全文
93 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
happydreamer 2003-11-18
  • 打赏
  • 举报
回复
USE MASTER
GO
SP_DBOPTION YOURDATABASE,'SINGLE USER',TRUE
GO
RESTORE DATABASE dbname FROM MyBACKUP
GO
SP_DBOPTION YOURDATABASE,'SINGLE USER',FALSE
GO
internetcsdn 2003-11-18
  • 打赏
  • 举报
回复
mark
jpyc 2003-11-17
  • 打赏
  • 举报
回复
如果还原有问题,主要原因有:

备份数据有错误或损坏

数据库被占用
rootstock 2003-11-17
  • 打赏
  • 举报
回复
还是不行,说是什么单用户 :(
zjcxc 元老 2003-11-17
  • 打赏
  • 举报
回复
--试试,用下面的存储过程恢复:
/*
恢复数据库
指定备份文件名及要恢复的数据库名
自动恢复到SQL数据目录下

--调用示例
exec p_RestoreDb 'c:\备份文件名.bak','数据库名'

*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_RestoreDb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_RestoreDb]
GO

create proc p_RestoreDb
@bkfile varchar(1000), --定义要恢复的备份文件名
@redb varchar(200), --定义恢复后的数据库名
@overexist bit=1, --是否覆盖已经存在的数据库
@killuser bit=1 --是否关闭用户使用进程,仅@overexist=1时有效
as
--从备份文件中获取逻辑文件名和物理文件名
declare @logfn1 varchar(250),@logfn2 varchar(250)
declare @phyfn1 varchar(1000),@phyfn2 varchar(1000)

--创建临时表,保存获取的信息
create table #tb(lgfn varchar(250),pyfn varchar(1000),type char(1),fg varchar(200),size bigint,maxsize bigint)

--从备份文件中获取信息
insert into #tb
exec('restore filelistonly
from disk='''+@bkfile+'''')

--将信息保存到变量中
select @logfn1=lgfn,@phyfn1=pyfn from #tb where type='D'
select @logfn2=lgfn,@phyfn2=pyfn from #tb where type='L'

--删除临时表
drop table #tb

--显示获取的信息
select @logfn1 as 逻辑数据文件名,@phyfn1 as 物理数据文件名
union all
select @logfn2 as 逻辑日志文件名,@phyfn2 as 物理日志文件名

--生成恢复的语句
declare @sql varchar(8000)

--得到SQL安装时的数据文件路径
select @phyfn1=rtrim(reverse(filename)) from master..sysfiles where name='master'
select @phyfn1=reverse(substring(@phyfn1,charindex('\',@phyfn1),8000))

--关闭用户进程处理
if @overexist=1 and @killuser=1
begin
declare @spid varchar(20)
declare #spid cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@redb)
open #spid
fetch next from #spid into @spid
while @@fetch_status=0
begin
exec('kill '+@spid)
fetch next from #spid into @spid
end
close #spid
deallocate #spid
end

--生成数据恢复语句,将数据库恢复到SQL数据目录下
set @sql='restore database '+@redb
+' from disk='''+@bkfile+''''
+' with move '''+@logfn1+''' to '''
+@phyfn1+@redb+'.mdf'',move '''
+@logfn2+''' to '''+@phyfn1+@redb+'.ldf'''
+case @overexist when 1 then ',replace' else '' end
exec(@sql)
go
rootstock 2003-11-17
  • 打赏
  • 举报
回复
在数据里,右键--》所有任务---》备份数据库--》备份到文件
pengdali 2003-11-17
  • 打赏
  • 举报
回复
你怎么备的?

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧