You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django随机出现MySQL连接失败问题求助

随机出现Django无法连接MySQL的问题排查思路

在使用Django框架时,会随机出现无法连接MySQL数据库的异常,正常场景下系统可正常运行,出现异常后刷新页面即可恢复,问题完全随机且无法复现。以下是我的Docker Compose配置文件:

networks:
  my_network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.16.238.0/24
          gateway: 172.16.238.1


services:
  web:
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      my_network:
        ipv4_address: 172.16.238.6
    restart: always
    depends_on:
      - db
    env_file:
      - ./backend/.env
    image: project-api
    build:
      context: .
      dockerfile: backend/Dockerfile.dev
    command: bash -c "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn project.wsgi -b 0.0.0.0:9001"
    volumes:
      - ./backend:/code
      - ./backend/logs:/logs


  db:
    image: mysql:8.0
    command: mysqld --default-authentication-plugin=mysql_native_password
    restart: always
    volumes:
      - ./backend/data:/var/lib/mysql
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      my_network:
        ipv4_address: 172.16.238.9
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: dev_db
      MYSQL_USER: dev_db_user
      MYSQL_PASSWORD: root

排查思路

  • 优化数据库连接池配置:Django默认的连接管理可能在高并发下出现连接耗尽或超时问题。可在settings.py中调整CONN_MAX_AGE参数(设置连接的最大存活时长),或者引入第三方连接池库(如django-db-connection-pool),减少频繁创建销毁连接的开销。
  • 检查MySQL连接数限制:进入MySQL容器执行show variables like 'max_connections';,查看当前连接数是否接近上限。若存在瓶颈,可在db服务的command中添加--max_connections=1000(根据实际负载调整数值),或者挂载自定义MySQL配置文件修改该参数。
  • 添加连接重试机制:Docker网络偶尔会出现短暂连通性波动,可在Django的数据库配置中设置OPTIONS里的connect_timeout,同时在业务代码中捕获OperationalError异常,实现自动重试逻辑。
  • 排查MySQL服务稳定性:通过docker logs <db容器名>查看MySQL日志,检查是否存在服务重启、连接中断、OOM(内存不足)或数据目录权限异常等记录,这些都可能导致随机连接失败。
  • 修复服务启动依赖问题:Docker的depends_on仅保证db服务启动,不确保MySQL完全就绪。可在web服务的启动命令中添加等待脚本,比如使用nc工具检测MySQL端口是否开放:
    bash -c "until nc -z db 3306; do sleep 1; done; python manage.py migrate && python manage.py collectstatic --noinput && gunicorn project.wsgi -b 0.0.0.0:9001"
    
    注意要确保web镜像中已安装netcat工具。
  • 分析Django错误日志:查看web服务挂载的日志目录中的详细错误栈,明确连接失败的具体原因(如超时、连接拒绝、认证错误等),针对性进行排查。

内容的提问来源于stack exchange,提问作者mohamed naser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:03:24