详细的报错信息如下:
LOG: database system is ready to accept connections
LOG: database system was interrupted;
LOG: database system was not properly shut down; automatic recovery in progress
LOG: invalid record length at 0/2EA3830: wanted 24, got 0
LOG: redo is not required
LOG: MultiXact member wraparound protections are now enabled
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
LOG: database system was interrupted; last known up at 2017-03-02 00:32:34 UTC
LOG: received smart shutdown request
因为项目集成了docker,docker里又有postgresql数据库,所以在调试程序的时候,经常会有重启项目的时候(一般修改代码,会自动重启服务的,特殊情况除外),因为是刚结束服务,有立马启动服务,所以会经常启动不了,报错如上。
网上也查了一下,最后确定问题的原因:
postgresql数据库里有一个文件“postmaster.pid”,它是记录postgresql启动时的pid信息的,理论上在停止服务的时候,此文件会被删除掉的,但由于我操作频繁,导致它还没有被删除,在启动postgresql服务的时候,postgresql查询到pid文件的存在,以为服务已经启动起来了,为了不重新加载就不再启动服务了…
所以就直接 把那个pid文件删除掉…之后再启动服务,果然就正常咯
sorry, 我又反复测试了几次后还是有问题的,我出现这个问题是因为项目里使用的docker,在启动项目是,数据库的服务有可能还没有启动,这个时候项目的服务就要去访问数据库,导致无法连接(我目前猜测的最有可能的原因),所以呢,我现在的处理是,先后台启动数据库服务,然后,在启动项目,这样就没有问题了
# 以下 "ss" 代表项目名称
# 后台启动所有服务
docker-compose up -d
# 查看服务运行情况
docker-compose ps
ss_celery_1 bash -c celery worker -A S ... Up
ss_db_1 /docker-entrypoint.sh postgres Up 5432/tcp
ss_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
ss_ss_1 bash -c python manage.py m ... Exit 0.0.0.0:8501->8501/tcp
# 这是可以看到 项目的服务 ss_ss_1 并没有启动起来,那么单独启动项目服务
docker-compose start ss
# 再查看各个服务情况
ss_celery_1 bash -c celery worker -A S ... Up
ss_db_1 /docker-entrypoint.sh postgres Up 5432/tcp
ss_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
ss_ss_1 bash -c python manage.py m ... Up 0.0.0.0:8501->8501/tcp
# 已经全起来了,查看项目的实时日志
docker-compose logs -f ss
所以,这个问题的解决 就是先启动数据库服务,然后在启动项目,这时就可以连接数据库了,问题分解来搞,就解决了