Skip to main content.

Saturday, June 24, 2006

DMOを利用したSQLServerのテーブルバックアップ

DMOオブジェクトを利用したSQLServerのバックアップ、リストアについてです。SQLServerのバックアップというと、Enterprise Managerでのデータベース単位のバックアップが一般的かと思いますが、ここではDMOオブジェクトを利用したテーブル単位のバックアップについてです。DMOオブジェクト(分散管理オブジェクト)とは、SQLServerのデータベースとレプリケーションの管理をカプセル化するCOM オブジェクトです。私は、テーブル単位にバックアップをしたいと思った時にDMOを利用しました。バックアップ以外にもデータの移行等で使える場合があるかと思います。

方法はテーブル名を指定して、そのテーブルのデータをテキスト形式のタブ区切りファイルへエクスポートします。私の場合は、VBを利用して画面(フォーム)のないEXE形式のプログラムを作成しました。それで、テーブルごとに日付のファイル名のバックアップファイルを作成して、1か月分バックアップするようにしました。自動実行は、Windowsのタスクに登録して毎日実行するようにしました。

リストアする場合は、日付(ファイル名)を選択して、一度そのテーブルのデータを削除します。それから、そのファイルからテーブルへデータをインポートします。

バックアップのプログラムは以下のように作りました。このブログで公開出来るように修正しました。リストアの時は、ExportDataがImportDataになります。

'定数の設定
Const SQLDMODataFile_TabDelimitedChar = 2
Const SQLDMOBCPDataFile_Char = 1

'バックアップファイルのディレクトリ
Const sBackupDir = "c:\backup\db\"

Sub Main()

On Error GoTo GotoErr

'バックアップルーチン
Dim oServer As Object 'SQLServerオブジェクト
Dim oDatabase As Object 'データベースオブジェクト
Dim oBCP As Object 'BCPオブジェクト
Dim nRows As Long '処理されたRow数

Set oServer = CreateObject("SQLDMO.SQLServer")
Set oBCP = CreateObject("SQLDMO.BulkCopy")

oServer.EnableBcp = True

'SQL-Serverへ接続
oServer.Connect "MySrv", "sa", "MyPassword"

'データベースへ接続
Set oDatabase = oServer.Databases("MyDB")

'テーブルごとのファイル名の作成
Dim sDayTable1 As String
Dim sDayTable2 As String
sDayTable1 = "emp" & Day(Date) & ".txt" '担当者テーブル
sDayTable2 = "dept" & Day(Date) & ".txt" '部署テーブル

'タブ区切りのテキストファイルへの設定等
oBCP.ColumnDelimiter = vbTab
oBCP.DataFileType = SQLDMODataFile_TabDelimitedChar
oBCP.ImportRowsPerBatch = 1000
oBCP.MaximumErrorsBeforeAbort = 1
oBCP.RowDelimiter = vbCrLf
oBCP.ServerBCPDataFileType = SQLDMOBCPDataFile_Char
oBCP.UseExistingConnection = True

'テーブル1
oBCP.DataFilePath = sBackupDir & sDayTable1
nRows = oDatabase.Tables("t担当者").ExportData(oBCP)

'テーブル2
oBCP.DataFilePath = sBackupDir & sDayTable2
nRows = oDatabase.Tables("t部署").ExportData(oBCP)

Exit Sub

GotoErr:

'エラーログ出力などのエラー処理が必要

End Sub

プロジェクトファイルを以下に置きました。プログラム全体はこちらを参照してください。

プロジェクトファイル一式

動作確認しましたが、エラー処理等、不十分ですので、動作は保証できません。このプログラムを利用しての不具合、不利益には一切の責任を負いかねます。ご了承ください。

参考サイト
データベースのためのスクリプト
一括インポートのバッチの管理
バックアップとリストア


Windowsプログラミング関連記事