首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Oracle频道
中国IT教育
Google
首页 入门基础 安装配置 体系架构 PLSQL 备份恢复 性能调优 开发技术 资讯动态 考试认证 下载 专题 讨论
您现在的位置: 中国IT实验室 >> Oracle >> 备份恢复 >> 正文

T-SQL语句实现数据库备份与还原功能

        2.--备份数据库

        调用示例

         --备份当前数据库
          exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_db.bak'
          --差异备份当前数据库
          exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_df.bak',@bktype='DF'
          --备份当前数据库日志
          exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_log.bak',@bktype='LOG'

         if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_backupdb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
          drop procedure [dbo].[p_backupdb]
          GO
          create proc p_backupdb
          @dbname sysname='', --要备份的数据库名称,不指定则备份当前数据库
          @bkpath nvarchar(260)='', --备份文件的存放目录,不指定则使用SQL默认的备份目录
          @bkfname nvarchar(260)='', --备份文件名,文件名中可以用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间
          @bktype nvarchar(10)='DB', --备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份
          @appendfile bit=1 --追加/覆盖备份文件
          as
          declare @sql varchar(8000)
          if isnull(@dbname,'')='' set @dbname=db_name()
          if isnull(@bkpath,'')='' set @bkpath=dbo.f_getdbpath(null)
          if isnull(@bkfname,'')='' set @bkfname='\DBNAME\_\DATE\_\TIME\.BAK'
          set @bkfname=replace(replace(replace(@bkfname,'\DBNAME\',@dbname)
          ,'\DATE\',convert(varchar,getdate(),112))
          ,'\TIME\',replace(convert(varchar,getdate(),108),':',''))
          set @sql='backup '+case @bktype when 'LOG' then 'log ' else 'database ' end +@dbname
          +' to disk='''+@bkpath+@bkfname
          +''' with '+case @bktype when 'DF' then 'DIFFERENTIAL,' else '' end
          +case @appendfile when 1 then 'NOINIT' else 'INIT' end
          print @sql
          exec(@sql)
          go

        3.--恢复数据库

        调用示例

         --完整恢复数据库
          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))
          --从备份文件中获取信息
          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

上一页  [1] [2] [3] [4] 下一页

【责编:michael】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Oracle频道相关导航