我的系统: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 行,现在该文件包含一些文本但不包含数据库转储。这是一个错误,我不知道如何处理:( 这是错误
mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: NO) when trying to connect So this is what the output file (dbw.sql) now contains. Once again, it works fine when I run the dump from terminal.
最佳答案
您在命令行上以不同的用户身份运行该转储命令。使用 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
希望你能改编这个伪代码。祝你好运!
关于php exec 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10117350/