Own products

  • 新規事業のアイディア創造機

Tutorial

XserverでPHP+mysqldumpコマンドを使ってデータベースのバックアップを取る方法

この記事の読了時間:約69

  • このエントリーをはてなブックマークに追加

タイトルそのまんま、レンタルサーバ「Xserver」でmysqldumpコマンド使ってデータベースバックアップを取ろうぜ!ってゆーお話。

XserverはSSHとかtelnetとか使えないので、いざデータベースバックアップを取りたいって場合、基本的には管理画面に付属のphpMyAdminでエクスポートっちゅーのが王道、というか他の選択肢はお膳立てされてないのです。

でも例えば自作のサービスなんかを運用してる場合、毎日phpmyAdmin開いて手動でバックアップ取るってゆーのも面倒。

そーなるとPHPのsystem関数とmysqldumpコマンドの出番ですが、どこ探してもピンポイントの情報が無く苦戦しちゃったので、ここでシェアします。

どなたかの参考になれば幸いです。

XserverでPHP+mysqldump使ってDBをバックアップする方法

ポイントと注意点

前述の通りXserverではSSHやtelnetが使えないので、mysqldumpコマンドを使いたい場合はPHPのsystem関数を使う事になります。

今回ご紹介するプログラムでは外部入力を一切含まないので使ってませんが、もし何らかの外部入力値をプログラム内に含む場合には、適宜escapeshellarg関数やescapeshellcmd関数などを使い、セキュリティ対策を確実に施してくださいねー!

あと、この手のプログラム紹介の際の定型分になっちゃいますが、今回の掲載プログラムを使ったコトによる不具合や障害等の責任は負えませんので、ご利用は自己責任のもと、よろしくお願いしますです。

試行錯誤の経緯

まず、フツーに下記を記述したphpファイルをサーバにアップしてアクセス(=実行)してみました。

<?php
$dbUser = 'データベースのユーザー名';
$dbPass = 'データベースのパスワード';
$dbName = 'データベースの名前';

$fileName = date('ymd').'_'.date('His').'.txt';
$command = "mysqldump ".$dbName." -u ".$dbUser." -p".$dbPass." > ".$fileName;
system($command);

。。。結果、ダメ。

どうダメだったかっつーと、ファイルは生成されんだけど、中身が空。0バイト。無。

「?」と思いつつ、そもそも「-u」の後ろには半角スペース入れるのに「-p」の後ろには空白入れちゃいけないって書き方が気持ち悪かったので、一応の確認も含めて下記に書き換えて再びアクセス。

<?php
$dbUser = 'データベースのユーザー名';
$dbPass = 'データベースのパスワード';
$dbName = 'データベースの名前';

$fileName = date('ymd').'_'.date('His').'.txt';
$command = "mysqldump ".$dbName." --user=".$dbUser." --password=".$dbPass." > ".$fileName;
system($command);

記述は美しくなったものの、やはりダメ。空ファイル。無。

そもそもデータベースやSQLに詳しくないので、色々原因を探すべくgoogle先生に聞きまくってみた結果、愛しのウェブルさんの記事「mysqldump でバックアップが取れない件から MySQL の場所とかを物凄い追求してみた | ウェブル」を発見。

症状も似ていた(空ファイルは生成される)ので、「もしかしたらコレもmysqmldumpへの絶対パスが必要なんじゃないか?」と思い立つ。

んでXserverのmysqldump絶対パスをググるも一向に見つからず、困った時のサポート頼みでXserverに絶対パスの問い合わせ。

返答を待つ間、ちょこちょこ細かいオプションを足したり消したりするも、やはり結果は変わらぬまま。

作業開始から数時間後、そろそろ寝ようかと思った矢先、ふと脳裏をよぎる!

「、、、ホスト名!!!」

Xserverはホスト名がlocalhostじゃないので、それこそ当ブログのバックエンド「WordPress」を導入する際にもソレでつまずいた。

もしかして。

今回も。

そこで下記のように修正してみる。

<?php
$dbHost = 'データベースのホスト名';
$dbUser = 'データベースのユーザー名';
$dbPass = 'データベースのパスワード';
$dbName = 'データベースの名前';

$fileName = date('ymd').'_'.date('His').'.txt';
$command = "mysqldump ".$dbName." --host=".$dbHost." --user=".$dbUser." --password=".$dbPass." > ".$fileName;
system($command);

キタ━━━━(゚∀゚)━━━━ !!!!!
山 は 動 い た !

生成された数万バイトのファイルをドヤ顔でダウンロードし、颯爽と中身を確認。

、、、文字化けとるやないかーい(棒読み)。

しかしコレは先程のgoogle先生質問攻め大会の時点でいくつも目にしてたので、慌てず騒がず優雅にプログラムに修正を追加。

結論

そんなこんなで、下記を実行してみる。

<?php
$dbHost = 'データベースのホスト名';
$dbUser = 'データベースのユーザー名';
$dbPass = 'データベースのパスワード';
$dbName = 'データベースの名前';

$fileName = date('ymd').'_'.date('His').'.txt';
$command = "mysqldump --default-character-set=binary ".$dbName." --host=".$dbHost." --user=".$dbUser." --password=".$dbPass." > ".$fileName;
system($command);

結局、絶対パスはなんら関係なく、上記でバッチリ動きましたとさ。

このプログラムをCronで時間指定して叩けば、晴れて自動バックアップでございます!

あー、ラクになるなー☆

  • このエントリーをはてなブックマークに追加

コメント一覧

3 Responses to [XserverでPHP+mysqldumpコマンドを使ってデータベースのバックアップを取る方法]

sct より:

2011/07/08 11:18 PM

失礼します。以前pearの件でも質問させていただいた者です。毎回貴重な情報に感謝しております。
上記バックアップのcron設定にお聞きしたいのですが、上記ファイルを配置するのはpublic_htmlより上階層に置いた方が良いのでしょうか?また、生成されたファイルはどの場所に生成されるのでしょうか?
cronといいますかコマンドに関して知識がないものでご教授いただければ幸いです。たいへんお手数ですが宜しくお願いします。

smkn より:

2011/07/09 11:37 PM

>sct 様
おっ!お久しぶりです!
バックアップ用のファイルは基本、仰るようにpublic_htmlより上階層に置いた方がいいかと思います。
特にこの掲載プログラムのままだと、アクセスのたびにバックアップを生成するので、万が一public_html以下に置いてF5攻撃とかされたら危険です。
生成されたファイルは現状のプログラムだと、このプログラムを記述したファイルと同階層に生成されますね。
生成場所を変更したい場合、7行目の$fileNameのトコに絶対パスから記述すれば、その通りの場所に指定した名前で生成されます。

sct より:

2011/07/11 12:59 AM

なるほど!
そういうことですね!ご丁寧にありがとうございます!
たいへん参考になりました。
これからも期待してます!

コメントを投稿する

お名前

ご連絡先メールアドレス※非公開

コメント

CAPTCHA


  • このブログのRSSを購読する
  • このブログをtwitterでつぶやく
  • このブログをFacebookで共有する
  • このブログをはてなブックマークで共有する

Contact

    お名前※必須

    ご連絡先メールアドレス

    お問い合わせ内容※必須

    CAPTCHA

    captcha

    Blog parts

    Affiliate