NonSoft

SQL SERVERのバックアップ/リストア(復元)
のサンプル(VB.NET)


 サンプル(ソース/コード)
SQL SERVERのデータベースをバックアップ/リストア(復元)するサンプル(VB.NET)です。

バックアップは次のSQLを実行しています。
BACKUP DATABASE TEST TO DISK = 'C:\Temp\TEST.bak' WITH FORMAT,NAME = 'Full Backup of TEST';

リストア(復元)は次のSQLを実行しています。
RESTORE DATABASE TEST FROM DISK = 'C:\Temp\TEST.bak'

リストア(復元)用のSQLは、
DB接続しているセッション(ユーザ)が一つも無い時だけ実行出来ますので、
事前に全てのDB接続セッション(ユーザ)を切断する必要があります。

まず次のSQLで、全てのDB接続セッション(ユーザ)を取得します。
SELECT spid FROM master..sysprocesses,master..sysdatabases 
WHERE master..sysprocesses.dbid = master..sysdatabases.dbid AND name = 'TEST';

そして次のSQLで、個々のDB接続セッション(ユーザ)を強制切断します。
KILL <spid>

C#.NET版のサンプルソースはこちらです。
SQL SERVERのバックアップ/リストア(復元)のサンプル(C#.NET)

その他のサンプル(データベース操作等)はこちらです。
サンプルソース(コード)

★フォーム(Form1.vb)
Public Class Form1
    Private Sub Button1_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ' SQLサーバ(localhost)のマスタDB(master)に接続する
        Dim _con As System.Data.SqlClient.SqlConnection = _
            New System.Data.SqlClient.SqlConnection
        _con.ConnectionString = _
            "Server=localhost;" & "Database=master;" & "User ID=sa;" & "Password=;"
        _con.Open()

        ' テストDB(TEST)をバックアップ(C:\Temp\TEST.bak)するSQL作成
        Dim sql As String = _
            "BACKUP DATABASE TEST TO DISK = 'C:\Temp\TEST.bak' " & _
            "WITH FORMAT,NAME = 'Full Backup of TEST';"
        Dim sqlCommand As New System.Data.SqlClient.SqlCommand(sql, _con)
        Dim adapter As New System.Data.SqlClient.SqlDataAdapter(sqlCommand)

        ' バックアップ開始
        Dim dt As New DataTable
        adapter.Fill(dt)

        ' バックアップSQLの解放
        adapter.Dispose()
        sqlCommand.Dispose()

        ' SQLサーバ(localhost)のマスタDB(master)から切断する
        _con.Close()
    End Sub

    Private Sub Button2_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' SQLサーバ(localhost)のマスタDB(master)に接続する
        Dim _con As System.Data.SqlClient.SqlConnection = _
            New System.Data.SqlClient.SqlConnection
        _con.ConnectionString = _
            "Server=localhost;" & "Database=master;" & "User ID=sa;" & "Password=;"
        _con.Open()

        ' テストDB(TEST)をリストア(復元)(C:\Temp\TEST.bak)するSQL作成
        Dim sql As String = _
            "RESTORE DATABASE TEST FROM DISK = 'C:\Temp\TEST.bak';"
        Dim sqlCommand As New System.Data.SqlClient.SqlCommand(sql, _con)
        Dim adapter As New System.Data.SqlClient.SqlDataAdapter(sqlCommand)

        ' リストア(復元)SQLはDB接続しているセッションが存在すると失敗するので、
        ' 事前に全てのDB接続を切断して置くする必要があります。
        Kill_User(_con)

        ' リストア(復元)開始
        Dim dt As New DataTable
        adapter.Fill(dt)

        ' リストア(復元)SQLの解放
        adapter.Dispose()
        sqlCommand.Dispose()

        ' SQLサーバ(localhost)のマスタDB(master)から切断する
        _con.Close()
    End Sub

    Private Sub Kill_User(ByVal _con As System.Data.SqlClient.SqlConnection)
        ' 全てのDB接続セッション取得SQL作成
        Dim sql As String = _
            "SELECT spid FROM master..sysprocesses,master..sysdatabases " & _
            "WHERE master..sysprocesses.dbid = master..sysdatabases.dbid AND name = 'TEST';"
        Dim sqlCommand As New System.Data.SqlClient.SqlCommand(sql, _con)
        Dim adapter As New System.Data.SqlClient.SqlDataAdapter(sqlCommand)

        ' 全てのDB接続セッション取得
        Dim dt As New DataTable
        adapter.Fill(dt)

        ' 全てのDB接続セッション取得SQLの解放
        adapter.Dispose()
        sqlCommand.Dispose()

        For i As Integer = 0 To dt.Rows.Count - 1
            ' 個々のDB接続セッションを強制切断SQL作成
            Dim sql2 As String = "KILL " & dt.Rows(i)(0)
            Dim sqlCommand2 As New System.Data.SqlClient.SqlCommand(sql2, _con)
            Dim adapter2 As New System.Data.SqlClient.SqlDataAdapter(sqlCommand2)

            ' 個々のDB接続セッションを強制切断
            Dim dt2 As New DataTable
            adapter2.Fill(dt2)

            ' 個々のDB接続セッションを強制切断SQLの解放
            adapter2.Dispose()
            sqlCommand2.Dispose()
        Next
    End Sub
End Class