1

我的系统:Ubuntu 11.10,LAMP Stack。

问题:

我在终端中运行以下命令,它会正确备份。

mysqldump -u root  dbBugTracker > BAK/dbw.sql

但是我将它包含在我的 php 代码中,如下所示,它不起作用。

exec('/usr/bin/mysqldump -u root  dbTracker > BAK/dbT.sql');

尖端:

  • 我尝试在 exec 中添加第二个参数,但除了单词 Array 之外什么都没有显示。我把它打印出来,但里面什么都没有。
  • 文件 dbw.sql 实际上是由 exec 函数创建的,但它是 0 字节。
  • 我尝试使用完整路径而没有使用 mysql,并且看到了相同的结果。即0字节。
  • 文件夹BAK在我的项目文件夹中,我什至给了它 777 权限。
  • 甚至尝试了不同的文件名和数据库,但结果是一样的。

我很感激对此的任何投入。谢谢!

更多信息:我将2>&1添加到 exec 行,现在该文件包含一些文本,但不包含 DB 转储。这是一个错误,我不知道如何处理:(这是错误

mysqldump:得到错误:1045:尝试连接时用户'root'@'localhost'的访问被拒绝(使用密码:NO)所以这就是输出文件(dbw.sql)现在包含的内容。再一次,当我从终端运行转储时它工作正常。

4

3 回答 3

3

您在命令行上以其他用户身份运行该转储命令。使用 exec() 时,您将其作为 Apache(我假设)运行。尝试向 exec 命令添加密码参数,或者在您的数据库中创建一个具有适当权限的特定于 php 的用户。

更新:: 正如我所猜测的,在使用 PHP 执行此转储时,您无法使用 root 用户。所以,创建一个新用户。

首先,从命令行登录到您的数据库。如果您是 root 用户,请不要使用 -u root:

mysql

现在您已登录,继续创建一个新用户供 Apache 使用:

GRANT ALL ON database_name.* TO yourapacheuser@localhost IDENTIFIED BY 'yourpassword';

继续并注销mysql:

exit

接下来,让我们重新编写您的原始代码......

$db_user = 'newusername';
$db_pass = 'pass';

$command = "mysqldump --add-drop-table -u $db_user -p$db_pass database_name > backup.file.sql";
$output = `$command`;
echo "Your database has now been backed up.";

现在,要执行该文件,请从命令行运行它:

php path/to/sqldumpfile.php

希望你能适应这个伪代码。祝你好运!

于 2012-04-12T04:32:52.083 回答
0

你如何打印它?像这样调试它:

<?php

exec('/usr/bin/mysqldump -u root  dbTracker > BAK/dbT.sql', $output);

var_dump($output);
于 2012-04-12T04:33:49.457 回答
0

首先,您应该让它在命令行上运行。在使用 PHP 的 exec() 之前验证这是否产生了所需的结果:

/usr/bin/mysqldump -u root -p YOUR_PASSWORD dbTracker > BAK/dbT.sql

如果它确实有效,那么这是您的 PHP 配置中某处的问题。

首先要检查的是安全模式。你在使用安全模式吗?你运行的是什么版本的PHP?

另一种可能是您的 PHP 用户没有使用 mysqldump 二进制文件的权限。

于 2012-04-12T04:36:18.477 回答