哪位大哥有数据库还原的SQL,是用存储过程
SQL例子
存储过程还原
[解决办法]
还原数据库
企业管理器
--右键"数据库"
--所有任务
--还原数据库
--"还原为数据库库"中输入还原后的数据库名
--还原选择"从设备"--选择设备--添加--添加你的备份文件--确定,回到数据库还原的界面
--备份号--选择内容--选择你要恢复那次备份的内容
--选项--将"移至物理文件名"中的物理文件名修改为你的数据文件要存放的文件名
--如果要还原的数据库已经存在,选择"在现有数据库上强制还原"-
-确定
--或用SQL语句:
restore database 数据库 from disk='c:\你的备份文件名'
还原数据库
企业管理器中的操作:
1.进行完整恢复
企业管理器--右键"数据库"--所有任务--还原数据库
--"还原为数据库库"中输入还原后的数据库名,设为:test
--还原选择"从设备"--选择设备--添加--添加你的备份文件
--确定,回到数据库还原的界面
--"还原备份集",选择"数据库--完全"
--选项--将"移至物理文件名"中的物理文件名修改为你的数据文件要存放的文件名
--如果要还原的数据库已经存在,选择"在现有数据库上强制还原"
--"恢复完成状态",选择"使数据库不再运行,但能还原其它事务日志"
--确定
--或用SQL语句:
restore database 数据库 from disk='c:\你的完全备份文件名' with norecovery
2.进行差异恢复
企业管理器--右键"数据库"--所有任务--还原数据库
--"还原为数据库库"中选择数据库名:test
--还原选择"从设备"--选择设备--添加--添加你的备份文件
--确定,回到数据库还原的界面
--"还原备份集",选择"数据库--差异"
--"恢复完成状态",选择"使数据库不再运行,但能还原其它事务日志"
--确定
--或用SQL语句:
restore database 数据库 from disk='c:\你的差异备份文件名' with norecovery
3.进行日志恢复
企业管理器--右键"数据库"--所有任务--还原数据库
--"还原为数据库库"中选择数据库名:test
--还原选择"从设备"--选择设备--添加--添加你的备份文件
--确定,回到数据库还原的界面
--"还原备份集",选择"事务日志"
--"恢复完成状态",选择"使数据库可以继续运行,但无法还原其它事务日志"
--确定
--或用SQL语句:
restore log 数据库 from disk='c:\你的日志备份文件名' with recovery
--解决还原数据库目录不对的详细步骤:
1.企业管理器中的方法:
--右键"数据库"
--所有任务
--还原数据库
--"还原为数据库库"中输入还原后的数据库名
--还原选择"从设备"--选择设备--添加--添加你的备份文件--确定,回到数据库还原的界面
--备份号--选择内容--选择你要恢复那次备份的内容
--选项--将"移至物理文件名"中的物理文件名修改为你的数据文件要存放的文件名
--如果要还原的数据库已经存在,选择"在现有数据库上强制还原"-
-确定
2.用SQL语句的方法(假设你的备份文件名为: c:\xx.bak
--列出备份文件中的逻辑文件名
restore filelistonly from disk='c:\xx.bak'
--用语句恢复,根据上面列出的逻辑文件名使用move选项
restore database 恢复后的数据库名
from disk='c:\xx.bak'
with move '逻辑数据文件名1' to 'c:\物理数据文件名1'
,move '逻辑数据文件名2' to 'c:\物理数据文件名2'
...
,move '逻辑数据文件名n' to 'c:\物理数据文件名n'
没有什么要特别注意的,和企业版之间的备份/还原要注意的东西一样:
1.要注意备份时的设置问题,不要指定多个备份文件,否则还原时也要指定多个备份文件
2.要注意备份的媒体处理方式问题,用重写,而不是追加,否则还原的时候要指定备份号
3.要注意备份的方式,用完全备份,而不是其他备份方式,否则还原时还要其他备份文件支持
4.还原时要注意数据文件路径的问题,如果两个系统的数据文件目录不一致,要重新指定
5.还原后要注意孤立用户的问题(即两个系统中的SQL用户不同,解决方式参考sql联机帮助)
可能的原因:
1.你还原后的数据库的数据文件所放的磁盘空间不够
解决的办法是把数据文件放在空间足够的分区
2.你的磁盘分区采用的是FAT16/FAT32,前者限制了最大文件大小为2G,后者最大为4G
解决的办法是改磁盘分区格式为NTFS
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 nvarchar(1000), --定义要恢复的备份文件名
@dbname sysname='', --定义恢复后的数据库名,默认为备份的文件名
@dbpath nvarchar(260)='', --恢复后的数据库存放目录,不指定则为SQL的默认数据目录
@retype nvarchar(10)='DB', --恢复类型:'DB'完事恢复数据库,'DBNOR' 为差异恢复,日志恢复进行完整恢复,'DF' 差异备份的恢复,'LOG' 日志恢复
@filenumber int=1, --恢复的文件号
@overexist bit=1, --是否覆盖已经存在的数据库,仅@retype为
@killuser bit=1 --是否关闭用户使用进程,仅@overexist=1时有效
as
declare @sql varchar(8000)
--得到恢复后的数据库名
if isnull(@dbname,'')=''
select @sql=reverse(@bkfile)
,@sql=case when charindex('.',@sql)=0 then @sql
else substring(@sql,charindex('.',@sql)+1,1000) end
,@sql=case when charindex('\',@sql)=0 then @sql
else left(@sql,charindex('\',@sql)-1) end
,@dbname=reverse(@sql)
--得到恢复后的数据库存放目录
if isnull(@dbpath,'')='' set @dbpath=dbo.f_getdbpath('')
--生成数据库恢复语句
set @sql='restore '+case @retype when 'LOG' then 'log ' else 'database ' end+@dbname
+' from disk='''+@bkfile+''''
+' with file='+cast(@filenumber as varchar)
+case when @overexist=1 and @retype in('DB','DBNOR') then ',replace' else '' end
+case @retype when 'DBNOR' then ',NORECOVERY' else ',RECOVERY' end
print @sql
--添加移动逻辑文件的处理
if @retype='DB' or @retype='DBNOR'
begin
--从备份文件中获取逻辑文件名
declare @lfn nvarchar(128),@tp char(1),@i int
--创建临时表,保存获取的信息
create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
--从备份文件中获取信息
insert into #tb exec('restore filelistonly from disk='''+@bkfile+'''')
declare #f cursor for select ln,tp from #tb
open #f
fetch next from #f into @lfn,@tp
set @i=0
while @@fetch_status=0
begin
select @sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@dbname+cast(@i as varchar)
+case @tp when 'D' then '.mdf''' else '.ldf''' end
,@i=@i+1
fetch next from #f into @lfn,@tp
end
close #f
deallocate #f
end
--关闭用户进程处理
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(@dbname)
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
--恢复数据库
exec(@sql)
go