どうもお世話になってます。
多数のWebサイトを管理している中でバックアップが面倒になってきたので、自動化しました。
当時参考にしたサイトとかは失念してしまったのですが、もし似た記述やパクリ等あればご指摘いただければ幸いです。
メモ書き程度で公開します。何かあれば追記するかも。
batch
WinSCP.iniを利用してFTP接続してデータをダウンロードします。
丸ごとバックアップは時間がかかりすぎるので、synchronizeで差分を取得します。
backup.bat
//これらはよくわかっていないが、何やら必要そうなのでつけている
pushd %~dp0
setlocal
chcp 65001
rem サイト名の指定
set SiteID=管理用通し番号
set targetSite=サイトドメインとか
rem FTPサーバ情報の指定
set hostname=ホスト名
set ID=ユーザー名
set PASS=パスワード
set FTPDir=バックアップ対象ディレクトリ
rem 作業ディレクトリの指定
set driveName=保管領域親
set backupDir=保管ディレクトリ
rem 保存フォルダの指定(日付-サイト名)
set backupDirPath=%driveName%\%backupDir%
set logfile=%backupDirPath%\backuplog.log
rem ログファイルの削除・新規作成
del %backupDirPath%\sync_log.txt
set INPUT_LOG=%backupDirPath%\sync_log.txt
rem ### ログファイルに出力する各種メッセージを定義(開始、処理中、終了)
set Message_START=BackUp Start
set Message_END=BackUp Finish
rem ### 開始ログ出力
echo %date:/=-% %time:.=,%0 %Message_START% >> %logfile% 2>&1
echo off
set SESSION=ftp://%ID%:%PASS%@%hostname%
set SCRIPT=%backupDirPath%\scpdownload.txt
set BKTARGET=%backupDirPath%/
echo open %SESSION% > %SCRIPT%
echo cd %BKTARGET% >> %SCRIPT%
rem 除外ディレクトリ指定
echo option exclude "/不要/ディレクトリ/指定/;" >> %SCRIPT%
echo synchronize local -mirror %FTPTARGET% >> %SCRIPT% -delete
echo exit >> %SCRIPT%
cd ../../
cd "WinSCP"
winscp.com /ini=WinSCP格納ディレクトリ\WinSCP.ini /script=%SCRIPT% /log=%INPUT_LOG%
set RESULT=%ERRORLEVEL%
echo %date:/=-% %time:.=,%0 %Message_END% >> %logfile% 2>&1
endlocal
rem @echo このbatは処理を完了しました。確認してこのウインドウを閉じてください。
rem cmd /k
この処理の問題点
・FTP接続が脆弱
本来であればパスワード等は直書きでなく別ファイルに記述して呼び出すのがよいと思われる。が、今回はこのファイルはローカルに置くのでよしとする。
cron
DBのdumpをエクスポートするシェルスクリプトを作成し、ドキュメントルートより上の階層に保存する
これによって上記batchでFTPと一緒にDBのdumpファイルをダウンロードできる
※このファイルはbatchと違ってWebサーバーに設置するのでパスワードの直書きは避けた
#!/bin/bash
cd 保存領域へ移動
/usr/bin/mysqldump --defaults-extra-file=アカウント情報記述ファイル -Q --no-tablespaces -h ホスト名 DB名 > ダウンロードファイル名.sql 2> dump.error.txt
タスクスケジューラ
このバックアップを定期的に実施する必要があった。
ローカルのbatchファイルを動かすので、今回はWindows標準のタスクスケジューラにて実行した。