mysqldump通过PHP

时间:2012-07-26 23:02:11

标签: php mysqldump

我有一个PHP脚本,它传递了远程服务器的MySQL连接细节,我希望它执行mysqldump命令。为此,我使用php exec()函数:

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

当正确的登录详细信息传递给它时,它将完全正常工作。 但是,我无法检查,如果按预期执行,如果它没有找到原因。 $output数组返回为空,而如果我直接在命令行上运行命令,则会打印一条消息,告诉我登录失败。我想捕获这些错误消息并显示它们。关于如何做到的任何想法?

6 个答案:

答案 0 :(得分:15)

您应该检查 exec 功能的第三个参数:&$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 */ }

答案 1 :(得分:4)

因为此行重定向标准输出> /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);
?> 

答案 2 :(得分:4)

我找到的解决方案是在子shell中运行命令,然后将stderr输出到stdout2>&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] =&gt; string(46)“mysqldump:找不到表:”table_name“”}

希望它有所帮助!

答案 3 :(得分:3)

我一直在寻找完全相同的解决方案,我记得几年前我已经解决了这个问题,但却忘了它。

由于此页面在Google中的问题很高,所以我就是这样做的:

<?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";
}
?>

我总是忘记了mysqldump的 --log-error = [/ path / to / error / log / file] 部分!

答案 4 :(得分:1)

由于exec()只提取重定向到文件的stdout,我们在文件中有部分或缺少结果,我们不知道原因。我们必须从stderr收到消息,exec()不能这样做。有几种解决方案,所有这些都已经找到,所以这只是一个总结。

  1. Solution from Jon:记录来自mysqldump的错误并单独处理(不能应用于每个命令)。
  2. 将输出重定向到单独的文件,即mysqldump ... 2> error.log 1> dump.sql,并像以前的解决方案一样单独读取错误日志。
  3. Solution from JazZ:将转储写为子shell并将子shell的stderr重定向到stdout,这可以将php exec()放入$output变量。
  4. Solution from Pascal:最好使用proc_open()代替exec(),因为我们可以分别(直接来自管道)获取stdoutstderr

答案 5 :(得分:0)

编写以下代码以在.sql文件中导出数据库。

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