こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPでMySQLのテーブルをダンプする

宜しくお願いします。
※PHP5、 MySQL5、 Win7、 ローカル環境

本番環境(公開レンサバ)上では、cronを使って、自動的にバックアップを取ろうとしています。

1つのデーターベースのなかに、
10個のテーブルがあります。
テーブル別にダンプしたく思います。

そこで下記のPHPスクリプトを考えています。
しかし、ダンプ処理は行われているが(ファイルは出力されているという意味。成功していない)、
テーブル別に処理が進んでいるようではなく、
しかも、
INSERT文や、そもそもテーブルに格納されている値がSQLで書き出されていません。
まったく空白ということではないのですが・・・。※出力されたテキストは書き参照


※テーブル名($db[$i]に格納されている)ごとにループ処理していますが、そこは省略して書きます。

$fileName = $db[$i]."-".$now.".sql";
$cmd = "D:/xampp/mysql/bin/mysqldump ".$dbName.".".$db[$i]." --host=".$dbHost." --user=".$dbUser." --password=".$dbPass." > ".$BackPath.$fileName;

if (system($cmd)) ErrorOut("次のコマンド実行でエラーになりました。$cmd");


--------------出力されたテキスト-------------------------


-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)
--
-- Host: localhost Database: ここは「データーベース名.テーブル名」が記載されています。
-- ------------------------------------------------------
-- Server version5.1.41

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;



----------------------------------------------

今自分のなかで思いつく原因は、

$cmd = "D:/xampp/mysql/bin/mysqldump ".$dbName.".".$db[$i]." --host=".$dbHost." --user=".$dbUser." --password=".$dbPass." > ".$BackPath.$fileName;

の中の、
".$dbName.".".$db[$i]." という記述で、 

ここは、データーベース名とテーブル名を取得したく、このように書きましたが、
正直 適当です。調べまくりましたが見つからず・・・・。

どなたか、PHPで、mysqldumpを使い、テーブル別にダンプさせる書き方を教えてください。
宜しくお願いします。

投稿日時 - 2011-10-14 08:08:05

QNo.7070447

すぐに回答ほしいです

質問者が選んだベストアンサー

http://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html
によるとデータベースとテーブルの間は空白ですね。

そうすると気になるのは、phpスクリプトにするまえに、
直接手入力でコマンドラインでバックアップしてみて成功して
いるかどうかです。

それに成功しているなら次に、$cmdを文字列として取り出して
それをコマンドラインで入力してみるとどうなるか。
次にそのコマンドをそのままスクリプトファイルに書いて
そのシンプルなスクリプトが成功するかどうか。

急がば回れといいます。段階を踏んで、ワンステップづつ進んだほうが
いいと思います。

投稿日時 - 2011-10-16 09:12:15

補足

アドバイス有難うございます。
ローカルでは上手くいきました。

ただ、
レンタルサーバー上ではまだ上手くいっておらず、試行錯誤中です。

Function mysql_list_tables() is deprecated in /home/ ・・・・

というエラーがでており、
これはおそらく PHP ないで 

mysql_list_tables()

を使用しているのですが、それを指摘されているのだと思います。
これはどうやら非推奨らしく それで警告がでてるのかと・・・。

あと、
・・・・ No such file or directory 
とでてるので、これもコツコツしらべるとクリアーできそうですが、なぜかローカル環境とオンライン環境のディレクトリ構造を同じしているものの こういったエラーがでるのか・・・。
とにかく このあと色々いじります。

投稿日時 - 2011-10-22 19:17:08

お礼

有難うございました。

投稿日時 - 2011-10-28 22:02:35

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

レンタルサーバーで、
cronではなく、
コマンドラインで実行したらどうなるか、それを試したらどうでしょう。
そもそもそれがうまくいかないうちに、cronでどうこうしても話が先に進みません。

コマンドラインで1行だけ動かしてうまくいくかどうかで、実行ユーザーや
実行ディレクトリ、DBの調査など順に調べることがいろいろ出てくるでしょう。

そういうわけで、いきなりcronで一足飛びに全て解決という戦略ではなく、
cronはまず置いといて、低いところから1段ずつステップアップ、という戦略
で臨んだほうが良いでしょう。

投稿日時 - 2011-10-23 11:40:57

お礼

回答ありがとうございます。
cronで実行するまえに、コマンドラインで実行してみて処理は正常に終えております。

というわけで、試行錯誤した結果、
cronが作動してのダンプは、まだ成功しておりませんが、
一応目的の処理が成功する道筋が見えました。

残るエラーは、
Warning: opendir(/../../libs/***/backup/): failed to open dir: No such file or directory in /home/*****

というものですので、
なんとか自力解決できそうです。

有難うございました。

投稿日時 - 2011-10-28 21:59:56

ANo.4

試してみたところ、データベース名またはテーブル名が間違っていると、質問者さまの状態になるようですよ。今一度確認してみてください。
いづれにしても、他回答者さまの通り、一旦echoしてみるとか、DOSから打ってみるとかで追跡した方が早いような・・・。

投稿日時 - 2011-10-20 21:59:02

お礼

アドバイスありがとうございます。
はい! コマンドラインで入力して無事にバックアップをとることができました。
PHPになおしてもうまくいっています。
ただ、ローカルの場合です。

今はレンタルサーバーのcron で動かしているのですが、
ここだど うまくいかず・・・。

エラーかえってきて成功しない状態です。

投稿日時 - 2011-10-22 19:06:27

http://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html

shell> mysqldump [options] db_name [tables]

となっているので この形式の順番にあわせたらどうなります?

投稿日時 - 2011-10-14 12:49:44

補足

順番を変更しても出力されるのは、変らずSQL抜きのテキストだけです。

※ちなみに
"D:/xampp/mysql/bin/mysqldump ".
" --host=".$dbHost.
" --user=".$dbUser.
" --password=".$dbPass.
" ".
$dbName.
" ".
$db[$i].
" > ".
$BackPath.$fileName;

となります。

投稿日時 - 2011-10-15 05:44:53

ANo.1

>$cmd = "D:/xampp/mysql/bin/mysqldump ".$dbName.".".$db[$i]." --host=".$dbHost." --user=".$dbUser." --password=".$dbPass." > ".$BackPath.$fileName;

$dbNameと$db[$i]をピリオドで繋いでますか?空白だけでいいと思います。

投稿日時 - 2011-10-14 09:26:35

補足

ピリオドでつないでいます。

ただ、最初は空白だけでつないでいました。
それを何回もテストしてたと思います。
でも、もう一度 試してみますね。
※徹夜で寝ぼけながらの作業だったので・・・・。

投稿日時 - 2011-10-14 09:37:48

お礼

空白に置き換えてもダメでした。
んーーどうなってるんだろうか・・・。

投稿日時 - 2011-10-15 05:39:00

あなたにオススメの質問