tap*_*123 12 python postgresql alembic
我编写了一个在sqlite上工作正常的迁移脚本,但如果我尝试将其应用于postgres,它将永远停留.通过一个简单的ps我可以看到postres卡在"创建表等待".有什么最好的做法?
Cra*_*ger 24
如果它真的卡在锁上,你需要看看它在等什么.CREATE TABLE被卡在锁上是很奇怪的,但这并非不可能.
获取等待后端的进程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中,这非常复杂.最好只关注它.
您的数据库很可能被另一个查询锁定。
特别是如果你用他们的 GUI pgAdmin 做一些事情,我发现这种情况经常发生。(截断表特别棘手,有时 pgAdmin 崩溃并且数据库卡住)
你要做的就是重新启动整个 postgresql 服务并重试。
确保您:
| 归档时间: |
|
| 查看次数: |
4850 次 |
| 最近记录: |