Django migrate失败后如何解除PostgreSQL数据库死锁?
解决Django Migrate时遇到的PostgreSQL死锁问题
你这遇到的是典型的PostgreSQL死锁问题——两个数据库进程互相攥着对方需要的锁,形成了循环等待,直接把migrate给卡得动不了了。下面给你一步步解决的办法,还有以后怎么避免的建议:
第一步:找到并终止死锁的进程
先远程连接到你的PostgreSQL数据库,执行这条SQL看看那两个卡住的进程在干啥:
SELECT pid, query, state FROM pg_stat_activity WHERE datname = '你的数据库名称' -- 替换成你实际的数据库名 AND pid IN (11463, 11681); -- 错误提示里的两个进程ID
确认这俩进程确实是和migrate相关的阻塞进程之后,就可以把它们终止掉:
SELECT pg_terminate_backend(11463); SELECT pg_terminate_backend(11681);
敲黑板:一定要确认这两个进程不是其他业务的关键进程,别误杀了正常服务的进程!
第二步:重新跑Migrate
把卡住的进程干掉之后,回到你的Django项目环境,重新执行migrate命令:
python manage.py migrate
这次应该就能正常执行完成了。
以后怎么避免再踩这个坑?
给你几个实用建议:
- 跑migrate的时候,尽量暂停所有其他会访问这个数据库的服务或脚本(比如Django开发服务器、定时任务、数据同步工具啥的),减少锁冲突的概率。
- 如果你的迁移涉及大表操作(比如给大表加带默认值的字段、改字段类型),尽量选业务低峰期执行,或者把大操作拆成多个小迁移步骤,别让一个操作长时间占着锁。
- 写迁移文件的时候,尽量别在单条迁移里塞多个可能锁表的操作,拆成多个小迁移文件,降低死锁的风险。
内容的提问来源于stack exchange,提问作者roob
相关产品推荐
相关产品推荐

