プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、mysqldumpを使ってMySQLのデータベースをダンプする
結論から書けば「system()」関数を使って

/usr/bin/mysqldump -u 【ユーザ名】 -p【パスワード】 【DB名】 > 【出力ファイル】

とか実行してあげればOKです。
オプションは適当に付けてください。

それでは詳細を書いていきます。

元々phpMyAdminのエクスポート機能を使ってバックアップを取っていたのですが、
いちいち「phpMyAdmin」を起動するの面倒くさいなーと思っちゃったのが今回のきっかけです。

横着、バンザイ\(--)/

ほんで、あれやこれやと書いて、出来上がったのがこちらφ(--)

<?php
    //DB情報
    $id = "ユーザID";
    $pwd = "パスワード";
    $db = "データベース名";

    //出力ファイル名
    $fileName = dirname(__FILE__) . '/db_dump.sql';

    //コマンド生成
    //「/usr/bin/mysqldump -u $id -p$pwd $db > $fileName 」
    $cmd = '/usr/bin/mysqldump';
    $cmd = $cmd . ' -u ' . $id;
    $cmd = $cmd . ' -p' . $pwd;
    $cmd = $cmd . ' ' . $db;
    $cmd = $cmd . ' > ' . $fileName;

    //実行
    system($cmd);

    //気休めだけど実行結果チェック
    //ファイルが作成されていればOK
    if(file_exists($fileName) && filesize($fileName) > 0){
        print "OK";
    }else{
        print "NG";
    }
?>

実際にはもう少しいろいろやっていますが、主処理はこんな感じです。
「-p【パスワード】」は「-p」と「【パスワード】」の間にスペースを入れないのでご注意ください。
スペースを空けちゃうと、パスワードではなくDB名と認識されちゃいます。

さぁ、これでバッチリ!……と思ったら、こんなエラーが出ちゃいましたφ(--;

mysqldump: Got error: 1044: Access denied for user 'ユーザ名'@'localhost' to database 'データベース名' when using LOCK TABLES

「テーブルをロックしようとしたら拒否られたぜぇ!」と書いてありますね。
テーブルロックの権限を持っていないユーザさんだったようです。

調べてみたところ、MySQL 5.1以降のmysqldumpさんは、
オプション「--opt」がデフォルトで有効化されているのだろうな。
「--opt」の内容は以下のオプションを全部指定したのと同じですってさ。

--quick:「全結果セット取得→メモリ内でバッファ後表示」を一気にやらず、サーバから1行ずつ結果を取得する
 ※大きなテーブルのダンプに便利らしい

--add-drop-table:スクリプトに「DROP TABLE」を追加

--add-locks:スクリプトに「LOCK TABLES」「UNLOCK TABLES」を追加
 ※リストアするとき速くなる

--extended-insert:1つのinsert文にvaluesをたくさん書く
 ※ファイルサイズが小さくなり、リストアするとき速くなる

--lock-tables:ダンプする前に全てのテーブルをロックする
 ※データの整合性を保つとかそんなん?

ふむふむ、なるほど(--)

今回のエラーは「--lock-tables」オプション(全てのテーブルをロックする)が影響してるのですな。
ユーザに権限を付与しても良いのですが、諸々の事情によりテーブルロックを止めることにしました。

それぞれのオプションの先頭に「--skip」を付けると「--opt」オプションの一部を無効化できるらしいので
「--skip」と「--lock-tables」を合体させた「--skip-lock-tables」を指定するとしますかね。
これで「--lock-tables」オプションが無効になるはずです。

ついでに「DROP TABLE」が嫌い(うっかり実行してテーブルが消えちゃうのは嫌)なので、
「--skip-add-drop-table」も付けることにしました。

そして最終的にはこんなんなりましたよっとφ(--)

<?php
    //DB情報
    $id = "ユーザID";
    $pwd = "パスワード";
    $db = "データベース名";

    //出力ファイル名
    $fileName = dirname(__FILE__) . '/db_dump.sql';

    //コマンド生成
    //「/usr/bin/mysqldump --skip-lock-tables --skip-add-drop-table -u $id -p$pwd $db > $fileName」
    $cmd = '/usr/bin/mysqldump';
    $cmd .= ' --skip-lock-tables';    //ロックしない
    $cmd .= ' --skip-add-drop-table';    //drop table 付けない

    $cmd = $cmd . ' -u ' . $id;
    $cmd = $cmd . ' -p' . $pwd;
    $cmd = $cmd . ' ' . $db;
    $cmd = $cmd . ' > ' . $fileName;

    //実行
    system($cmd);

    //気休めだけど実行結果チェック
    //ファイルが作成されていればOK
    if(file_exists($fileName) && filesize($fileName) > 0){
        print "OK";
    }else{
        print "NG";
    }
?>

これでバッチリ動きました。

注意点としては

1.mysqldumpは絶対パスで指定
 場所が分からない人は、SSHでログインして「which mysqldump」で確認してください

2.「-p」はスペースを空けずにパスワードを記述

3.環境によってはホストを指定しないと駄目
 localhost以外のとき。「--host=【ホスト名】」もしくは「-h 【ホスト名】」で指定

4.ファイルを出力する場所に注意
 ちゃんと書き込み権限があるディレクトリを指定してくださいね

くらいでしょうか。

出力したファイルをサーバに置きっぱなしってのも怖いので、私は

1.DBダンプ
2.ダンプしたファイルをダウンロード
3.ダンプしたファイルを消す

までの流れをまとめて実行するように組んでいます。

ってなところで、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事