|
|||||
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 |