gpt4 book ai didi

python - Alembic 迁移卡在 postgresql 上?

转载 作者:太空狗 更新时间:2023-10-29 17:55:01 24 4
gpt4 key购买 nike

我写了一个在 sqlite 上运行良好的迁移脚本,但如果我尝试将它应用到 postgres,它就会永远卡住。通过一个简单的 ps,我可以看到 postres 停留在“创建表等待”上。有什么最佳实践吗?

最佳答案

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

获取卡住的进程id

获取等待后端的进程ID。您可以在 ps 中找到它,或者通过 pg_stat_activity 中的 SELECT 查找 waiting 为 true 的进程,以找到您感兴趣的命令:

SELECT * FROM pg_stat_activity WHERE waiting;

找出它在等待什么锁

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

SELECT * FROM pg_locks WHERE pid = <the-waiting-pid> AND NOT granted;

您可以将这两个步骤与:

\x

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

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

找出谁持有那把锁

您现在可以查询 pg_locks 以找出哪个进程找到了那个锁,以及它们在做什么。

假设我们发现 create 正在等待 locktype=relation 锁模式=AccessExclusiveLock on relation=14421 被授予。我们想找到其他 session 在该关系上持有的锁:

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

这应该告诉您是什么阻止了创建。

皱纹

a handy lock monitoring query on the PostgreSQL wiki ,但它只会找到行级锁。所以它通常对 DDL 没有帮助。

此外,我有意没有将所有内容合并到一个查询中。在 AccessExclusiveLock 的情况下,通过 pid 找到阻塞给定后端的锁持有者很简单,但对于较弱的锁请求,它并不是那么简单 - 我必须写出关于哪些锁与哪些锁冲突的规则在 SQL 中,这非常复杂。最好只是观察一下。

关于python - Alembic 迁移卡在 postgresql 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22896496/

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