タグアーカイブ | 2.MySQL

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

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

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

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

メニューフォームのcloseイベント

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

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

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

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

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

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

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