您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
三六零分类信息网 > 盘锦分类信息网,免费分类信息发布

备份恢复数据库

2025/7/27 2:32:19发布3次查看
每个系统都应该有数据库的备份和还原功能,以防各种情况下的数据库损坏造成不可挽回的损失。这个功能挺简单,但在代码实现过程中也多多少少遇到了些问题,我把错误都总结了出来,供大家参考学习。 下面先给出正确的代码实现: imports system.data.sqlclient
         每个系统都应该有数据库的备份和还原功能,以防各种情况下的数据库损坏造成不可挽回的损失。这个功能挺简单,但在代码实现过程中也多多少少遇到了些问题,我把错误都总结了出来,供大家参考学习。
下面先给出正确的代码实现:
imports system.data.sqlclientpublic class form1 '备份数据库 'backup database test to disk='' with format sql语句 private sub btnbackup_click(sender as object, e as eventargs) handles btnbackup.click dim conn as sqlconnection conn = new sqlconnection(data source=.;initial catalog=test3;user id=sa;password=123456) dim cmd as sqlcommand dim path as string '选择备份路径 folderbrowserdialog1.showdialog() path = folderbrowserdialog1.selectedpath if path = nothing then messagebox.show(文件名不能为空, 系统提示) exit sub end if '执行sql命令语句,备份数据库 cmd = new sqlcommand(backup database test3 to disk=' & path & \backup' with format,backup log with norecovery, conn) conn.open() try cmd.executenonquery() catch ex as exception msgbox(ex.message, msgboxstyle.okonly, 系统提示) exit sub end try msgbox(备份成功) conn.close() end sub '还原数据库 private sub btnrecovery_click(sender as object, e as eventargs) handles btnrecovery.click if msgbox(真的要还原吗?数据会恢复到最近备份的数据!, msgboxstyle.yesno, 系统提示) = msgboxresult.yes then dim cn as new sqlconnection dim cn1 as new sqlconnection dim mydr as sqldatareader dim str as string dim tmpconnectionstring as string = data source=.;initial catalog=test3;user id=sa;password=123456;pooling=false dim all as string '获取当前文件名筛选器字符 me.openfiledialog1.filter = 所有文件(*.*)|*.*|备份文件(*.bak)|*.bak me.openfiledialog1.showdialog() all = openfiledialog1.filename if all = nothing then messagebox.show(文件名不能为空, 系统提示) exit sub end if cn.connectionstring = tmpconnectionstring cn1.connectionstring = tmpconnectionstring cn.open() cn1.open() '查询与数据库有关的进程 dim cm as sqlcommand = new sqlcommand(use master select spid from master..sysprocesses where dbid=db_id('test3'), cn) mydr = cm.executereader() dim cm1 as sqlcommand = new sqlcommand() cm1.connection = cn1 while (mydr.read()) '杀死进程 str = kill & mydr(spid).tostring() cm1.commandtext = str cm1.commandtype = commandtype.text application.doevents() cm1.executenonquery() end while mydr.close() '使要还原的数据库脱机 cm = new sqlcommand(alter database test3 set offline with rollback immediate, cn) cm.executenonquery() '恢复备份 cm = new sqlcommand(restore database test3 from disk=' & all & ' with replace, cn) cm.executenonquery() '使要还原的数据库联机 cm = new sqlcommand(alter database test3 set online with rollback immediate, cn) cm.executenonquery() msgbox(恢复成功,软件自动关闭,请重新启动本系统!) '关闭数据库连接 cn.close() cn1.close() me.close() else exit sub end if end subend class
错误代码一:select spid from test3..sysprocesses where dbid=db_id('test3')
错误描述: 
解决方法:在sql语句前添加use master 即
use master select spid from master..sysprocesses where dbid=db_id('test3')
user master表示在master数据库执行该语句,spid指当前用户进程的会话 id,master是系统数据库,它里面有很多对象,每个对象都有自己的所有者.如果没有指明所有者,系统就默认dbo为对象的所有者.一个对象完整的表达式为:数据库名.所有者.对象, 比如:master.dbo.sysobjects。杀进程前当然要先找出当前该数据库所有的进程了。
错误二:直接用sql语句还原数据库。
错误描述: 
解决方法:
方法一:
在还原之前先将该数据库脱机,恢复之后再联机。前后加上两条sql语句即可。 
alter database [datebase] set offline with rollback immediate
alter  database  [ datebase] set online
方法二:
(该方法采取限制访问数据库的方式,因为实际中我们经常多用户访问,所以符合情况时再考虑这种解决方法吧。)
在还原的时候还有其他进程连在上面,导致无法获得独占造成的,可以使用数据库的单用户模式,设置方式:选中要还原的数据库-->属性-->选项-->限制访问,该值从multi_user修改为single_user。
以下是gui的模式,语句比较简单 
use master 
go 
alter databaseeol_tcgroup set single_user with rollback immediate; 
go
盘锦分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product