说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

100分求教一个数据库备份的问题,回答后马上送分,谢谢!

编辑:说三道四文库 发布时间:2018-04-24 04:35
HTML文档下载 WORD文档下载 PDF文档下载
A.有一个数据库hospital,我想备份时弹出一个另存对话框,可以将此备份文件备份到我选择的局域网内任何一个共享的文件夹中(并且对此文件夹的操作只能输入密码时才能进行),如何做呢?
  B.并且如何得到对话框中的路径,备份到其它机器上时有没有其它的区别???
  C.我在SQL查询分析器里执行如下语句:
  sp_addumpdevice 'disk','hospital','hospital.bak'
  backup database hospital to hospital
  restore database hospital from hospital
总是出现这样数据库 "因为数据库正在使用,所以未能获得对数据库的排它访问权"的错误。我想这样的原因是不是要关掉此前数据库hospital的联接,但怎么做呢?

第一次在程序里做数据库的备份,一点都不了解,如果你们原来做过这方面的,最好能贴上源码??解决了分还可再加!!!
再次表示感谢!!帮帮我!
http://expert.csdn.net/Expert/topic/1855/1855737.xml?temp=.1838953


希望对楼主有所帮助。
1、如果想要在局域网中备份,你得先登陆这台机器,然后就可以直接选择共享的文件夹备份了。
2、数据库正在使用,肯定是你打开了,检查检查操作,关闭就是了。你不会不知道你在什么地方打开这个数据库了吧???
1,要在局域网中备份,你得先登陆这台机器,然后就可以直接选择共享的文件夹备份了。
2,肯定有一个是本地另一个网络
3,好像是要关闭
可以在本地机上用了,(一定要用master数据库好像才可以备份)但不能在局域网上备份,可能是disk媒体类型错误.
请问网络中的硬盘的类型是什么呢???
学习.
'备份数据库
'需要添加一个commoldialog控件
Sub backDataBase()
    cn1.Execute "use master"
    dlg.Filter = "(*.bak)|*.bak"
    dlg.ShowOpen
    MousePointer = 11
    cn1.Execute "BACKUP DATABASE hetong TO DISK = '" & dlg.FileName & "'"  '备份数据库
    MousePointer = 0
    Set cn1 = Nothing
    '重新建立连接
 
    Set cn1 = New ADODB.Connection
    cn1.Open "Driver={SQL Server};Server=" & SQL_SRV & ";Uid=" & SA & ";Pwd=" & PA & ";Database=" & SJK & ""
End Sub
最后刷新一次,如何进行将数据库备份到网络上和怎么样从局域网中还原SQL数据库.
再次感谢,请帮帮忙.我就结贴.
顶最后一下,希望有人能回答.
jinhai2003(飞鱼)这样不行吗?只能帮你up了
gz
'======================QQYY_sj==========================
gz
添加一个commondialog控件,名称为dlg,我要备份和恢复的数据库名字为hy,执行备份的语句就是
sql = "BACKUP DATABASE hy TO disk='" & dlg.FileName & "'"
Cn.Execute (sql)
恢复的语句:
sql = "RESTORE DATABASE hy FROM disk='" & dlg.FileName & "' WITH replace"
Cn.Execute (sql)

1、备份数据库代码
Dim Ret As String
    
    '备份数据库hy
    Ret = MsgBox("备份主要数据库--hy ?", vbOKCancel + vbInformation, "提示")
    If Ret = vbOK Then
            
        dlg.CancelError = False
        dlg.Filter = "(*.bak)|*.bak"
        
        dlg.ShowSave
        '如果dlg控件点击取消
        If dlg.FileName = "" Then
            Exit Sub
        End If
        If Dir(dlg.FileName) <> "" Then
            If MsgBox("文件" & dlg.FileName & "已存在!要替换吗?", vbYesNo, "提示") = vbYes Then
                Kill dlg.FileName
            Else
                Exit Sub
            End If
        End If
        '执行备份

        connectString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Data Source=hh-zhou;Initial Catalog=master"
        MousePointer = 11
        Dim Cn As New ADODB.Connection
        If Cn.State = adStateOpen Then Cn.Close
            Cn.ConnectionTimeout = 10
            
            Cn.Open ConnectString
        
        sql = "BACKUP DATABASE hy TO disk='" & dlg.FileName & "'"
        Cn.Execute (sql)
        
        Cn.Close
        Set Cn = Nothing
        MousePointer = 0
    End If

2、恢复数据库代码

Dim Ret As String
    Ret = MsgBox("恢复主要数据库--hy?数据恢复操作将会覆盖以前的所有数据并且覆盖后无法恢复,您确定要进行恢复操作吗?", vbOKCancel + vbInformation, "提示")
    If Ret = vbOK Then
        
        dlg.CancelError = False
        dlg.Filter = "(*.bak)|*.bak"
        dlg.ShowOpen
            
        If dlg.FileName = "" Then
            Exit Sub
        End If
        
        If Dir(dlg.FileName) = "" Then
            MsgBox "文件" & dlg.FileName & "不存在!", vbOKOnly + vbInformation, "提示"
            Exit Sub
        End If
        
        MousePointer = 11
        
        Dim Cn As New ADODB.Connection
        Dim rst As New ADODB.Recordset
        connectString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Data Source=hh-zhou;Initial Catalog=master"
        If Cn.State = adStateOpen Then Cn.Close
            Cn.ConnectionTimeout = 10
            
            Cn.Open ConnectString
            rst.Open "select spid from sysprocesses where dbid=db_id('hy')", Cn
            Do While Not rst.EOF
              Cn.Execute "kill " & rst("spid") '杀掉sql服务器的所有连接,否则会出现:数据库正在使用,无法完成排它操作等等,很重要
              rst.MoveNext
            Loop
            rst.Close        
        sql = "RESTORE DATABASE hy FROM disk='" & dlg.FileName & "' WITH replace"
        Cn.Execute (sql)
        
        MousePointer = 0
        Cn.Close
        Set Cn = Nothing
        MsgBox "数据库'hy'恢复成功!", vbOKOnly + vbInformation, "操作成功"
    End If
'这是我的程序,
'*********************************************************************
Private Sub cmBackUP_Click()
Dim c                As String
Dim s_path, s_dataexport As String
 txtMsg = MsgBox("您确认备份此数据库吗?", vbQuestion + vbOKCancel, "提示")
If txtMsg = vbOK Then
  Me.MousePointer = MOUSE_WAIT   '设置鼠标指针形状
  c = CStr(Year(Date)) + "年" + CStr(Month(Date)) + "月" + CStr(Day(Date)) + "日" + _
      CStr(Hour(Time)) + "时" + CStr(Minute(Time)) + "分的数据库备份"
  dlgOpen.filename = c
  dlgOpen.ShowSave
  s_path = App.Path
  'hospital是需要备份的数据库名称

  s_dataexport = "BACKUP DATABASE hospital TO disk='" + dlgOpen.filename + "'"
  '这里不需要连接master数据库,即可完成备份

  Conn.Execute s_dataexport
    Conn.BeginTrans
  Err.Number = 0
  If Err.Number = 0 Then
    Conn.CommitTrans
    MsgBox "数据备份成功!", vbInformation, "提示"
    MsgBox "数据备份文件存放路径:" & dlgOpen.filename, vbOKOnly, "提示"
    Unload Me
  Else
    Conn.RollbackTrans
    MsgBox "数据备份失败!请检查数据库是否正在打开!", vbCritical, "提示"
  End If
   Else
  Exit Sub
 End If
End Sub

Private Sub cmdRestore_Click()
Dim s_restore                   As String
     
ret = MsgBox("数据恢复操作将会覆盖以前的所有数据并且覆盖后无法恢复," & _
            "您确定要进行恢复操作吗?", vbQuestion + vbOKCancel, "提示")
  If ret = vbOK Then
        Me.MousePointer = MOUSE_WAIT
        Conn.Close
       Set Conn = Nothing
       Set Cn = New ADODB.Connection
      Const ConnString = "Provider=SQLOLEDB.1;" & _
                   "Integrated Security=SSPI;" & _
                   "Persist Security Info=False;" & _
                   "Initial Catalog=master"
       Cn.Open ConnString
       dlgOpen.ShowOpen
            s_restore = "RESTORE DATABASE hospital from disk='" + dlgOpen.filename + "' WITH REPLACE"
        Cn.Execute s_restore
        Cn.BeginTrans
        If Err.Number = 0 Then
            Cn.CommitTrans
            MsgBox "数据恢复成功!", vbInformation, "提示"
        Else
            Cn.RollbackTrans
            MsgBox "数据恢复失败!", vbCritical, "提示"
        End If
           Cn.Close
        Set Cn = Nothing
        Me.MousePointer = 1
      Call strartPro
      Call ConnectServer
        Else
      Exit Sub
  End If
End Sub
'**********************************************
以上程序可以备份到自己的机器上,但不可以备份到别人的机器上.即在网络上是不可用的.没有提示错误,但是确找不到备份文件.
如果用存储过程sp_addumpdevice事先指定备份路径,无论路径如何,则总会将此文件备份到SQL安装目录中的backup的文件夹中,不知是何原因.
Call strartPro
      Call ConnectServer
两个函数是重新联接conn和rst
用读语句备份,虽然很慢,但是不用关闭别人已经打开的数据库!
mark
sql server的备份有很多可选参数,比如备份到设备\文件,增量\差异,日志\文件\日志+文件,备份到设备还可以加备份标识,各位老大?这些你们谁能讲讲??
把数据库的连接关闭,直接用fileCopy进行复制
学习
好东西
问题可能出在s_dataexport = "BACKUP DATABASE hospital TO disk='" + dlgOpen.filename + "'"这句话之前,不应该用dlgopen.filename=c,因为c不带全路径,你再试一下吧.
一个正确的答复:
  1、备份数据库时,数据库不需要断开连接
  2、恢复数据库时,数据库必须断开连接!
'可备份日常数据,使得数据万无一失
'一天备无数次完全不经人手
'下面是本程序的源代码
'//////////////////////////////////////////////////////////

Private Sub Form_Load()
Dim Path As String                           '设置目录生成路径
Dim tmp                                      'shell函数执行变量
Dim DateName As String                       '数据库日期目录,从中提取月份和日期,并建立目录
Dim DayTime As String                        '时间缺省值
Dim Tim As String                            '数据库备份时间目录变量
Dim filepath                                 '读取数据库备份的来源目录变量
'//////////////////////////////////////////////////////////

    DayTime = "AM"                           '时间缺省值为早上
    Tim = Trim(Format$(Str(Time), "hh_mm"))  '设置日期格式为"时时_分分"
    '下面判断备份时间是早上还是下午
    If Int(Left(Tim, 2)) > 12 Then Tim = "0" & Trim(Str(Int(Left(Tim, 2)) - 12)) & Right(Tim, 2): DayTime = "PM"
   '//////////////////////////////////////////////////////////////////////////////////////////////
    MsgBox Tim
    Tim = Left(Tim, 2) & "_" & Right(Tim, 2)      '取时间值
    DateName = Trim(Format$(Str$(Date), "mm_dd")) '设置日期格式为"月月_日日"
    
    If Right(App.Path, 1) <> "\" Then             '取当前软件运行路径
       Path = App.Path & "\" & Left(DateName, 2)  '设置备份月份路径变量
       Else: Path = App.Path & Left(DateName, 2)
    End If
        
    tmp = Shell("command.com /c md " & Path)      '生成备份月份路径变量
    Path = Path + "\" + Right(DateName, 2)        '设置备份日期路径变量
    tmp = Shell("command.com /c md " & Path)      '生成备份月份路径变量
    DayTime = Trim(DayTime) & Trim(Tim)           '得到备份时间目录名
    Path = Path & "\" & DayTime                   '得到备份时间目录路径
    tmp = Shell("command.com /c md " & Path)      '生成备份时间目录
'///////////////////////////////////////////////////////////////////////////////////////////////
    '打开数据来源设置文件并取得来源路径
      If Right(App.Path, 1) <> "\" Then PH = App.Path & "\" & "copyfrom.ini"
    Open PH For Input As #1
    filepath = Input$(LOF(1), 1) '取得路径
   If filepath = "" Then         '如果为空,即提示错误并退出程序
      MsgBox "拷贝路径没有设置好!"
      Unload Form1
   End If
   filepath = Trim(filepath)
   Close #1
   tmp = Shell("command.com /c xcopy " + filepath + " " + Path) '生成时间子目录
   Unload Form1                                                 '完成后退出程序
End Sub
'/程序完成/
1、备份数据库时,数据库不需要断开连接
  2、恢复数据库时,数据库必须断开连接!
SQL服务器上架设IIS服务,用ASP就可以备份并下载到本机..

'备份数据库并提供下载的asp文件
<%
Response.Buffer=true
Response.Clear

'根据你的情况修改用户名和密码
constr="Provider=SQLOLEDB.1;Persist Security Info=True;User ID=用户名;Password=密码;Data Source=(local)"

set conn=server.createobject("adodb.connection")
conn.open constr
bkfname=server.mappath("数据库备份.bak")
sqlstr="backup database pubs to disk='"+bkfname+"' with init"
conn.execute sqlstr
conn.close

set fn=server.createobject("adodb.stream")
fn.mode=3
fn.type=1
fn.open
fn.LoadFromFile bkfname
Response.ContentType="application/octet-stream"
Response.BinaryWrite fn.read
fn.close
%>

'*************************************************************************
'**模 块 名:fBackupDatabase_a
'**描    述:备份数据库,返回出错信息,正常恢复,返回""
'**调    用:fBackupDatabase_a "备份文件名","数据库名"
'**参数说明:
'**          sBackUpfileName  恢复后的数据库存放目录
'**          sDataBaseName    备份的数据名
'**          sIsAddBackup     是否追加到备份文件中
'**说    明:引用Microsoft ActiveX Data Objects 2.x Library
'**创 建 人:邹建
'**日    期:2003年12月09日
'*************************************************************************
Public Function fBackupDatabase_a(ByVal sBackUpfileName$ _
                                , ByVal sDataBaseName$ _
                                , Optional ByVal sIsAddBackup As Boolean = False _
                                ) As String
                                
    Dim iDb As ADODB.Connection
    Dim iConcStr$, iSql$, iReturn$
    
    On Error GoTo lbErr
    
    '创建对象
    Set iDb = New ADODB.Connection
    
    '连接数据库服务器,根据你的情况修改连接字符串
    iConcStr = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=zj"
    iDb.Open iConcStr
    
    '生成数据库备份语句
    iSql = "backup database [" & sDataBaseName & "]" & vbCrLf & _
            "to disk='" & sBackUpfileName & "'" & vbCrLf & _
            "with description='" & "zj-backup at:" & Date & "(" & Time & ")'" & vbCrLf & _
            IIf(sIsAddBackup, "", ",init")
            
    iDb.Execute iSql
    GoTo lbExit
    
lbErr:
    iReturn = Error
lbExit:
    fBackupDatabase_a = iReturn
End Function

'*************************************************************************
'**模 块 名:frestoredatabase_a
'**描    述:恢复数据库,返回出错信息,正常恢复,返回""
'**调    用:frestoredatabase_a "备份文件名","数据库名"
'**参数说明:
'**          sDataBasePath  恢复后的数据库存放目录
'**          sBackupNumber  是从那个备份号恢复
'**          sReplaceExist  指定是否覆盖已经存在的数据
'**说    明:引用Microsoft ActiveX Data Objects 2.x Library
'**创 建 人:邹建
'**日    期:2003年12月09日
'*************************************************************************
Public Function fRestoreDatabase_a(ByVal sBackUpfileName$ _
                                , ByVal sDataBaseName$ _
                                , Optional ByVal sDataBasePath$ = "" _
                                , Optional ByVal sBackupNumber& = 1 _
                                , Optional ByVal sReplaceExist As Boolean = False _
                                ) As String
    
    Dim iDb As ADODB.Connection, iRe As ADODB.Recordset
    Dim iConcStr$, iSql$, iReturn$, iI&
    
    On Error GoTo lbErr
    
    '创建对象
    Set iDb = New ADODB.Connection
    Set iRe = New ADODB.Recordset
    
    '连接数据库服务器,根据你的情况修改连接字符串
    iConcStr = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=zj"
    iDb.Open iConcStr
    
    '得到还原后的数据库存放目录,如果没有指定,存放到SQL SERVER的DATA目录
    If sDataBasePath = "" Then
        iSql = "select filename from master..sysfiles"
        iRe.Open iSql, iDb, adOpenKeyset, adLockReadOnly
        iSql = iRe(0)
        iRe.Close
        sDataBasePath = Left(iSql, InStrRev(iSql, "\"))
    End If
    
    '检查数据库是否存在
    If sReplaceExist = False Then
        iSql = "select 1 from master..sysdatabases  where name='" & sDataBaseName & "'"
        iRe.Open iSql, iDb, adOpenKeyset, adLockReadOnly
        If iRe.EOF = False Then
            iReturn = "数据库已经存在!"
            iRe.Close
            GoTo lbExit
        End If
        iRe.Close
    End If
    
    '关闭用户进程,防止其它用户正在使用数据库,导致数据恢复失败
    iSql = "select spid from master..sysprocesses where dbid=db_id('" & sDataBaseName & "')"
    iRe.Open iSql, iDb, adOpenKeyset, adLockReadOnly
    While iRe.EOF = False
        iSql = "kill " & iRe(0)
        iDb.Execute iSql
        iRe.MoveNext
    Wend
    iRe.Close
    
    '获取数据库恢复信息
    iSql = "restore filelistonly from disk='" & sBackUpfileName & "'" & vbCrLf & _
        "with file=" & sBackupNumber
    iRe.Open iSql, iDb, adOpenKeyset, adLockReadOnly
    
    '生成数据库恢复语句
    iSql = "restore database [" & sDataBaseName & "]" & vbCrLf & _
        "from disk='" & sBackUpfileName & "'" & vbCrLf & _
        "with file=" & sBackupNumber & vbCrLf
    With iRe
        While Not .EOF
            iReturn = iRe("PhysicalName")
            iI = InStrRev(iReturn, ".")
            iReturn = IIf(iI = 0, "", Mid(iReturn, iI)) & "'"
            iSql = iSql & ",move '" & iRe("LogicalName") & _
                    "' to '" & sDataBasePath & sDataBaseName & iReturn & vbCrLf
            .MoveNext
        Wend
        .Close
    End With
    iSql = iSql & IIf(sReplaceExist, ",replace", "")
    
    iDb.Execute iSql
    iReturn = ""
    GoTo lbExit
    
lbErr:
    iReturn = Error
lbExit:
    fRestoreDatabase_a = iReturn
End Function
哦,备份数据库而已,怎么搞的这么复杂?~~
幸好最近我在公司老做这个工作,可以说是熟之又熟。
已结贴,但还是没找到可行性的方法,yassee(甲克虫)你有什么好方法吗?可以给我发短信,我可以另开贴送分.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘