web-dev-qa-db-ja.com

PHP)経由のmysqldump

リモートサーバーのMySQL接続の詳細を渡すPHPスクリプトがあり、mysqldumpコマンドを実行する必要があります。これを行うには、phpexec()を使用します。関数:

<?php
exec("/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name > /path-to-export/file.sql", $output);
?>

適切なログインの詳細が渡されると、それは完全に正常に機能します。ただし、チェックに問題がありますif期待どおりに実行され、理由がわからない場合。 $output配列は空として返されますが、コマンドラインで直接コマンドを実行すると、ログインに失敗したことを示すメッセージが出力されます。そのようなエラーメッセージをキャプチャして表示したいと思います。それを行う方法についてのアイデアはありますか?

9
Ross McLellan

exec関数の3番目のパラメーターを確認する必要があります:&$return_var

$return_var = NULL;
$output = NULL;
$command = "/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name > /path-to-export/file.sql";
exec($command, $output, $return_var);

Unixの慣例により、何か問題が発生した場合、プロセスは0以外のものを返します

そして、あなたはできる:

if($return_var) { /* there was an error code: $return_var, see the $output */ }
15
Fabio Mora

この行はstdout出力をリダイレクトするため> /path-to-export/file.sql これを試して、

<?php 
exec("/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name", $output);
/* $output will have sql backup, then save file with these codes */
$h=fopen("/path-to-export/file.sql", "w+");
fputs($h, $output);
fclose($h);
?> 
4
Burak Tamtürk

私が見つけた解決策は、サブシェルでコマンドを実行してから、stderrstdout2>&1)。このように、$output変数には、エラーメッセージ(存在する場合)が入力されます。

つまり:

exec("(mysqldump -uroot -p123456 my_database table_name > /path/to/dump.sql) 2>&1", $output, $exit_status);

var_dump($exit_status); // (int) The exit status of the command (0 for success, > 0 for errors)
echo "<br />";
var_dump($output); // (array) If exit status != 0 this will handle the error message. 

結果 :

int(6)

array(1){[0] => string(46) "mysqldump:テーブルが見つかりませんでした:" table_name ""}

それが役に立てば幸い !

4
JazZ

私はまったく同じ解決策を探していました。数年前にすでにこれを解決したことを思い出しましたが、それを忘れていました。

このページは質問のためにグーグルで高いので、これが私がそれをした方法です:

<?php
define("BACKUP_PATH", "/full/path/to/backup/folder/with/trailing/slash/");

$server_name   = "your.server.here";
$username      = "your_username";
$password      = "your_password";
$database_name = "your_database_name";
$date_string   = date("Ymd");

$cmd = "mysqldump --hex-blob --routines --skip-lock-tables --log-error=mysqldump_error.log -h {$server_name} -u {$username} -p{$password} {$database_name} > " . BACKUP_PATH . "{$date_string}_{$database_name}.sql";

$arr_out = array();
unset($return);

exec($cmd, $arr_out, $return);

if($return !== 0) {
    echo "mysqldump for {$server_name} : {$database_name} failed with a return code of {$return}\n\n";
    echo "Error message was:\n";
    $file = escapeshellarg("mysqldump_error.log");
    $message = `tail -n 1 $file`;
    echo "- $message\n\n";
}
?>

私がいつも忘れているのは-log-error = [/ path/to/error/log/file] mysqldumpの一部です!

3
Jon T

exec()はファイルにリダイレクトされるstdoutだけをフェッチしているため、ファイルに部分的または欠落した結果があり、その理由はわかりません。 stderrからメッセージを取得する必要があり、exec()はそれを実行できません。いくつかの解決策がありますが、すべてがすでに見つかっているので、これは単なる要約です。

  1. Jonからの解決策mysqldumpからエラーをログに記録し、個別に処理します(すべてのコマンドに適用できるわけではありません)。
  2. 出力を個別のファイル、つまり_mysqldump ... 2> error.log 1> dump.sql_にリダイレクトし、前のソリューションと同様にエラーログを個別に読み取ります。
  3. JazZからの解決策 :ダンプをサブシェルとして書き込み、サブシェルのstderrをstdoutにリダイレクトします。これにより、php exec()を_$output_変数に入れることができます。
  4. Pascalからの解決策stdoutstderrを別々に(直接)取得できるため、proc_open()の代わりにexec()を使用することをお勧めしますパイプから)。
1
dmnc

以下のコードを記述して、データベースを.sqlファイルにエクスポートします。

<?php exec('mysqldump --user=name_user --password=password_enter --Host=localhost database_name > filenameofsql.sql'); ?>
0
Avinash Raut