仓酷云

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

[学习教程] MSSQL网站制作之编程完成备份和复原数据库

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:37:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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:邹建老迈真是我的偶像阿!

操作被同步到从库上后,则主从都“回天无力”。
柔情似水 该用户已被删除
沙发
发表于 2015-1-19 18:59:35 | 只看该作者
入门没那么困难,精通没那么容易
谁可相欹 该用户已被删除
板凳
发表于 2015-1-28 09:30:07 | 只看该作者
比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
活着的死人 该用户已被删除
地板
发表于 2015-2-5 15:46:59 | 只看该作者
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
若天明 该用户已被删除
5#
发表于 2015-2-12 20:19:37 | 只看该作者
学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!
金色的骷髅 该用户已被删除
6#
发表于 2015-3-3 09:09:30 | 只看该作者
理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
再现理想 该用户已被删除
7#
发表于 2015-3-11 10:01:14 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
精灵巫婆 该用户已被删除
8#
发表于 2015-3-18 04:11:37 | 只看该作者
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
再见西城 该用户已被删除
9#
发表于 2015-3-25 11:44:59 | 只看该作者
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 21:59

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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