WordPressの運用を行っていると「特定のDBだけを過去に戻したい!」というニーズが発生します。
これを可能にする為には、MariaDBの特定DBを定期的にバックアップする必要があります。
それを行うのが「タスクスケジューラ」です。
1.タスクスケジューラの使い方の概要
1.コントロールパネルの下記アイコンをクリックします。
2.この中に下記コマンドを登録します。
/volume1/web/mysql_backup/mysql.sh>>/volume1/web/mysql_backup/mysql_backup.log
上記は「web¥mysql_backup」フォルダの「mysql.sh」プログラムを実行し、その結果を「mysql_backup.log」ファイルに書き込みなさい!という命令です。
上記のタスクを定期的に実行するスケジュールを設定すると「MariaDBの中のDB」が定期的にバックアップされるようになります。
下記に具体的な設定方法を解説していきます。
2.バックアップタスクの具体的な作成方法
1.バックアップフォルダを作成します
1.下記アイコンから「File Station」を開いて下さい。
2.「Webフォルダを選択」して「作成→新規フォルダの作成」で「mysql_backup」フォルダを作成してください。
※フォルダ名は任意ですが大文字小文字は識別しますので小文字が推奨です。
上記の「mysql_backup」フォルダの中に下記ファイルが入ります。
①MySQLのDBをバックアップする「シェルスクリプト」
ファイル名は「mysql_backup.sh」として作成します
②バックアップされた「sqlファイル」
①が実行されるとDBをバックアップしたSQLファイルができます
③バックアップタスクの実行結果の「ログファイル」
①が実行された結果としてログが作成されます。
2.DBをバックアップするスクリプトを作成します。
「mysql_backup」フォルダの中に「mysql_backup.sh」ファイルを作成します。
この中に「mysqldump」を使ったシェルスクリプトを作成します。
シェルスクリプト作成時の注意点
①シェルスクリプトを実行するのはLinuxサーバになりますので改行は<LF>のみです。
Windowsのメモ帳を使うと改行は<LF><CR>になりますので正常に動きません。
EmEditorでスクリプトを作成する場合は『名前を付けて保存』時に改行方法指定で<LFのみ>で保存して下さい。
何れにしてもスクリプトの作成ツールは改行が<LF>にできるテキストエディタを使ってください。
②スペースは必ず半角スペースを使ってください。全角スペースは誤動作の原因になります。
尚、数値の代入は、スペースを入れてはいけない所です。
一方、if文は、スペースが必要な所です。
〇の例 job_err=true 及び if [ $job_err = true ]; then
×の例 job_err = true 及び if [$job_err=true]; then
詳細は「シェルスクリプトの書き方」を調べてください。
③シェルスクリプトの変数名には「ハイフン」は使えません。「アンダースコア」を使ってください。
④mysqldumpの場所はDSMのバージョンやターゲットDBによって異なりますので気を付けて下さい。
1.下記サンプルスクリプトを参考にして「mysql_backup.sh」を作成して下さい。
#①旧バックアップファイルの削除 cd /volume1/web/mysql_backup/ rm *.sql #②job_errのリセット job_err=false #③〇〇DBのバックアップ(job1) /usr/local/mariadb10/bin/mysqldump --single-transaction --databases 〇〇 --user=xx --password=×× > /volume1/web/mysql_backup/out_oldies.sql if [ $? = 0 ]; then job1=0 else job1=$? job_err=true fi #④✖✖DBのバックアップ(job2) /usr/local/mariadb10/bin/mysqldump --single-transaction --databases ×× --user=xx --password=×× > /volume1/web/mysql_backup/out_ec01.sql if [ $? = 0 ]; then job2=0 else job2=$? job_err=true fi #⑤日付及びバックアップ結果の出力 date_stamp=`date '+%Y-%m-%d %H:%M'` echo "#"$date_stamp echo ' 〇〇=' ${job1} ',××=' ${job2} #⑥終了処理(エラーがある場合は1でリターン) if [ $job_err = true ]; then exit 1 else exit 0 fi
①「mysql_backup」フォルダの中にある、現在のSQLファイルを削除しています。
②変数「job_err」をリセット
この変数はスクリプトの何処かでエラーがあるとセットされる変数です。
③1つ目の「mysqldump」の実行コマンドです。環境に合わせて変更が必要です。
エラーがあった場合は変数「job1」と「job_err」にエラーをセットしています。
④2つ目の「mysqldump」の実行コマンドです。環境に合わせて変更が必要です。
エラーがあった場合は変数「job2」と「job_err」にエラーをセットしています。
※更にバックアックするDBがあった場合はこの下に追加します。
⑤日付及びバックアップ結果を「mysql_backup.log」に出力します。
⑥エラー処理
スクリプトの何処かでエラーがあった場合は「1」で終了させる事により「タスクスケジューラ」にエラーを教えます。「タスクスケジューラ」では、エラーがあった事をDSM管理者にメールします。
【参考1】mysqldumpプログラムの場所
mysqldumpプログラムは、ポート番号等で対象DBを選択できないので、何処のプログラムを使うか?で対象DBが異なります。
またプログラムの登録場所は「DSMのバージョン」により場所が異なります。
MariaDB10 | MariaDB5 | |
DSM5.2 | - | /usr/syno/mysql/bin/mysqldump |
DSM6.0 | - | /usr/bin/mysqldump |
DSM6.1以降 | /usr/local/mariadb10/bin/mysqldump | /usr/bin/mysqldump |
※作成したスクリプトファイルが上手く動かない場合は、プログラムの場所を調べて下さい。
【参考2】上記で利用しているmysqldumpのオプション
オプション | 説明 |
–single-transaction | このオプションはデータのダンプ前に、トランザクション分離モードをREPEATABLE READに設定し、START TRANSACTION SQL ステートメントをサーバーに送信します。
よってアプリケーションをブロックすることなく、START TRANSACTIONが発行された時点のデータベースの一貫した状態をダンプします。 |
–databases | ダンプを取るDB名です。 |
–user= | phpMyAdminのログインユーザ名を記述します。 |
–password= | 上記ユーザのパスワードを記述します。 |
3.タスクスケジューラに、上記のスクリプトを実行するタスクを作成し実行する。
1.コントロールパネルからタスクスケジューラを起動します。
2.下記画面の「作成→予約タスク」→『ユーザ指定のスクリプト』を実行します。
3.下記画面が表示されます。全般タブにタスク名とユーザ名を選択します。
①「タスク」の所は判り易いタスクの名前を入れて下さい
②「ユーザ」の所はMariaDBにアクセスできるユーザを選択します。rootで可
4.タスク設定タブ画面を開いてください。
①『Eメールで詳細な実行情報を送信』にチェックを入れると、無条件に指定したメールに実行結果が通知されます。
②『スクリプトが異常終了した場合のみ詳細な実行情報を送信』にチェックを入れるとエラーがあった時だけメールが送られるようになります。
メモ
エラー連絡は、スクリプトの終了時に下記を指定すると実現できます。
exit 1:エラーがあった事を通知します。
exit 0 :エラーが無かった事を通知します。
③ユーザ指定のスクリプトの所に実行するスクリプトとログファイルを記述します。
/volume1/web/mysql_backup/mysql_backup.sh>>/volume1/web/db_backup/mysql_log.txt
■/volume1/web/mysql_backup/mysql_backup.shは、実行するシェルスクリプトです。
■>>/volume1/web/mysql_backup/mysql_log.txtは実行結果のログを記載するログファイル名です。
メモ
>>は追記指定です。これを>にすると上書きになります。
5.総ての入力が終わったら『OK』を挿入しジョブを登録し、実行ボタンで検証してください。
上記の実行ボタンを挿入して、正常にバックアップデータとログが書き込まれるか?を確認してください。
<実行後のmysql_backupフォルダのファイル構成>
尚、mysl_log.txtは、メモ帳でなくEmEditorで開いてください。(改行が<LF>のみなので!)
またmysql_backup.sqlファイルもEmEditorで開くと、編集する事も可能です。
6.最後に、作成したユーザ指定スクリプトを呼び出し、スクジュールタブで実行時間と間隔を指定して下さい。
以上で定期的なMySQLDBのバックアップが完了しました。
メモ
上記のスクリプトはMariaDBに入っている特定DBをSQLファイルでダンプしただけです。
WordPressは上記のDBとWeb直下にあるフォルダから構成されています。
よって上記スケジューラが走った後で、下記の何れかのバックアップを実行する必要があります。
無償クラウド(Google Drive)へのバックアップとリストア
これで特定時点のDBダンプとWeb直下にあるフォルダが履歴を持ってバックアップされます。
3.WordPressを過去の時点に戻すやり方
ここでは「WP1」というWordPressを過去の時点に戻すケースで解説します。
戻すデータは下記になります。
①Web直下にある「wp1」フォルダ
②mysql_backupフォルダの中にある「out_wp1.sql」ファイル
1.バックアップデータから戻す前にやる事
①「WP1フォルダ」をリネームします(例:_wp1)
理由
「Hyper Backup」のリストアは「上書き」です。
よって障害がある「プラグイン」や「ファイル」がバックアップデータには無い場合は、現在のファイルがそのまま残ります。
よって障害がそのまま残る可能性があります。
②「mysql_backup」フォルダの当該SQLファイルをリネームします。(例:_out_wp1.sql)
理由
「Hyper Backup」のリストアは「上書き」なので、リストアすると「上書き」されます。
よって過去のSQLファイルが戻った事を確認する為です。
2.「Hyper Backup」からバックアップデータを戻します。
①下記アイコンをクリックします。
②下図の「バージョンリスト」をクリックします
③バージョン一覧が表示されます。
■戻したいバージョンにカーソルを持ってくるとメニュが表示されるので時計マークを「クリック」します
④バックアップエクスプローラーが表示されます。
■戻したい「wp1」フォルダを選択して「復元」ボタンを挿入します。
WP1フォルダが戻ります。
■「mysql_backup」フォルダを開いて、戻したい「out_wp1.sql」を選択して「復元」ボタンを挿入します。
以上で、「WP1」フォルダと「out_wp1.sql」ファイルが戻りました。
3.DBを復元します
①phpMyAdminを起動してください。
②今まで使っていたDBの名前を変更する
対象のDBを選択すると下記メニュが表示されます。
■操作メニュをクリックします。
③データベース名の変更を実行する(例:_wp1)
■新しいDB名を入力して「実行」ボタンを挿入します。
これでDB名が変更されました。
④左上にある「サーバ」選択して型、インポートタブを開いてください。
⑤インポートするSQLファイル「out_wp1.sql」を指定し、インポートを実行します。
インポートでエラーになった時は下記ドキュメントを見て下さい。
phpMyAdminでSQLファイルをインポートする時のエラーと対策
メモ
「mysqldump」でダンプしたSQLファイルのの先頭に下記コマンドが入っています。
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db名` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `db名`;
上記は
①指定したDBが無い場合は、新しくDBを作ります。
②またこれから実行するSQLは「db名」に書き込みます。
を意味します。
よって、DBを選択しなくて新規にDBが作られて過去のDBが復元されます。
以上でWordPressを過去の時点に戻す事ができました。
後は、障害を起こした「_wp1」フォルダとその時のDBがありますで、ジックリ原因を解析する事ができます。
但し、_wp1でWordpressを起動させる場合は「wp-config.php」と「.htaccess」を変更する必要があります。