Docker部署Django1.11.9与PostgreSQL10出现表重复问题
问题1:AWS EC2性能下降,区分EC2与Django根源
先从EC2基础设施层面排查,确认是不是底层资源瓶颈:
- 打开AWS CloudWatch,查看EC2实例的核心指标:CPU使用率、内存占用、磁盘IOPS/吞吐量、网络出入带宽。如果某一项指标持续接近100%(比如CPU长期跑满、磁盘IO超过实例上限),那大概率是EC2资源不够或者遇到了瓶颈。
- 登录EC2实例,用系统命令实时监控:
top看CPU和内存的进程占用,有没有异常进程(比如某个后台任务疯狂消耗资源)iostat -x 1看磁盘读写性能,有没有很高的%util值netstat -anp检查网络连接状态,有没有大量TIME_WAIT或者ESTABLISHED连接堆积
如果EC2指标都正常,再转向Django应用层面排查:
- 启用Django Debug Toolbar,分析每个请求的耗时分布:是数据库查询慢?还是模板渲染久?或者是调用了外部API拖慢了响应?
- 检查PostgreSQL的状态:进入Docker容器执行
psql -U <你的数据库用户> <数据库名>,然后运行SELECT count(*) FROM pg_stat_activity;看连接数是不是接近上限;再用EXPLAIN ANALYZE分析慢查询语句,看有没有未加索引的表查询。 - 查看Django的应用日志,有没有频繁的报错、超时或者异常堆栈(比如缓存失效、第三方服务调用失败导致的重试)。
问题2:Docker上PostgreSQL10重复表无法删除
先搞清楚重复表的情况,再针对性解决:
- 确认表的归属schema:进入PostgreSQL容器执行
psql -U <用户> <库名>,然后输入\dt *.*查看所有schema下的表。很多时候所谓的“重复表”是在不同schema里(比如public和你自定义的schema),删除时需要指定schema:DROP TABLE IF EXISTS 目标schema.重复表名; - 检查表是否被锁定:如果删除时提示“could not drop table because it is being used by active queries”,先查锁定的连接:
找到对应的pid后,杀掉连接:SELECT pid, query FROM pg_locks WHERE relation = '重复表名'::regclass AND mode = 'AccessExclusiveLock';
之后再尝试删除表。SELECT pg_terminate_backend(pid); - 确认权限是否足够:当前用户有没有DROP表的权限?执行:
如果返回SELECT has_table_privilege(current_user, '重复表名', 'DROP');f,切换到超级用户(比如postgres)执行删除:
然后再执行DROP TABLE命令。docker exec -it <postgres容器ID> psql -U postgres <库名> - 验证Docker容器操作对象正确:确保你操作的是运行中的PostgreSQL容器,用
docker ps确认容器ID,避免误操作到其他容器或者本地的PostgreSQL实例。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

