Postgresql插入停止在随机数量的记录

时间:2012-03-23 15:46:12

标签: database postgresql insert limit record

我正在开发一个测试应用程序,要求我在Postgresql数据库中插入100万条记录,但随机点插入停止,如果我尝试重新启动插入过程,应用程序拒绝用更多记录填充表。我已经读过数据库有一个大小上限,大约是4 Gb,但我确信我的数据库甚至没有接近这个值。

那么,为什么插入停止会有什么其他原因呢?

它发生了几次,一次上限为170872条记录,另一次发生在25730条记录。

我知道这个问题可能听起来很愚蠢,但我找不到任何其他原因导致它停止插入。

提前致谢!

只是快速更新:

确实问题不是数据库上限,这里是PostgreSQL的官方数据:

- Maximum Database Size                 Unlimited
- Maximum Table Size                    32 TB
- Maximum Row Size                      1.6 TB
- Maximum Field Size                    1 GB
- Maximum Rows per Table                Unlimited
- Maximum Columns per Table             250 - 1600 depending on column types
- Maximum Indexes per Table             Unlimited

更新

日志文件出错:

2012-03-26 12:30:12 EEST警告:没有正在进行的交易

所以我正在寻找适合这个问题的答案。如果你能给出任何提示,我将非常感激。

4 个答案:

答案 0 :(得分:4)

  

我读过数据库有一个大小上限,大约是4 Gb

我很怀疑。关于PostgreSQL肯定不是这样。

  

[...]随机点插入停止,如果我尝试重新启动插入过程,应用程序拒绝使用更多记录填充表

再一次,我担心我怀疑这一点。除非你的应用程序已经自我意识到它拒绝什么都不做。它可能会崩溃,或锁定,或等待某些事情发生。

  

我知道这个问题可能听起来很愚蠢,但我找不到任何其他原因导致它停止插入。

我认为你看起来不够努力。显而易见的事情要检查:

  1. 您是否在PostgreSQL日志中收到任何错误?
  2. 如果没有,您确定要记录错误吗?发出错误的查询以进行检查。
  3. 您是否在应用程序中遇到任何错误?
  4. 如果没有,你确定要检查吗?再次,检查
  5. 计算机是什么?使用了多少CPU / RAM /磁盘IO?有什么不寻常的活动吗?
  6. 开始采取任何异常锁定(查看pg_locks视图)。
  7. 如果你问过上面检查过的问题,那么有人可以提供帮助。也许,一旦你掌握了事实,你就会自己弄清楚。

答案 1 :(得分:1)

好的 - 如果您收到“没有正在进行的事务”,这意味着您正在发出提交/回滚但在显式事务之外。如果您不发出“BEGIN”,则每个语句都会获得自己的事务。

这不太可能是问题的原因。

导致插入物停止的东西,你仍然没有告诉我们什么。您之前说过,您没有在应用程序中收到任何错误。如果PostgreSQL返回错误,你应该在应用程序中提取错误,这是不可能的。

如果没有更准确的信息,很难提供帮助。您发送给PostgreSQL的每个语句都将返回一个状态代码。如果在多语句事务中出现错误,则将回滚该事务中的所有语句。您在应用程序中遇到了一些混乱的事务控制,或者由于其他原因而导致其崩溃。

答案 2 :(得分:0)

其中一种可能性是OP正在使用ssl,并且达到了ssl_renegotiation_limit。在任何情况下:将log_connections / log_disconnections设置为“On”并检查日志文件。

答案 3 :(得分:0)

我发现我的insert命令有什么问题,虽然它看起来很有趣但是你从未想过会出错的事情之一。

我的应用程序是在Django中开发的,它有一个命令,它只是调用在表中执行插入操作的文件。

即。在命令行终端我只写:

time python manage.py populate_sql

我使用time命令的原因是因为我想看看插件执行需要多长时间。嗯,问题出在这里。该time命令发出错误, Out of memory 错误,该错误停止了插入数据库。我在使用 - verbose 选项运行命令时发现了这个小代码,它可以让你看到命令的所有细节。

我想感谢大家的答案,感谢我从他们那里学到的东西以及你曾经试图帮助我的时间。

修改

如果您有一个Django应用程序,您在其中对数据库进行了大量操作,那么我的建议是将settings.py中的'DEBUG'变量设置为' FALSE'因为它及时占用了大量的记忆。

所以,

DEBUG = False

最后,再次感谢Richard Huxton的支持!