我的系统:Ubuntu 11.10,LAMP Stack。
问题:
我在终端中运行以下命令并正确备份。
mysqldump -u root dbBugTracker > BAK/dbw.sql
但是我将它包含在我的PHP代码中,如下所示,它不起作用。
exec('/usr/bin/mysqldump -u root dbTracker > BAK/dbT.sql');
提示:
我很感激对此的任何意见。谢谢!
更多信息: 我将 2>& 1 添加到exec行,现在该文件包含一些文本但不包含数据库转储。这是一个错误,我不知道如何处理这个:( 这是错误
mysqldump:收到错误:1045:尝试连接时,用户“root”@“localhost”(使用密码:NO)拒绝访问 所以这就是输出文件(dbw.sql)现在包含的内容。 再一次,当我从终端运行转储时,它工作正常。
答案 0 :(得分:3)
您在命令行上以不同的用户身份运行该dump命令。使用exec()时,您正在以Apache(我假设)运行它。尝试在exec命令中添加password参数,或者在db中使用适当的权限创建特定于php的用户。
UPDATE ::正如我猜测的那样,在使用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
希望你能适应这个伪代码。祝你好运!
答案 1 :(得分:0)
你如何打印? 像这样调试:
<?php
exec('/usr/bin/mysqldump -u root dbTracker > BAK/dbT.sql', $output);
var_dump($output);
答案 2 :(得分:0)
首先,您应该在命令行上运行它。在使用PHP的exec()之前验证这是否产生了所需的结果:
/usr/bin/mysqldump -u root -p YOUR_PASSWORD dbTracker > BAK/dbT.sql
如果它可以工作,那么在PHP配置的某个地方就会出现问题。
要检查的第一件事是safe_mode。你在使用safe_mode吗?你在运行什么版本的PHP?
另一种可能是您的PHP用户无权使用mysqldump二进制文件。