SQLデータベースファイルのバックアップ・復元

解決


3103  2009-05-18 14:15:41  No: 145925  IP: [192.*.*.*]

VS2005(VB)にて「新しい項目の追加」で追加できる「SQLデータベース」を使用した単体Windowsアプリケーションを作成しています。

このデータベースのバックアップ・復元方法についてどなたか教えていただけますと大変助かります。

こちらを参考にデータベースのバックアップと復元のコードを作成しましたが復元部分でエラーとなってしまいます。
http://msdn.microsoft.com/ja-jp/library/ms162133.aspx

Imports Microsoft.SqlServer.Management.smo
Sub DB_BACKUP()
'データベースのバックアップ
  'SQLサーバーのローカルのデフォルトインスタンスに接続
        Dim srv As Server = New Server
        srv.ConnectionContext.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\DBファイル.mdf;Integrated Security=True;User Instance=True"
        'データベースの参照設定
        Dim db As Database = srv.Databases("C:\DBファイル.mdf")
        '回復モデル
        Dim recoverymod As Integer = db.DatabaseOptions.RecoveryModel
        'Backupオブジェクト変数の定義
        Dim bk As New Backup
        'バックアップのタイプ、記述、名前、データベースの指定
        bk.Action = BackupActionType.Database
        bk.Database = "C:\DBファイル.mdf"
        'バックアップデバイスのタイプの指定(ファイル)
        Dim bdi As BackupDeviceItem = New BackupDeviceItem("C:\DBファイル.bak", DeviceType.File)
        'Backupオブジェクトにデバイスを追加
        bk.Devices.Add(bdi)
        '完全なデータベースバックアップであると指定
        bk.Incremental = False
        'バックアップの有効期限
        Dim backupdate As Date = New Date(2010, 10, 5)
        bk.ExpirationDate = backupdate
        'ログの切捨て
        bk.LogTruncation = BackupTruncateLogType.Truncate
        '完全バックアップの実行
        bk.SqlBackup(srv)
        MessageBox.Show("データベースのバックアップが完了しました。")
End Sub

Sub DB_RESTORE()
’データベースの復元
  Try
  'SQLサーバーのインスタンスに接続
            Dim srv As Server = New Server
            srv.ConnectionContext.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\DBファイル.mdf;Integrated Security=True;User Instance=True"
            'バックアップデバイスの指定(ファイル)
            Dim bdi As BackupDeviceItem = New BackupDeviceItem("C:\DBファイル.bak", DeviceType.File)
            'Restoreオブジェクト変数定義
            Dim rs As Restore = New Restore
            '取引が回復されないようにNoRecoveryの特性を本当に設定してください。
            rs.NoRecovery = False
            '完全なデータベースバックアップをRestoreオブジェクトに含むデバイスを加えてください。
            rs.Devices.Add(bdi)
            'データベース名の指定
            rs.Database = "C:\DBファイル.mdf"
            'データベースの復元
            rs.SqlRestore(srv)  (※)
            MessageBox.Show("データベースの復元が完了しました。")
        Catch ex As Exception
            MessageBox.Show(ex.Message, "エラー")
        End Try
End Sub

上記コードで実行してみますとバックアップファイルは作成されますが、
復元を実行しますと
※印の  rs.SqlRestore(srv)  の部分で
「サーバー(コンピュータ名)の復元に失敗しました」のエラーととなります。

エラーとなる原因のヒントまたは別な方法がありましたら宜しくお願いします。

編集 削除
オショウ  2009-05-18 16:38:24  No: 145926  IP: [192.*.*.*]

ManagementStudioで手動で復元する際の設定で・・・
上書きを行うようにしないと、既存のDBに復元
できませんせんよね?!

多分、そうだと思うので、上書きを許可するよう
にして復元してみて下さい。

あ!
それと・・・
SQLデータベースで作成したものは、そのDBのストアドに
登録されていると思いますが、そうしますと、自分自身に
上書きすることになるはずなので、この場合、そのDBに
接続したまま上書きはできない・・・と思いますが・・・

ご検討下さい。

※  そうじゃない?
    違っていたらすいません・・・
以上。

編集 削除
3103  2009-05-19 17:07:56  No: 145927  IP: [192.*.*.*]

オショウ様
書込みありがとうございます。

ManagementStudioでの復元処理は問題なく出来るのですが
今回はコードで復元処理をしたく困っておりました。

ちなみにManagementStudioでSQL EXPRESSのデータベースを作成した場合は
上記のコードでのバックアップ・復元処理は出来ています。
※srv.ConnectionContext.ConnectionString =・・・の部分を
  srv.ConnectionContext.ConnectionString ="localhost\SQLEXPRESS"に
変更しています。

という事はRestoreの設定で何か足りないか、
VSで追加したSQLデータベースファイルはこの方法では実現できないという事になるのでしょうか・・・。

編集 削除
オショウ  2009-05-19 21:02:10  No: 145928  IP: [192.*.*.*]

http://blog.livedoor.jp/akf0/archives/51482492.html

ここのコードが参考になりませんか?

後半にはいろいろカキコありましたが・・・

以上。参考まで

編集 削除
3103  2009-05-20 18:49:06  No: 145929  IP: [192.*.*.*]

オショウ様
お世話になっております。

教えていただきましたコードも参考に色々と試してみました。

結果として復元処理を行う前に一度データベースへ接続・接続解除していますので、
試しに復元処理を実行する前に
SqlConnection.ClearPool(・・・)で接続プールを空にしたところ
復元処理がうまくいきました。

結局のところ接続したままの状態で上書きしようとした為エラーとなっていたようですね・・・。
(接続解除していますので問題ないと思っていました。)

この度は大変助かりました。ありがとうございました。

編集 削除
ssc  2009-07-09 18:22:09  No: 145930  IP: [192.*.*.*]

上記で試しても中々上手くいかなかったので補足しておきます。

バックアップコード  DB_BACKUP()の
最後に
srv.DetachDatabase([アタッチmdfファイルのパス], False)
を追加してバックアップの接続を解放

リストアコードは以下のようにして上手くいきました。
Private Sub DB_Restore()
        Dim srv As New Server
        Dim rs As New Restore

        Dim dbNm As String = [アタッチmdfファイルのパス]
        Dim backupFile As String = "C:\DBファイル.bak"
        Try
            '復元に利用するバックアップを指定

            Me.Cursor = Cursors.WaitCursor

            'サーバへの接続情報を設定
            srv.ConnectionContext.ConnectionString = "Data Source=.\SQLEXPRESS;Integrated Security=True;AttachDbFilename=" & dbNm & ";" & User Instance=True"

            srv.Databases(dbNm).Drop()

            'バックアップ装置を指定する
            Dim bdi As New BackupDeviceItem(backupFile, DeviceType.File)
            rs.Devices.Add(bdi)

            '復元(リストア)の動作を決める
            rs.NoRecovery = False
            rs.ReplaceDatabase = True
            rs.Action = RestoreActionType.Database
            rs.Database = dbNm
            rs.PercentCompleteNotification = 10

            '復元(リストア)の実行
            rs.SqlRestore(srv)

            MessageBox.Show("完了", "通知")
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Exclamation)
        Finally
            Me.Cursor = Cursors.Default
        End Try
    End Sub

編集 削除