gpt4 book ai didi

即使没有实际的新迁移,Django 迁移命令也会卡在 Heroku 上

转载 作者:行者123 更新时间:2023-12-04 04:05:47 25 4
gpt4 key购买 nike

我们在 Heroku 上运行我们的堆栈。我们将 Django 2.2 与 Postgres 11 数据库一起使用。我们的构建管道 (Github Actions) 推送到 Heroku (git push https://git.heroku.com...),然后立即运行迁移 (heroku run python manage.py migrate --app heroku-app-name).所有这些都与 Postgres 9.6 数据库一起工作,并且仍在我们的暂存环境 (Postgres 11) 中工作。现在在 Postgres 11 上进行生产,django migrate 命令只是卡住并且不会产生任何输出,即使没有实际的迁移要应用。

我们的生产设置和暂存设置之间的唯一区别是生产中附加到主数据库和“生产工作负载”的跟随者/从属。

为了修复该部署,我必须运行一个

heroku pg:killall -a heroku-app-name
heroku restart -a heroku-app-name

此时构建管道中的迁移任务失败。

之后可以毫无问题地手动应用迁移:

heroku run python manage.py migrate --app heroku-app-name

因此,出于某种原因,迁移命令正在“等待”某些东西,一些数据库锁定或其他任何东西,但我无法确定它。对我来说特别奇怪的是,它也卡在没有应用迁移的地方。为什么会卡在那里?

最佳答案

我们找到了解决方案。实际上有三件事结合在一起。

  1. 我们在运行任何迁移之前触发数据库备份。我们只在生产环境中这样做,而不是在暂存环境中这样做,这就是我们的暂存环境没有问题而生产环境有问题的原因。
  2. 数据库迁移(即使看起来没有什么可应用的)实际上正在运行一些命令(除了常规的 SELECT、UPDATE、INSERTS 之外)。例如。在我们的例子中,有一个 CREATE EXTENSION ... IF NOT EXISTS 总是在开头执行。
  3. 虽然 Postgres 9.6 可以并行运行备份作业(我不知道 heroku 在后台使用什么,但我假设是 noraml pg_dump) Postgres 11(和其他?)现在对某些操作具有更排他性的锁定。我假设在并行运行备份作业时无法执行 CREATE EXTENSION ... IF NOT EXISTS(即使扩展已经存在)。

(我确定缺少一些 Postgres internas 来更正确地解释这一点)

由于这三件事,数据库会阻止迁移操作,等待备份作业完成。我已将日常备份工作移到不同的时间并重新配置我们的管道以等待“预部署”备份首先完成。

关于即使没有实际的新迁移,Django 迁移命令也会卡在 Heroku 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62531223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com