|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
这类操作的执行过程是,1)按照新的表定义建立一个临时表tmpa,2)将原表数据拷贝到临时表,3)将原始表改名tmpb,4)将tmpa改名为原表名,5)将tmpb删除。备份|编程|数据|数据库注重,上面备份复原都是用存储历程完成!
ifexists(select*fromdbo.sysobjectswhereid=object_id(N[dbo].[p_backupdb])andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure[dbo].[p_backupdb]
GO
/*--备份数据库的通用存储历程
--邹建2003.10--*/
/*--挪用示例
--备份以后数据库
execp_backupdb@bkpath=c:,@bkfname=DBNAME\_DATE\_db.bak
存储历程完成备份和复原数据库:
ifexists(select*fromdbo.sysobjectswhereid=object_id(N[dbo].[p_backupdb])andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure[dbo].[p_backupdb]
GO
/*--备份数据库的通用存储历程
--邹建2003.10--*/
/*--挪用示例
--备份以后数据库
execp_backupdb@bkpath=c:,@bkfname=DBNAME\_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
--*/
createprocp_backupdb
@dbnamesysname=,--要备份的数据库称号,不指定章备份以后数据库
@bkpathnvarchar(260)=,--备份文件的寄存目次,不指定章利用SQL默许的备份目次
@bkfnamenvarchar(260)=,--备份文件名,文件名中能够用DBNAME代表数据库名,DATE代表日期,TIME代表工夫
@bktypenvarchar(10)=DB,--备份范例:DB备份数据库,DF差别备份,LOG日记备份
@appendfilebit=1,--追加/掩盖备份文件
@passwordnvarchar(20)=--为备份文件设置的暗码(仅sql2000撑持),设置后,恢复时必需供应此暗码
as
declare@sqlvarchar(8000)
ifisnull(@dbname,)=set@dbname=db_name()
ifisnull(@bkpath,)=
begin
select@bkpath=rtrim(reverse(filename))frommaster..sysfileswherename=master
select@bkpath=substring(@bkpath,charindex(,@bkpath)+1,4000)
,@bkpath=reverse(substring(@bkpath,charindex(,@bkpath),4000))+BACKUP
end
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@bktypewhenLOGthenlogelsedatabaseend+@dbname
+todisk=+@bkpath+@bkfname
+with+case@bktypewhenDFthenDIFFERENTIAL,elseend
+case@appendfilewhen1thenNOINITelseINITend
+caseisnull(@password,)whenthenelse,PASSWORD=+@password+end
exec(@sql)
go
ifexists(select*fromdbo.sysobjectswhereid=object_id(N[dbo].[p_RestoreDb])andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure[dbo].[p_RestoreDb]
GO
/*--恢单数据库的通用存储历程
--邹建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_RestoreDb@bkfile=c:db_20031015_df.bak,@dbname=db,@retype=DF
--日记备份恢复
execp_RestoreDb@bkfile=c:db_20031015_db.bak,@dbname=db,@retype=DBNOR
execp_RestoreDb@bkfile=c:db_20031015_log.bak,@dbname=db,@retype=LOG
--*/
createprocp_RestoreDb
@bkfilenvarchar(1000),--界说要恢复的备份文件名(领路径)
@dbnamesysname=,--界说恢复后的数据库名,默许为备份的文件名
@dbpathnvarchar(260)=,--恢复后的数据库寄存目次,不指定章为SQL的默许数据目次
@retypenvarchar(10)=DB,--恢复范例:DB完事恢单数据库,DBNOR为差别恢复,日记恢复举行完全恢复,DF差别备份的恢复,LOG日记恢复
@filenumberint=1,--恢复的文件号
@overexistbit=1,--是不是掩盖已存在的数据库,仅@retype为DB/DBNOR是无效
@killuserbit=1,--是不是封闭用户利用历程,仅@overexist=1时无效
@passwordnvarchar(20)=--备份文件的暗码(仅sql2000撑持),假如备份时设置了暗码,必需供应此暗码
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,)=
begin
select@dbpath=rtrim(reverse(filename))frommaster..sysfileswherename=master
select@dbpath=reverse(substring(@dbpath,charindex(,@dbpath),4000))
end
--天生数据库恢复语句
set@sql=restore+case@retypewhenLOGthenlogelsedatabaseend+@dbname
+fromdisk=+@bkfile+
+withfile=+cast(@filenumberasvarchar)
+casewhen@overexist=1and@retypein(DB,DBNOR)then,replaceelseend
+case@retypewhenDBNORthen,NORECOVERYelse,RECOVERYend
+caseisnull(@password,)whenthenelse,PASSWORD=+@password+end
--增加挪动逻辑文件的处置
if@retype=DBor@retype=DBNOR
begin
--从备份文件中猎取逻辑文件名
declare@lfnnvarchar(128),@tpchar(1),@iint,@svarchar(1000)
--创立一时表,保留猎取的信息
createtable#tb(lnnvarchar(128),pnnvarchar(260),tpchar(1),fgnnvarchar(128),sznumeric(20,0),Msznumeric(20,0))
--从备份文件中猎取信息
set@s=restorefilelistonlyfromdisk=+@bkfile+
++caseisnull(@password,)whenthenelsewithPASSWORD=+@password+end
insertinto#tbexec(@s)
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(@iasvarchar)
+case@tpwhenDthen.mdfelse.ldfend
,@i=@i+1
fetchnextfrom#finto@lfn,@tp
end
close#f
deallocate#f
end
--封闭用户历程处置
if@overexist=1and@killuser=1
begin
declarehCForEachcursorfor
selects=kill+cast(spidasvarchar)frommaster..sysprocesses
wheredbid=db_id(@dbname)
execsp_msforeach_worker?
end
--恢单数据库
exec(@sql)
Go
邹建说:
说白了,就是备份数据库和复原数据库的SQL语句的使用:
--备份
backupdatabase数据库todisk=c:你的备份文件名
--复原
restoredatabase数据库fromdisk=c:你的备份文件名
PS:邹建老迈真是我的偶像阿!
操作被同步到从库上后,则主从都“回天无力”。 |
|