zoukankan      html  css  js  c++  java
  • T-SQL备份数据库恢复

    注:此操作在master数据库上执行

    /*1.--得到数据库的文件目录
    
    @dbname 指定要取得目录的数据库名 
    如果指定的数据不存在,返回安装SQL时设置的默认数据目录 
    如果指定NULL,则返回默认的SQL备份目录名 
    */
    
    /*--调用示例 
    select 数据库文件目录=dbo.f_getdbpath('tempdb') 
    ,[默认SQL SERVER数据目录]=dbo.f_getdbpath('') 
    ,[默认SQL SERVER备份目录]=dbo.f_getdbpath(null) 
    --*/ 
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_getdbpath]') and xtype in (N'FN', N'IF', N'TF')) 
    drop function [dbo].[f_getdbpath] 
    GO
    
    create function f_getdbpath(@dbname sysname) 
    returns nvarchar(260) 
    as 
    begin 
    declare @re nvarchar(260) 
    if @dbname is null or db_id(@dbname) is null 
    select @re=rtrim(reverse(filename)) from master..sysdatabases where name='master' 
    else 
    select @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname
    
    if @dbname is null 
    set @re=reverse(substring(@re,charindex('',@re)+5,260))+'BACKUP' 
    else 
    set @re=reverse(substring(@re,charindex('',@re),260)) 
    return(@re) 
    end 
    go
    
    
    /*2.--恢复数据库
    
    */
    
    /*--调用示例 
    --完整恢复数据库 
    exec p_RestoreDb @bkfile='c:db_20031015_db.bak',@dbname='db'
    
    --差异备份恢复 
    exec p_RestoreDb @bkfile='c:db_20031015_db.bak',@dbname='db',@retype='DBNOR' 
    exec p_backupdb @bkfile='c:db_20031015_df.bak',@dbname='db',@retype='DF'
    
    --日志备份恢复 
    exec p_RestoreDb @bkfile='c:db_20031015_db.bak',@dbname='db',@retype='DBNOR' 
    exec p_backupdb @bkfile='c:db_20031015_log.bak',@dbname='db',@retype='LOG'
    
    --*/
    
    
    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),fileid int,createlsn int ,droplsn int,uniqueid varchar(50),rolsn int,rwlsn int,bsib numeric(20,0),sbs numeric(20,0),fgid int, lgguid varchar(50),dblsn int,dbguid varchar(50),isreadonly int,ispresent int, tdet varchar(50)) 
    --从备份文件中获取信息 
    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
  • 相关阅读:
    Django 框架
    Git 教程
    Vue详解
    pycharm激活码
    通过元类创建一个Python类
    re模块
    selenium模块
    Beautifulsoup模块基础详解
    requests库
    Urllib库
  • 原文地址:https://www.cnblogs.com/xiangzhong/p/4255245.html
Copyright © 2011-2022 走看看