AccessからMySQLデータバックアップ

スポンサーリンク

Access + MySQL でシステムを稼働していて
定期的にMySQLデータをバックアップさせたいという要望があり
当初はメニュー画面にボタンを付けてと提案したのですが
画面終了時に毎回確認メッセージ表示してバックアップするしないを選択
させてバックアップをしたいという事でした。

でも何故か私の所では上手く動作しなくて(正しくバックアップファイル生成されない)
原因不明のままなのですが、お客様の環境では正常に動作しているというので
そのまま採用になりました。。

コードはこんな感じになりました。

メニューフォームのcloseイベント
[vb]
Rem ———————————————————————————-
Rem Close/閉じる
Rem ———————————————————————————-
Private Sub Form_Close()
Dim sMsg As String

On Error GoTo Error

‘===================
‘ バックアップ
‘===================
sMsg = "バックアップを実行しますか?"
If MsgBox(sMsg, vbInformation + vbYesNo + vbDefaultButton1, C_MSG_TITLE) = vbYes Then
‘*** バックアップ
Call subDBBackUp
End If

‘ access終了
‘ Application.Quit
DoCmd.Quit acQuitSaveNone

Exit Sub
Error:
MsgBox "エラーが発生しました。エラー内容:" & ERR.Description & Chr$(10), vbCritical, C_MSG_TITLE

End Sub
[/vb]

[vb]
Rem ———————————————————————————-
Rem Click/終了
Rem ———————————————————————————-
Private Sub cmd終了_Click()
DoCmd.Close
End Sub
</blockquote>

<blockquote>
Rem ———————————————————————————-
Rem 関数名 : subDBBackUp
Rem 処理内容 : MYSQLのバックアップをします
Rem 引 数  : なし
Rem 戻り値  : なし
Rem ———————————————————————————-
Public Sub subDBBackUp()
Dim objShell As Object
Dim strUser, strPass
Dim strPath As String
Dim strTimestamp As String
Dim strCmd As String

On Error GoTo ERR

‘ バックアップパス取得
strPath = ReadINI("BACKUP", "BACKUP_PATH")
strUser = ReadINI("MYSQL", "DB_USER")
strPass = ReadINI("MYSQL", "DB_PASS")

Set objShell = CreateObject("WScript.Shell")
strTimestamp = Replace(CStr(Now()), "/", "")
strTimestamp = Replace(strTimestamp, " ", "")
strTimestamp = Replace(strTimestamp, ":", "")

strCmd = "mysqldump -u " & strUser & " -p" & strPass & " " & C_DB_NAME & ">" & strPath & C_DB_NAME & strTimestamp & ".dmp"
objShell.Run "cmd /c " & strCmd, vbNormalFocus, True

Set objShell = Nothing

Exit Sub
ERR:
MsgBox "環境設定ファイルを確認してください。" + Chr$(10) + "バックアップに失敗しました。", vbCritical
End Sub
[/vb]

[vb]
Rem ———————————————————————————-
Rem 関数名 : ReadINI
Rem 処理内容 : INIファイルの情報取得
Rem 引 数  : Section,Entry
Rem 戻り値  : 無し
Rem ———————————————————————————-
Public Function ReadINI(Section As String, Entry As String) As String
Dim n As String * 255
Dim rc As Long

rc = GetPrivateProfileString(Section, Entry, "", n, 255, MyPath & IniFileName)
ReadINI = funLeftB(n, InStr(n, Chr(0)) – 1)

End Function

[/vb]

ちなみにiniファイルは、
メモ帳に

[text]
[MYSQL]
SERVER_NAME=localhost
DB_NAME=hoge
DB_USER=root
DB_PASS=hoge
DRIVER_NAME=MySQL ODBC 5.1 DRIVER
[BACKUP]
BACKUP_PATH=C:\prj\access1\SYSTEM_BACKUP\
[/text]

を書いて保存時にXXX.iniとファイル名を指定してaccessと一緒のフォルダに入れます。
hogeの箇所は環境によって修正
これで自動バックアップはOKです。(細かいコード説明は省略します)
ODBCドライバのバージョンは各環境のに合わせてください。

iniファイル便利です。最近小規模システムでは採用すること多いです。
メリットは、DBの名前や環境をかえた時にvbaソースを修正しなくて良いこと
デメリットは、セキュリティ的に大丈夫なの?ということ

一応、iniファイル採用の際は、お客様に確認して導入していますが
小規模だとその方がむしろ納品しやすくて喜ばれます。
というのは、やっぱりお客様環境とは微妙に環境が違うので
パスとかもろもろ、自由に指定できるほうが便利といえば便利なんですよね。
用途に応じて、バックアップパスだけiniファイルに入れるとかでも
良いんじゃないかなって思います。

帳票出力する際のPDF出力パスとか、画像パスとか
VBA内の定数で定義するのもありだけど、定数よりiniファイルの方が
お客様も修正できるので便利ですね。