MSSQL网站制作之SQL SERVER2000数据库备份和恢复存储过...
上面我们说了DML的闪回方案。但对于DDL却无能为力,对于大多数的DDL,即使是rowbase格式,二进制日志binlog中仍只记录语句本身。对于删表操作,只记录一个语句droptablet。仅凭这句话,无法还原表的数据。server|备份|存储历程|恢复|数据|数据库SQLSERVER2000数据库备份和恢复存储历程(增强版本)
我本人写的2个历程和一个函数,用于SQLSERVER2000数据库备份和恢复
拿出来和人人交换一下,历程和函数的具体申明在代码中
感谢
/*备份数据库的历程*/
ifexists(
select*fromsysobjects
wherename=pr_backup_dbandxtype=p
)
begin
dropprocpr_backup_db
end
go
createprocpr_backup_db
@flagvarchar(20)out,
@backup_db_namevarchar(128),
@filenamevarchar(1000)--路径+文件名字
as
declare@sqlnvarchar(4000),@parnvarchar(1000)
ifnotexists(
select*frommaster..sysdatabases
wherename=@backup_db_name
)
begin
select@flag=dbnotexist/*数据库不存在*/
return
end
else
begin
ifright(@filename,1)andcharindex(,@filename)0
begin
select@par=@filenamevarchar(1000)
select@sql=BACKUPDATABASE+@backup_db_name+todisk=@filenamewithinit
executesp_executesql@sql,@par,@filename
select@flag=ok
return
end
else
begin
select@flag=filetypeerror/*参数@filename输出格局毛病*/
return
end
end
GO
申明:pr_backup_db历程是备份你的数据库
/*创立函数,失掉文件得路径*/
ifexists(
select*fromsysobjects
wherename=fn_GetFilePathandxtype=fn
)
begin
dropfunctionfn_GetFilePath
end
go
createfunctionfn_GetFilePath(@filenamenvarchar(260))
returnsnvarchar(260)
as
begin
declare@file_pathnvarchar(260)
declare@filename_reversenvarchar(260)
select@filename_reverse=reverse(@filename)
select@file_path=substring(@filename,1,len(@filename)+1-charindex(,@filename_reverse))
return@file_path
end
GO
/*恢单数据库的历程*/
ifexists(
select*fromsysobjects
wherename=pr_restore_dbandxtype=p
)
begin
dropprocpr_restore_db
end
go
CREATEprocpr_restore_db
@flagvarchar(20)out,/*历程运转的形态标记,是输出参数*/
@restore_db_namenvarchar(128),/*要恢复的数据名字*/
@filenamenvarchar(260)/*备份文件寄存的路径+备份文件名字*/
as
declare@proc_resulttinyint/*前往体系存储历程xp_cmdshell运转了局*/
declare@loop_timesmallint/*轮回次数*/
declare@max_idssmallint/*@tem表的ids列最年夜数*/
declare@file_bak_pathnvarchar(260)/*原数据库寄存路径*/
declare@flag_filebit/*文件寄存标记*/
declare@master_pathnvarchar(260)/*数据库master文件路径*/
declare@sqlnvarchar(4000),@parnvarchar(1000)
declare@sql_subnvarchar(4000)
declare@sql_cmdnvarchar(100)
declare@sql_killnvarchar(100)
/*
判别参数@filename文件格局正当性,以避免用户输出相似d:大概c:a等不法文件名
参数@filename内里必需有而且不以开头
*/
ifright(@filename,1)andcharindex(,@filename)0
begin
select@sql_cmd=dir+@filename
EXEC@proc_result=master..xp_cmdshell@sql_cmd,no_output
IF(@proc_result0)/*体系存储历程xp_cmdshell前往代码值:0(乐成)或1(失利)*/
begin
select@flag=notexist/*备份文件不存在*/
return/*加入历程*/
end
/*创立一时表,保留由备份集内包括的数据库和日记文件列表构成的了局集*/
createtable#tem(
LogicalNamenvarchar(128),/*文件的逻辑称号*/
PhysicalNamenvarchar(260),/*文件的物理称号或操纵体系称号*/
Typechar(1),/*数据文件(D)或日记文件(L)*/
FileGroupNamenvarchar(128),/*包括文件的文件组称号*/
numeric(20,0),/*以后巨细(以字节为单元)*/
numeric(20,0)/*同意的最年夜巨细(以字节为单元)*/
)
/*
创立表变量,表布局与一时表基础一样
就是多了两列,
列ids(自增编号列),
列file_path,寄存文件的路径
*/
declare@temtable(
idssmallintidentity,/*自增编号列*/
LogicalNamenvarchar(128),
PhysicalNamenvarchar(260),
File_pathnvarchar(260),
Typechar(1),
FileGroupNamenvarchar(128)
)
insertinto#tem
execute(restorefilelistonlyfromdisk=+@filename+)
/*将一时表导进表变量中,而且盘算出响应得路径*/
insertinto@tem(LogicalName,PhysicalName,File_path,Type,FileGroupName)
selectLogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName
from#tem
if@@rowcount>0
begin
droptable#tem
end
select@loop_time=1
select@max_ids=max(ids)/*@tem表的ids列最年夜数*/
from@tem
while@loop_time<=@max_ids
begin
select@file_bak_path=file_path
from@temwhereids=@loop_time
select@sql_cmd=dir+@file_bak_path
EXEC@proc_result=master..xp_cmdshell@sql_cmd,no_output
/*体系存储历程xp_cmdshell前往代码值:0(乐成)或1(失利)*/
IF(@proc_result0)
select@loop_time=@loop_time+1
else
BREAK/*没有找到备份前数据文件原有寄存路径,加入轮回*/
end
select@master_path=
if@loop_time>@max_ids
select@flag_file=1/*备份前数据文件原有寄存路径存在*/
else
begin
select@flag_file=0/*备份前数据文件原有寄存路径不存在*/
select@master_path=dbo.fn_GetFilePath(filename)
frommaster..sysdatabases
wherename=master
end
select@sql_sub=
/*type=d是数据文件,type=l是日记文件*/
/*@flag_file=1时新的数据库文件仍是寄存在本来路径,不然寄存路径和master数据库路径一样*/
select@sql_sub=@sql_sub+move+LogicalName+to
+casetype
whendthencase@flag_file
when1thenFile_path
else@master_path
end
whenlthencase@flag_file
when1thenFile_path
else@master_path
end
end
+casetype
whendthen@restore_db_name
+_DATA
+convert(sysname,ids)/*给文件编号*/
+.
+right(PhysicalName,3)/*给文件到场后缀名,mdforndf*/
+,
whenlthen@restore_db_name
+_LOG
+convert(sysname,ids)/*给文件编号*/
+.
+right(PhysicalName,3)/*给文件到场后缀名,mdforndf*/
+,
end
from@tem
select@sql=RESTOREDATABASE@db_nameFROMDISK=@filenamewith
select@sql=@sql+@sql_sub+replace
select@par=@db_namenvarchar(128),@filenamenvarchar(260)
/*封闭相干历程,把响应历程情况导进一时表中*/
selectidentity(int,1,1)ids,spid
into#temp
frommaster..sysprocesses
wheredbid=db_id(@restore_db_name)
if@@rowcount>0--找到响应历程
begin
select@max_ids=max(ids)
from#temp
select@loop_time=1
while@loop_time<=@max_ids
begin
select@sql_kill=kill+convert(nvarchar(20),spid)
from#temp
whereids=@loop_time
executesp_executesql@sql_kill
select@loop_time=@loop_time+1
end
end
droptable#temp
executesp_executesql@sql,@par,@db_name=@restore_db_name,@filename=@filename
select@flag=ok/*操纵乐成*/
end
else
begin
SELECT@flag=filetypeerror/*参数@filename输出格局毛病*/
end
GO
--run
--备份数据库test_database
declare@flvarchar(10)
executepr_backup_db@flout,test_database,c: est_database.bak
select@fl
--恢单数据库,输出的参数毛病
declare@flvarchar(20)
execpr_restore_db@flout,sa,c:
select@fl
--恢单数据库,即创立数据库test_database的复本test_db
declare@flvarchar(20)
execpr_restore_db@flout,test_db,c: est_database.bak
select@fl
以上历程和函数在MSSQL2000运转乐成,因为MSSQL7不撑持用户自界说函数和表变量,要在MSSQL7下利用能够把函数fn_GetFilePath改写成过
程,把历程pr_restore_db中的表变量改写为一时表便可运转,有乐趣的伴侣能够尝尝!
我的Email:aierong@2118.cn
接待人人交换
在Windows中MySQL以服务形式存在,在使用前应确保此服务已经启动,未启动可用netstartmysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqldstart"命令,注意启动者应具有管理员权限。 SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。 我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过! 但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。 财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的.. 一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。) 两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书 其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?! 我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
页:
[1]