如何允许用户备份数据库

时间:2015-11-04 17:41:49

标签: asp.net sql-server

我正在使用 asp.net和sql server 构建项目。 这是3层申请。我想为admin用户提供设备来备份数据库。 数据库应该可以从浏览器下载。 为此我在sql server中使用备份查询。它将数据库的备份放在服务器端,然后用户可以从链接下载.BAK文件。 但是,当数据库的大小超过1/2 GB时,“超时异常”正在发生,并且未在服务器端创建备份。我在连接字符串中增加了超时时间,但没有工作。 我不想要预定备份。应在用户需要时创建备份,并且备份应由用户下载

伙计们请帮帮我..并提前感谢

1 个答案:

答案 0 :(得分:1)

我过去曾写过类似的应用程序。我的方法是创建一个SQL作业来进行备份。它不需要按重复计划安排。

网页只需拨打sp_start_job @job_name = 'MyBackupJob'即可启动作业。这是异步的,因此不会出现任何超时问题。 由于作业无法同时运行,因此也可以防止多人同时运行备份。

然后使用Timer控件或基于javascript / web服务的方法,轮询作业状态。

当作业不再运行时 - 提供下载链接。

这是我用来开始/检查工作的方法。

    ''' <summary>
    ''' Starts the SQL Server job.
    ''' </summary>
    ''' <param name="jobName">Name of the job.</param>
    ''' <param name="connectionString">The connection string.</param>
    ''' <remarks>No exception handling is done.  Assumes connection has access to msdb</remarks>
    Public Sub StartJob(ByVal jobName As String, ByVal connectionString As String)

        Using dbConn As New SqlConnection(connectionString)
            Using dbCmd As New SqlCommand("msdb.dbo.sp_start_job", dbConn)
                dbCmd.CommandType = CommandType.StoredProcedure
                dbCmd.Parameters.AddWithValue("@job_name", jobName)
                dbConn.Open()
                dbCmd.ExecuteNonQuery()
                dbConn.Close()
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Determines whether [is job running] [the specified job name].
    ''' </summary>
    ''' <param name="jobName">Name of the job.</param>
    ''' <param name="connectionString">The connection string.</param>
    ''' <returns>
    ''' <c>true</c> if [is job running] [the specified job name]; otherwise, <c>false</c>.
    ''' </returns>
    ''' <remarks>No exception handling is done.  Assumes connection has access to msdb</remarks>
    Public Function IsJobRunning(ByVal jobName As String, ByVal connectionString As String) As Boolean

        Using dbConn As New SqlConnection(connectionString)
            Using dbCmd As New SqlCommand("msdb.dbo.sp_help_job", dbConn)
                dbCmd.CommandType = CommandType.StoredProcedure
                dbCmd.Parameters.AddWithValue("@job_name", jobName)
                dbConn.Open()
                Dim dr As SqlDataReader = dbCmd.ExecuteReader()
                Dim stat As Integer
                If dr.Read() Then
                    stat = Convert.ToInt16(dr("current_execution_status"))
                Else
                    stat = -1
                End If

                dr.Close()
                dbConn.Close()
                If stat = 1 Then
                    Return True
                Else
                    Return False
                End If
            End Using
        End Using 
    End Function

您可以更进一步,通过检查msdb.dbo.sp_help_job @job_name ='MyBackupJob'

中last_run_outcome的值来检查作业是否成功完成

您可以通过运行此查询来获取备份文件名:

SELECT TOP 1   mf.physical_device_name FROM msdb.dbo.backupset AS s 
INNER JOIN msdb.dbo.backupmediaset AS ms ON s.media_set_id = ms.media_set_id
INNER JOIN  msdb.dbo.backupmediafamily AS mf ON ms.media_set_id = mf.media_set_id
WHERE  s.database_name = N'YourDatabaseName' 
ORDER BY  s.backup_finish_date DESC;