【问题标题】:Using PHP script: why mysqldump does not dump sql file?使用 PHP 脚本:为什么 mysqldump 不转储 sql 文件?
【发布时间】:2014-11-05 04:44:59
【问题描述】:

嘿,我是 PHP 新手,正在尝试通过 php 脚本使用 mysqldump。
我已经尝试使用命令,转储过程成功。
情况是,当我尝试使用本地计算机转储时,转储成功。
但是当代码传输到服务器时,mysqldump没有工作。我已经尝试了几乎与 mysqldump 主题相关的解决方案,但仍然无法正常工作。我希望有人可以指导我。周全

<?php

/*-----------------------------------------------
MYSQLDUMP FOR SERVER
------------------------------------------*/


$dbhost = "*****";
$dbuser = "*****";
$dbpass = "*****";
$dbname = "*****";

//set date today
$today=date("d-m-Y");

//set file name
$filename = "leave_".$today.".sql";

//MYSQLDUMP 

//For Server 
$command = sprintf("/usr/bin/mysqldump --opt -h%s -u%s -p%s %s     >/var/www/html/leave/leave/backup/%s",

//for local
//$command = sprintf("c:\AppServ\MySQL\bin\mysqldump --opt -h%s -u%s -p%s %s > %s",

$dbhost,
$dbuser,
$dbpass,
$dbname,
$filename
);
system($command);



/*-------------------------------------------------------------
TO SAVE FILE SQL INTO LOCAL
---------------------------------------------------------------*/

$file = "leave_".$today.".sql";
if(!$file)
{
   // File doesn't exist, output error
      die('File not found');
}
else
{
// Set headers to ask user where to save file.
header('Pragma: anytextexeptno-cache', true);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: text/plain");
header("Content-Disposition: attachment; filename=$file");

 // Read the file from disk
 readfile($file);


 }



 ?>

【问题讨论】:

  • 你有任何错误或任何东西吗?你为什么要做一个mysqldump?,你知道这样做你需要很多权限才能在服务器上打开?
  • 检查系统命令是否可以从php执行的权限。很多时候,由于权限问题,system 和 exec 命令在 php 文件中不起作用。
  • @Saikios 没有错误,只是根本没有转储文件。我已经尝试回显 $command,仍然没有错误。对于你的第二个问题,我从我的主管那里得到了使用 php 脚本备份数据库的任务。所以我尝试了mysqldump和查询,唯一成功的是mysqldump,两者都是在本地运行时。脚本传输到服务器时出现问题,当然我也已经更改了用户名和密码。
  • @WisdmLabs 我也尝试使用 shell_exec() 和 exec() 命令,但问题仍然存在。
  • 您想要做的不是通过 php 脚本进行备份,而是通过 bash 脚本进行备份,但是您使用 php 对其进行了屏蔽,无论如何检查一下;)stackoverflow.com/questions/3751069/…

标签: php mysqldump


【解决方案1】:

好的,实际上我在发布问题几天后已经解决了这个问题。不幸的是,我没有足够的声誉来发布答案。所以我们开始吧。

这里有几点需要注意:-

  1. MySQL 转储必须使用绝对路径。
  2. 尝试使用 --opt(MySQL 转储的默认选项)。阅读更多here
  3. 对于选项,如果使用短格式,则不需要(--)。例如:--p。使用完整格式时使用 (--)。例如:--密码。所以使用 '-p' 而不是 '--p' (也适用于其他选项)。
  4. 如果 mysqldump 在 'exec' 上不起作用,请尝试 'shell_exec' 或 'system'。
  5. 尽量避免选项和变量之间有空格。例如:-p$dbpass

*另外请注意,它涉及是否可以从php执行系统命令的权限。

【讨论】:

  • 添加 mysqldump 命令的完整路径是对我有用的更改,因为我尝试 systemd-automate 数据库备份。
【解决方案2】:

我假设您的 php 允许通过 system() 执行命令。

你没有在安全模式下运行,或者,如果你是,safe_mode_exec_dir 包含你需要的所有命令

【讨论】:

  • 我不知道为什么这个“安全模式”会影响代码,但有些文章指出“开启”安全模式会影响 mysqldump。所以,我检查了一下,它已经处于“关闭”模式......你能详细说明你上面提到的内容吗?
  • 如果安全模式关闭,您可以忽略我的回复。我会进一步尝试检查是否可以提供帮助。
猜你喜欢
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2013-08-25
相关资源
最近更新 更多