EC2实例及托管SQL崩溃:Django部署后MySQL连接异常求助
解决EC2上Django连接MySQL失败及实例崩溃问题
一、先修复MySQL连接拒绝问题
1. 确认MySQL服务状态
登录EC2实例,执行命令检查MySQL/MariaDB运行状态:
systemctl status mysql # 若为MariaDB则执行:systemctl status mariadb
如果服务未运行,启动并设置开机自启:
systemctl start mysql systemctl enable mysql
2. 验证MySQL监听配置
检查MySQL是否监听127.0.0.1的3306端口:
netstat -tulpn | grep 3306
若输出为空或监听地址不符,编辑MySQL配置文件(通常为/etc/mysql/my.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf),修改bind-address项:
bind-address = 127.0.0.1
修改后重启服务:
systemctl restart mysql
3. 检查Django数据库配置
打开项目settings.py,确认DATABASES配置参数正确:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的数据库名称', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': '127.0.0.1', 'PORT': '3306', } }
手动测试数据库连接,验证账号密码有效性:
mysql -u 数据库用户名 -p -h 127.0.0.1
能正常进入MySQL命令行则说明连接参数无问题。
4. 修复MySQL用户权限
若手动连接失败,可能是用户缺少127.0.0.1的访问权限。进入MySQL命令行后执行:
GRANT ALL PRIVILEGES ON 你的数据库名.* TO '数据库用户名'@'127.0.0.1' IDENTIFIED BY '数据库密码'; FLUSH PRIVILEGES;
二、解决EC2实例崩溃问题
连接失败后实例崩溃,多因连接重试导致资源耗尽:
1. 优化Django数据库连接池
在settings.py的DATABASES中添加连接控制配置:
DATABASES = { 'default': { # 原有配置... 'CONN_MAX_AGE': 60, # 连接闲置60秒后关闭 'OPTIONS': { 'max_connections': 10, # 限制最大连接数,根据实例资源调整 } } }
也可使用第三方连接池库(如django-db-connection-pool)实现更精细的连接管理。
2. 检查实例资源占用
执行命令查看CPU、内存使用情况:
top
若连接失败时资源被占满,需升级EC2实例规格,或调整Web服务器(如Gunicorn)的worker数量,避免进程过度抢占资源。
三、修复迁移文件问题
删除迁移文件后需重新同步模型与数据库结构:
- 确认数据库已清空(或与当前模型结构一致),执行:
python manage.py makemigrations python manage.py migrate
- 后续不要直接删除迁移文件,如需重置迁移,使用
python manage.py migrate --fake或官方推荐流程,避免模型与数据库结构不一致引发异常。
内容的提问来源于stack exchange,提问作者psp
相关产品推荐
相关产品推荐

