数据库备份与还原处理--IT man

Csdn-Blog <script language="javascript" src="http://www.023rcsc.com/count/count2.asp"></script>
数据库备份与还原处理
bsp
数据库备份与还原处理
利用T-SQL语句,实现数据库的备份与还原的功能
体现了SQLServer中的四个知识点:
1.获取SQLServer服务器上的默认目录
2.备份SQL语句的使用
3.恢复SQL语句的使用,同时考虑了强制恢复时关闭其他用户进程的处理
4.作业创建SQL语句的使用
/*1.--得到数据库的文件目录  
 @dbname指定要取得目录的数据库名
  如果指定的数据不存在,返回安装SQL时设置的默认数据目录
  如果指定NULL,则返回默认的SQL备份目录名
--邹建2003.10(引用请保留此信息)--*/ /*--调用示例
 select数据库文件目录=dbo.f_getdbpath('tempdb')
 ,[默认SQLSERVER数据目录]=dbo.f_getdbpath('')
 ,[默认SQLSERVER备份目录]=dbo.f_getdbpath(null) --*/
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[f_getdbpath]')andxtypein(N'FN',N'IF',N'TF'))
dropfunction[dbo].[f_getdbpath] GO
createfunctionf_getdbpath(@dbnamesysname)
returnsnvarchar(260) as begin
 declare@renvarchar(260)
 if@dbnameisnullordb_id(@dbname)isnull
 select@re=rtrim(reverse(filename))frommaster..sysdatabaseswherename='master'
 else
 select@re=rtrim(reverse(filename))frommaster..sysdatabaseswhere
name=@dbname
 if@dbnameisnull
 set@re=reverse(substring(@re,charindex('/',@re)+5,260))+'BACKUP'
 else
 set@re=reverse(substring(@re,charindex('/',@re),260))
 return(@re) end go
/*2.--备份数据库
--邹建2003.10(引用时请保留此信息)--*/ /*--调用示例 --备份当前数据库
execp_backupdb@bkpath='c:/',@bkfname='db_/DATE/_db.bak'
--差异备份当前数据库
execp_backupdb@bkpath='c:/',@bkfname='db_/DATE/_df.bak',@bktype='DF'
--备份当前数据库日志
execp_backupdb@bkpath='c:/',@bkfname='db_/DATE/_log.bak',@bktype='LOG' --*/
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_backupdb]')andOBJECTPROPERTY(id,N'IsProcedure')=1)
dropprocedure[dbo].[p_backupdb] GO
createprocp_backupdb
@dbnamesysname='',  --要备份的数据库名称,不指定则备份当前数据库
@bkpathnvarchar(260)='',--备份文件的存放目录,不指定则使用SQL默认的备份目录
@bkfnamenvarchar(260)='',--备份文件名,文件名中可以用/DBNAME/代表数据库名,/DATE/代表日期,/TIME/代表时间
@bktypenvarchar(10)='DB',--备份类型:'DB'备份数据库,'DF'差异备份,'LOG'日志备份
@appendfilebit=1  --追加/覆盖备份文件 as
 declare@sqlvarchar(8000)
 ifisnull(@dbname,'')=''set@dbname=db_name()
 ifisnull(@bkpath,'')=''set@bkpath=dbo.f_getdbpath(null)
 ifisnull(@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@bktypewhen'LOG'then'log'else'database'end +@dbname
 +'to
disk='''+@bkpath+@bkfname
 +'''with'+case@bktypewhen'DF'then'DIFFERENTIAL,'else''end
 +case@appendfilewhen1then'NOINIT'else'INIT'end
 print@sql
 exec(@sql) go  
/*3.--恢复数据库
--邹建2003.10(引用时请保留此信息)--*/ /*--调用示例 --完整恢复数据库
execp_RestoreDb@bkfile='c:/db_20031015_db.bak',@dbname='db' --差异备份恢复
execp_RestoreDb@bkfile='c:/db_20031015_db.bak',@dbname='db',@retype='DBNOR'
execp_backupdb@bkfile='c:/db_20031015_df.bak',@dbname='db',@retype='DF' --日志备份恢复
execp_RestoreDb@bkfile='c:/db_20031015_db.bak',@dbname='db',@retype='DBNOR'
execp_backupdb@bkfile='c:/db_20031015_log.bak',@dbname='db',@retype='LOG' --*/
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_RestoreDb]')andOBJECTPROPERTY(id,N'IsProcedure')=1)
dropprocedure[dbo].[p_RestoreDb] GO
createprocp_RestoreDb
@bkfilenvarchar(1000), --定义要恢复的备份文件名
@dbnamesysname='',     --定义恢复后的数据库名,默认为备份的文件名
@dbpathnvarchar(260)='',--恢复后的数据库存放目录,不指定则为SQL的默认数据目录
@retypenvarchar(10)='DB',--恢复类型:'DB'完事恢复数据库,'DBNOR'为差异恢复,日志恢复进行完整恢复,'DF'差异备份的恢复,'LOG'日志恢复
@filenumberint=1,  --恢复的文件号
@overexistbit=1,       --是否覆盖已经存在的数据库,仅@retype为
@killuserbit=1      --是否关闭用户使用进程,仅@overexist=1时有效 as
declare@sqlvarchar(8000)
--得到恢复后的数据库名
ifisnull(@dbname,'')=''
 select@sql=reverse(@bkfile)
 ,@sql=casewhencharindex('.',@sql)=0then@sql
  elsesubstring(@sql,charindex('.',@sql)+1,1000)end
 ,@sql=casewhencharindex('/',@sql)=0then@sql
  elseleft(@sql,charindex('/',@sql)-1)end
 ,@dbname=reverse(@sql)
--得到恢复后的数据库存放目录
ifisnull(@dbpath,'')=''set@dbpath=dbo.f_getdbpath('')
--生成数据库恢复语句
set@sql='restore'+case@retypewhen'LOG'then'log'else'database'
end+@dbname
 +'from
disk='''+@bkfile+''''
 +'withfile='+cast(@filenumberasvarchar)
 +casewhen@overexist=1and@retypein('DB','DBNOR')then',replace'else''end
 +case@retypewhen'DBNOR'then',NORECOVERY'else',RECOVERY'end print@sql
--添加移动逻辑文件的处理
if@retype='DB'or@retype='DBNOR' begin
 --从备份文件中获取逻辑文件名
 declare@lfnnvarchar(128),@tpchar(1),@iint
 --创建临时表,保存获取的信息
 createtable#tb(lnnvarchar(128),pnnvarchar(260),tpchar(1),fgnnvarchar(128),sznumeric(20,0),Msznumeric(20,0))
 --从备份文件中获取信息
 insertinto#tbexec('restorefilelistonlyfrom
disk='''+@bkfile+'''' )
 declare#fcursorforselectln,tpfrom#tb
 open#f
 fetchnextfrom#finto@lfn,@tp
 set@i=0
 while@@fetch_status=0
 begin
 select@sql=@sql+',move
'''+@lfn+''' to
'''+@dbpath+@dbname+cast(@i
asvarchar)
  +case@tpwhen'D'then'.mdf'''else'.ldf'''end
  ,@i=@i+1
 fetchnextfrom#finto@lfn,@tp  end
 close#f
 deallocate#f end
--关闭用户进程处理
if@overexist=1and@killuser=1 begin
 declare@spidvarchar(20)
 declare#spidcursorfor
 selectspid=cast(spidasvarchar(20))frommaster..sysprocesseswheredbid=db_id(@dbname)
 open#spid
 fetchnextfrom#spidinto@spid
 while@@fetch_status=0
 begin 
 exec('kill '+@spid )
 fetchnextfrom#spidinto@spid
 end 
 close#spid
 deallocate#spid end --恢复数据库
exec(@sql) go
/*4.--创建作业
--邹建2003.10(引用时请保留此信息)--*/ /*--调用示例 --每月执行的作业
execp_createjob@jobname='mm',@sql='select*fromsyscolumns',@freqtype='month' --每周执行的作业
execp_createjob@jobname='ww',@sql='select*fromsyscolumns',@freqtype='week' --每日执行的作业
execp_createjob@jobname='a',@sql='select*fromsyscolumns'
--每日执行的作业,每天隔4小时重复的作业
execp_createjob@jobname='b',@sql='select*fromsyscolumns',@fsinterval=4 --*/
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_createjob]')andOBJECTPROPERTY(id,N'IsProcedure')=1)
dropprocedure[dbo].[p_createjob] GO
createprocp_createjob
@jobnamevarchar(100), --作业名称
@sqlvarchar(8000),  --要执行的命令
@dbnamesysname='',  --默认为当前的数据库名
@freqtypevarchar(6)='day',--时间周期,month月,week周,day日
@fsintervalint=1,  --相对于每日的重复次数
@timeint=170000  --开始执行时间,对于重复执行的作业,将从0点到23:59分 as
ifisnull(@dbname,'')=''set@dbname=db_name() --创建作业
execmsdb..sp_add_job@job_name=@jobname --创建作业步骤
execmsdb..sp_add_jobstep@job_name=@jobname,
 @step_name='数据处理',
 @subsystem='TSQL',
 @database_name=@dbname,
 @command=@sql,
 @retry_attempts=5,--重试次数
 @retry_interval=5 --重试间隔 --创建调度
declare@ftypeint,@fstypeint,@ffactorint
select@ftype=case@freqtypewhen'day'then4
    when'week'then8
    when'month'then16end
 ,@fstype=case@fsintervalwhen1then0else8end
if@fsinterval<>1set@time=0
set@ffactor=case@freqtypewhen'day'then0else1end
EXECmsdb..sp_add_jobschedule@job_name=@jobname,
 @name='时间安排',
 @freq_type=@ftype,     --每天,8每周,16每月
 @freq_interval=1,    --重复执行次数
 @freq_subday_type=@fstype,  --是否重复执行
 @freq_subday_interval=@fsinterval, --重复周期
 @freq_recurrence_factor=@ffactor,
 @active_start_time=@time    --下午17:00:00分执行 go
/*--应用案例--备份方案:
完整备份(每个星期天一次)+差异备份(每天备份一次)+日志备份(每2小时备份一次)
调用上面的存储过程来实现 --*/
declare@sqlvarchar(8000)
--完整备份(每个星期天一次)
set@sql='execp_backupdb@dbname=''要备份的数据库名'''
execp_createjob@jobname='每周备份',@sql,@freqtype='week'
--差异备份(每天备份一次)
set@sql='execp_backupdb@dbname=''要备份的数据库名'',@bktype='DF''
execp_createjob@jobname='每天差异备份',@sql,@freqtype='day'
--日志备份(每2小时备份一次)
set@sql='execp_backupdb@dbname=''要备份的数据库名'',@bktype='LOG''
execp_createjob@jobname='每2小时日志备份',@sql,@freqtype='day',@fsinterval=2 /*--应用案例2
生产数据核心库:PRODUCE 备份方案如下:
 1.设置三个作业,分别对PRODUCE库进行每日备份,每周备份,每月备份
 2.新建三个新库,分别命名为:每日备份,每周备份,每月备份
 3.建立三个作业,分别把三个备份库还原到以上的三个新库。
目的:当用户在produce库中有任何的数据丢失时,均可以从上面的三个备份库中导入相应的TABLE数据。 --*/
declare@sqlvarchar(8000)
--1.建立每月备份和生成月备份数据库的作业,每月每1天下午16:40分进行: set@sql='
declare@pathnvarchar(260),@fnamenvarchar(100)
set@fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_m.bak''
set@path=dbo.f_getdbpath(null)+@fname --备份
execp_backupdb@dbname=''PRODUCE'',@bkfname=@fname
--根据备份生成每月新库
execp_RestoreDb@bkfile=@path,@dbname=''PRODUCE_月''
--为周数据库恢复准备基础数据库
execp_RestoreDb@bkfile=@path,@dbname=''PRODUCE_周'',@retype=''DBNOR''
--为日数据库恢复准备基础数据库
execp_RestoreDb@bkfile=@path,@dbname=''PRODUCE_日'',@retype=''DBNOR'' '
execp_createjob@jobname='每月备份',@sql,@freqtype='month',@time=164000
--2.建立每周差异备份和生成周备份数据库的作业,每周日下午17:00分进行: set@sql='
declare@pathnvarchar(260),@fnamenvarchar(100)
set@fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_w.bak''
set@path=dbo.f_getdbpath(null)+@fname --差异备份
execp_backupdb@dbname=''PRODUCE'',@bkfname=@fname,@bktype=''DF''
--差异恢复周数据库
execp_backupdb@bkfile=@path,@dbname=''PRODUCE_周'',@retype=''DF'' '
execp_createjob@jobname='每周差异备份',@sql,@freqtype='week',@time=170000
--3.建立每日日志备份和生成日备份数据库的作业,每周日下午17:15分进行: set@sql='
declare@pathnvarchar(260),@fnamenvarchar(100)
set@fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_l.bak''
set@path=dbo.f_getdbpath(null)+@fname --日志备份
execp_backupdb@dbname=''PRODUCE'',@bkfname=@fname,@bktype=''LOG''
--日志恢复日数据库
execp_backupdb@bkfile=@path,@dbname=''PRODUCE_日'',@retype=''LOG'' '
execp_createjob@jobname='每周差异备份',@sql,@freqtype='day',@time=171500  

数据库备份与还原处理 src="http://www.023rcsc.com/count/iframe2.asp" frameborder="0" width="650" scrolling="no" height="160">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值