我将 Laravel 与 Homestead 和 MySQL 一起使用。我有一个数据库转储文件,我想根据命令恢复它。当我从命令行运行它时,我没有收到任何错误:
mysql -h localhost -u homestead -psecret homestead < /home/vagrant/Data/local-db-reset.sql
我的 local-db-reset.sql 文件显示:
DROP DATABASE IF EXISTS homestead;
CREATE DATABASE homestead;
USE homestead;
SOURCE /home/vagrant/Data/local-db-snapshot.sql;
但是,当我从自定义 artisan 命令中在 PHP 中运行相同的命令时,我从 MySQL 收到语法错误 1064:
$db = 'homestead';
$snapshot = '/home/vagrant/Data/local-db-snapshot.sql;';
DB::transaction(function() use ($db, $snapshot) {
DB::statement('DROP DATABASE IF EXISTS ' . $db . ';');
DB::statement('CREATE DATABASE ' . $db . ';');
DB::statement('USE ' . $db . ';');
DB::statement('SOURCE ' . $snapshot . ' ;');
});
准确的错误是:
Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SOURCE /home/vagrant/Data/local-db-snapshot.sql' at line 1 (SQL: /home/vagrant/Data/local-db-snapshot.sql ;)
1064 错误由
SOURCE
命令触发,即使它的计算结果与上面的 sql 脚本中的命令完全相同。为什么?我该如何解决这个问题?我需要能够从工匠命令或至少从某个地方的 php 执行此操作。
请注意,我不是在
artisan migrate:fresh
是一个选项的情况下,所以请忘记这种方法。我真的需要恢复这个确切的快照。
我的一个同事指出
SOURCE
不是SQL命令,它只是mysql命令行客户端的元命令。所以我(基本上)重构了我的代码,以使用 shell_exec()
和最上面的原始 mysql
命令行命令,现在一切正常。
这可能是因为您的网络服务器使用的用户与您在控制台中使用的用户不同。
我自己不使用 Homestead,但根据我的设置,Apache 在用户 www-data 下运行。
您可以通过temporarily更改.sql文件的权限来检查:
chmod 777 /home/vagrant/Data/local-db-snapshot.sql
如果这解决了问题,您需要计算出您的网络服务器正在使用的用户。你应该能够通过运行
sudo ps aux | grep nginx
. 来做到这一点
这应该输出类似这样的内容(注意:我用 nginx 代替了 apache 以适合我的设置):
joundill@machine:~$ sudo ps aux | grep apache
root 1099 0.0 1.0 243836 40600 ? Ss 00:46 0:00 /usr/sbin/apache2 -k start
www-data 3395 0.0 2.4 253292 96744 ? S 01:36 0:01 /usr/sbin/apache2 -k start
joundill 4850 0.0 0.0 6436 672 pts/0 S+ 02:11 0:00 grep --color=auto apache
joundill@machine:~$
如您所见,用户 www-data 正在运行 apache(在您的情况下为 nginx)。您需要授予此用户访问您的 .sql 文件的权限。