【问题标题】:Laravel: MariaDB - artisan migrate:refresh hangsLaravel:MariaDB - 工匠迁移:刷新挂起
【发布时间】:2018-03-12 18:03:41
【问题描述】:

我将 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 中是否需要任何特定设置?还是我需要使用默认字符集等特定参数创建数据库?

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

【问题讨论】:

  • 使用 Laravel 5.5.14,问题依然存在。

标签: laravel-5 mariadb laravel-artisan


【解决方案1】:

当使用 Supervisor 控制 artisan 队列时,一定要停止守护进程

sudo supervisorctl stop <YOUR_QUEUES>

表演时

artisan migrate:refresh

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

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

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

虽然 artisan:refresh 命令挂起,并且 jobs 正在由 Supervisor 支持的作业工作者排队,但 MariaDB 服务器报告两个连接(来自相关 Laravel DB 用户)等待元数据锁。

一开始我也重启了 MariaDB,它以一种不太干净的方式解决了这个问题。但是,停止 Supervisor 后,情况有所不同。

【讨论】:

  • 有道理。有没有已知的解决方案,它是自动的。在做这些工作时停止主管?
猜你喜欢
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2016-07-08
  • 2018-09-26
  • 1970-01-01
  • 2016-04-16
  • 2015-12-18
  • 2019-04-22
相关资源
最近更新 更多