我正在开发一个测试应用程序,要求我在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警告:没有正在进行的交易
所以我正在寻找适合这个问题的答案。如果你能给出任何提示,我将非常感激。
答案 0 :(得分:4)
我读过数据库有一个大小上限,大约是4 Gb
我很怀疑。关于PostgreSQL肯定不是这样。
[...]随机点插入停止,如果我尝试重新启动插入过程,应用程序拒绝使用更多记录填充表
再一次,我担心我怀疑这一点。除非你的应用程序已经自我意识到它拒绝什么都不做。它可能会崩溃,或锁定,或等待某些事情发生。
我知道这个问题可能听起来很愚蠢,但我找不到任何其他原因导致它停止插入。
我认为你看起来不够努力。显而易见的事情要检查:
pg_locks
视图)。如果你问过上面检查过的问题,那么有人可以提供帮助。也许,一旦你掌握了事实,你就会自己弄清楚。
答案 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的支持!