Alembic迁移困在postgresql?

tap*_*123 12 python postgresql alembic

我编写了一个在sqlite上工作正常的迁移脚本,但如果我尝试将其应用于postgres,它将永远停留.通过一个简单的ps我可以看到postres卡在"创建表等待".有什么最好的做法?

Cra*_*ger 24

如果它真的卡在锁上,你需要看看它在等什么.CREATE TABLE被卡在锁上是很奇怪的,但这并非不可能.

获取卡住的进程ID

获取等待后端的进程ID.你可以找到它ps,或者SELECT从荷兰国际集团pg_stat_activity,寻找与工艺waiting真,找到你感兴趣的命令:

SELECT * FROM pg_stat_activity WHERE waiting;
Run Code Online (Sandbox Code Playgroud)

弄清楚它在等什么锁

通过查询来pg_locks查看卡住的pid正在等待的锁定:

SELECT * FROM pg_locks WHERE pid = <the-waiting-pid> AND NOT granted;
Run Code Online (Sandbox Code Playgroud)

您可以将这两个步骤结合使用:

\x

SELECT * 
FROM pg_locks l
INNER JOIN pg_stat_activity s ON (l.pid = s.pid)
WHERE waiting
AND NOT granted;
Run Code Online (Sandbox Code Playgroud)

然后查看结果,或使用字段LIKE上的过滤器s.query来查找您尝试识别锁定问题的查询.

找谁拥有那个锁

您现在可以查询pg_locks以找出哪个进程找到了该锁,以及他们正在做什么.

假设我们发现create正在等待locktype = relationlock of mode = AccessExclusiveLockon relation = 14421被授予.我们想找到关于该关系的其他会话持有的锁:

SELECT * 
FROM pg_locks l 
INNER JOIN pg_stat_activity s ON (l.pid = s.pid)
WHERE locktype = 'relation'
AND   relation = 14421;
Run Code Online (Sandbox Code Playgroud)

这应该告诉你什么阻止了创建.

皱纹

在PostgreSQL维基上一个方便的锁监控查询,但它只能找到行级锁.所以它对DDL一般没用.

另外,我故意不将整个批次合并为一个查询.在AccessExclusiveLock的情况下找到通过pid阻止给定后端的锁持有者是很简单的,但是对于较弱的锁请求,它并不那么简单 - 我必须写出哪些锁与哪些锁冲突的规则在SQL中,这非常复杂.最好只关注它.


Ret*_*ozi 2

您的数据库很可能被另一个查询锁定。

特别是如果你用他们的 GUI pgAdmin 做一些事情,我发现这种情况经常发生。(截断表特别棘手,有时 pgAdmin 崩溃并且数据库卡住)

你要做的就是重新启动整个 postgresql 服务并重试。

确保您:

  1. 尽量减少 GUI pgadmin 的使用
  2. 如果不需要,请使用 psycopg2 关闭游标/数据库