我正在尝试使用mysqldump
与exec()
函数创建我的数据库的定期备份(穷人的cron)。我在macOS上使用XAMPP/PHP7。
$command = "$mysqldump_location -u$db_user -h$db_host -p$db_password $db_name > $backup_file_location";
exec($command);
当我运行PHP脚本时,我没有在$backup_file_location
中提到的路径中获得SQL转储,但如果我直接在终端上执行相同的$command
字符串,我将在所需的位置获得所需的SQL文件。
我无法理解这里的问题是什么。如果有更好的方法来转储整个数据库,也可以接受建议。
编辑1:
$mysqldump_location
的值为/Applications/XAMPP/xamppfiles/bin/mysqldump
$backup_file_location
的值为/Applications/XAMPP/xamppfiles/htdocs/app5/data/sqldumps/sql_data.sql
/app5/
是文件夹,而我正在开发我的应用程序。
编辑2:可能的重复建议不适用,因为这里的问题不是关于如何转储SQL备份。这里的关键问题是,使用mysqldump的备份是通过终端进行的,而不是通过PHP的exec()函数。
这个问题的解决方案,从上面的评论来看,是PHP请求在XAMPP中作为具有有限特权的用户执行,并且mysqldump进程继承这些特权。
检查exec()
运行的进程的退出状态,确认mysqldump以非零退出状态退出,表明由于某种原因失败。
在mysqldump进程试图写的目录上打开777的写权限解决了这个错误。
也应该足以找出具体的uid &(检查Apache配置文件中的User
和Group
配置值(例如xampp-home/Apache/conf/httpd.conf),并使输出目录可由该uid或gid写。