Laravel:MariaDB - 工匠迁移:刷新挂起

时间:2017-10-01 12:36:42

标签: laravel-5 mariadb artisan

我正在使用Debian 9和MariaDB 10.1.27,Composer 1.4.2和Laravel 5.5.13。

我使用CREATE DATABASE 'laravel'创建了一个空数据库,在Laravel的.env配置文件中配置它,现在我有时会出现问题,数据库操作挂起(没有任何反应)或在浏览器中我获取超时超时消息。仍然可以使用mysql -u laravel -p laravel连接到数据库 - 例如SELECT

php artisan migrate

...有时像migrate:refresh一样工作,有时不工作。如果它不起作用,我总是必须重新启动MariaDB服务,通常,它会在第一次再次运行。

例如,

migrate:refresh清除数据库并导入/加载大部分时间10次迁移,然后,它只是什么都不做。我已经等了大约1个小时完成这个任务,但它只是说,迁移表丢失了,并且没有添加任何内容。 Artisan甚至没有说,它已经导入/装载了9张其他桌子......

对于发送电子邮件,我正在使用主管,但在运行migrate:refreshh时不应该使用主管;

增加执行超时对任何事都没有帮助。所以有什么问题?在Homestead,它只是完美无缺。是否需要MariaDB中的任何特定设置?或者我是否需要使用默认字符集等特定参数创建数据库?

顺便说一句:如果应用程序正在运行,我有时也会在浏览网站时收到执行超时错误消息。

1 个答案:

答案 0 :(得分:4)

当使用Supervisor控制工匠队列时,应该绝对停止守护

sudo supervisorctl stop <YOUR_QUEUES>

执行

artisan migrate:refresh

它通常会导致一种竞争条件,而工匠正试图锁定表jobs以将其从数据库中删除,而Artisan队列正试图锁定表{{1}执行任务。

一般查询日志(为此,我使用MariaDB 10.1.27)显示如下内容:

jobs

当artisan:refresh命令挂起,并且94 Prepare drop table if exists `jobs` 63 Query START TRANSACTION 67 Query SAVEPOINT trans2 67 Prepare select * from `jobs` where `queue` = ? and ((`reserved_at` is null and `available_at` <= ?) or (`reserved_at` <= ?)) order by `id` asc limit 1 for update 67 Execute select * from `jobs` where `queue` = 'user' and ((`reserved_at` is null and `available_at` <= 1511429487) or (`reserved_at` <= 1511429397)) order by `id` asc limit 1 for update 67 Close stmt 由Supervisor驱动的作业工作者排队时,MariaDB服务器报告两个连接(来自相关的Laravel数据库用户)等待用于元数据锁定。

起初我还重新启动了MariaDB,它以一种不那么干净的方式解决了问题。但是,停止主管,取得了不同。