【问题标题】:Django manage.py syncdb unfinishingDjango manage.py syncdb 未完成
【发布时间】:2014-10-13 19:55:22
【问题描述】:

编辑:

更改了问题标题 - 之前是关于 Postgres 中的启动包不完整,但 Craig 发现这不是 db 问题

我有 django 应用程序和安装脚本。 其中,脚本确保 postgresql 已安装并执行manage.py syncdb。

最近我注意到syncdb 的一些问题 - 它挂在Creating table xxxxxx.... 我中止了整个任务并继续,数据库似乎工作(甚至南工作),但我没有被要求创建 root 帐户。因此,它似乎创建了表格,然后挂在某些东西上,或者没有启动某些东西。我决定一劳永逸地解决它,并且在我发现上面提到的 comunicate 的 postgresql 日志中:

LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
LOG:  incomplete startup packet

我重新安装了 postgresql(我正在运行 ubuntu 13.10),但它并没有解决问题。 然后我认为这可能与创建表的应用程序有关,但取出这个应用程序证明它是无关的。 所以如果不是 postgresql 安装而不是 django app 它可能是什么?

也许我在安装 postgresql 时搞砸了?我做到了:

apt-get install postgresql postgresql-contrib

然后创建集群:

pg_createcluster 9.1 main

仅此而已。

自从我上次安装 postgresql 以来已经有一段时间了,所以也许我错过了一些明显的东西,虽然我不知道是什么。
我读过一些关于这个问题的文章,据说它与未编译的握手或类似的东西有关,不过,db 和 app ar 在同一台机器上。

我在 ubuntu 13.10 上使用 django 版本 1.5 和 postgresql 9.1(如前所述)

任何指针将不胜感激。
TIA

来自SELECT * FROM pg_stat_activity;的输出

 datid | datname  | procpid | usesysid | usename  | application_name | client_addr | client_hostname | client_port |         backend_start         |          xact_start           |          query_start          | waiting |          current_query          
-------+----------+---------+----------+----------+------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+---------+---------------------------------
 23255 | imris    |   18330 |    23254 | imris    |                  |             |                 |          -1 | 2014-08-20 15:43:19.38489+02  |                               | 2014-08-20 15:43:20.379704+02 | f       | <IDLE>
 11953 | postgres |   18342 |       10 | postgres | psql             |             |                 |          -1 | 2014-08-20 15:43:25.240481+02 | 2014-08-20 15:43:30.365372+02 | 2014-08-20 15:43:30.365372+02 | f       | SELECT * FROM pg_stat_activity;
(2 rows)

【问题讨论】:

  • “不完整的启动包”不是一个严重的问题。如果在建立连接之前断开连接,就可能发生这种情况。
  • 很高兴听到这个消息。但是为什么我的同步数据库没有完成呢?可能是什么?
  • 我猜有什么东西在排他锁上等待。显示SELECT * FROM pg_stat_activity WHERE waiting = 't' 的输出(编辑您的问题以添加它,完成后在此处评论)
  • 好吧,我想这并不多。当然,我在 syncdb 挂起时检查了它
  • 好的,所以卡住的地方不在数据库级别;在堆栈中看起来更高。

标签: django postgresql django-syncdb


【解决方案1】:

好吧,虽然我想我会发布一个解决方案(也许有人会遇到类似的问题),但这有点令人尴尬。

事实上,使用 syncdb 一切都很好。
问题是我从我的安装脚本(bash)中使用了它,我从中显示了我自己关于安装过程的输出。为了保持一致性,我将使用过的命令的大部分输出重定向到 /dev/null。

如果是syncdb,我决定只重定向stderr:python manage.py syncdb 2&gt; /dev/null
碰巧它阻止了“创建超级用户”提示的显示,因此进程正在等待用户输入(这里是第一个输入的情况下是或否)。

这里有一些有趣的问题,当我发现原因后,我开始尝试其他可能性并得到了有趣的结果:

  • 重定向stdout:python manage.py syncdb &gt; /dev/null
    • 什么都没有显示(除了折旧警告,这很好,因为它应该通过标准错误)
    • 没有显示超级用户提示
    • 在前3个提示(有5个:do you want created su, login, email, pass, repeat pass)盲打答案后,密码提示正常显示
  • 重定向stderr:python manage.py syncdb 2&gt; /dev/null(如上所述)
    • 正常显示
    • 超级用户提示未显示(原文如此!)
    • 在前 3 个提示盲打答案后,密码提示正常显示(原文如此!)

这很有趣,因为它表明密码提示在某种程度上不受重定向一秒和一秒的影响,如果根本没有 any 重定向,则其余提示不会显示! (不管是stdout和stderr)

为了额外的测试,我重定向了all:python manage.py syncdb &amp;&gt; /dev/null,我根本没有显示,但在摸索前三个提示后,密码提示出现了。

尽管我发现 bash 重定向如何与此输出一起工作,但我的问题已解决。 AFAIK create_superuser 使用名为 getpass 的东西,它与流混淆,所以我想它已经足够清楚了。
我正在努力理解前三个提示消失背后的机制。 如果有人对此有所了解,我很乐意阅读。

【讨论】:

    猜你喜欢
    • 2015-04-11
    • 2014-09-07
    • 2015-07-31
    • 2011-02-13
    • 1970-01-01
    • 2015-04-25
    • 2010-12-17
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多