仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 722|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网页编程之MS SQL数据库备份和恢复存储历程

[复制链接]
逍遥一派 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:28:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在JOIN操作中(需要从多个数据表提取数据时),MySQL只有在主键和外键的数据类型相同时才能使用索引。备份|存储历程|恢复|数据|数据库
明天闲散没有事变,就写拉数据库备份和恢复存储历程(和人人交换一下)



ifexists(
select*fromsysobjects
wherename=pr_backup_dbandxtype=p
)
begin
dropprocpr_backup_db
end
go
/*备份数据库*/
createprocpr_backup_db
@flagvarchar(10)out,
@backup_db_namevarchar(128),
@filenamevarchar(1000)--路径+文件名字
as
declare@sqlnvarchar(4000),@parnvarchar(1000)
select@par=@filenamevarchar(1000)
select@sql=BACKUPDATABASE+@backup_db_name+todisk=@filenamewithinit
executesp_executesql@sql,@par,@filename
select@flag=ok
go



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(4000)
/*
判别参数@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),/*包括文件的文件组称号*/
[Size]numeric(20,0),/*以后巨细(以字节为单元)*/
[MaxSize]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..sysdatabaseswherename=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+_+LogicalName+_data.mdf,
whenlthen@restore_db_name+_+LogicalName+_log.ldf,
end
from@tem
select@sql=RESTOREDATABASE@db_nameFROMDISK=@filenamewith
select@sql=@sql+@sql_sub+replace
select@par=@db_namenvarchar(128),@filenamenvarchar(260)
print@sql
executesp_executesql@sql,@par,@db_name=@restore_db_name,@filename=@filename
select@flag=ok/*操纵乐成*/
end
else
begin
SELECT@flag=filetypeerror/*参数@filename输出格局毛病*/
end






--备份数据库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




使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
小女巫 该用户已被删除
沙发
发表于 2015-1-19 14:22:32 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
逍遥一派 该用户已被删除
板凳
 楼主| 发表于 2015-1-26 22:42:38 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
深爱那片海 该用户已被删除
地板
发表于 2015-2-4 21:50:14 | 只看该作者
入门没那么困难,精通没那么容易
乐观 该用户已被删除
5#
发表于 2015-2-10 19:50:30 | 只看该作者
代替了原来VB式的错误判断。比Oracle高级不少。
冷月葬花魂 该用户已被删除
6#
发表于 2015-3-1 15:10:45 | 只看该作者
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。
爱飞 该用户已被删除
7#
发表于 2015-3-10 19:46:31 | 只看该作者
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
莫相离 该用户已被删除
8#
发表于 2015-3-17 09:18:17 | 只看该作者
连做梦都在想页面结构是怎么样的,绝非虚言
愤怒的大鸟 该用户已被删除
9#
发表于 2015-3-24 05:54:26 | 只看该作者
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-4 07:45

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表