2014.
05.
06
01:06:41
結論から書けば「system()」関数を使って
とか実行してあげればOKです。
オプションは適当に付けてください。
それでは詳細を書いていきます。
元々phpMyAdminのエクスポート機能を使ってバックアップを取っていたのですが、
いちいち「phpMyAdmin」を起動するの面倒くさいなーと思っちゃったのが今回のきっかけです。
横着、バンザイ\(--)/
ほんで、あれやこれやと書いて、出来上がったのがこちらφ(--)
実際にはもう少しいろいろやっていますが、主処理はこんな感じです。
「-p【パスワード】」は「-p」と「【パスワード】」の間にスペースを入れないのでご注意ください。
スペースを空けちゃうと、パスワードではなくDB名と認識されちゃいます。
さぁ、これでバッチリ!……と思ったら、こんなエラーが出ちゃいましたφ(--;
「テーブルをロックしようとしたら拒否られたぜぇ!」と書いてありますね。
テーブルロックの権限を持っていないユーザさんだったようです。
調べてみたところ、MySQL 5.1以降のmysqldumpさんは、
オプション「--opt」がデフォルトで有効化されているのだろうな。
「--opt」の内容は以下のオプションを全部指定したのと同じですってさ。
ふむふむ、なるほど(--)
今回のエラーは「--lock-tables」オプション(全てのテーブルをロックする)が影響してるのですな。
ユーザに権限を付与しても良いのですが、諸々の事情によりテーブルロックを止めることにしました。
それぞれのオプションの先頭に「--skip」を付けると「--opt」オプションの一部を無効化できるらしいので
「--skip」と「--lock-tables」を合体させた「--skip-lock-tables」を指定するとしますかね。
これで「--lock-tables」オプションが無効になるはずです。
ついでに「DROP TABLE」が嫌い(うっかり実行してテーブルが消えちゃうのは嫌)なので、
「--skip-add-drop-table」も付けることにしました。
そして最終的にはこんなんなりましたよっとφ(--)
これでバッチリ動きました。
注意点としては
1.mysqldumpは絶対パスで指定
場所が分からない人は、SSHでログインして「which mysqldump」で確認してください
2.「-p」はスペースを空けずにパスワードを記述
3.環境によってはホストを指定しないと駄目
localhost以外のとき。「--host=【ホスト名】」もしくは「-h 【ホスト名】」で指定
4.ファイルを出力する場所に注意
ちゃんと書き込み権限があるディレクトリを指定してくださいね
くらいでしょうか。
出力したファイルをサーバに置きっぱなしってのも怖いので、私は
1.DBダンプ
2.ダンプしたファイルをダウンロード
3.ダンプしたファイルを消す
までの流れをまとめて実行するように組んでいます。
ってなところで、完了\(--)/
/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";
}
?>
//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:ダンプする前に全てのテーブルをロックする
※データの整合性を保つとかそんなん?
※大きなテーブルのダンプに便利らしい
--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";
}
?>
//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.ダンプしたファイルを消す
までの流れをまとめて実行するように組んでいます。
ってなところで、完了\(--)/