我正在使用Python和psycopg2将从另一个数据库中提前选择的约1100万行填充到PostgreSQL表中。整个过程需要大约1.5小时才能完成。但是,在大约30分钟后,我会遇到“连接意外关闭”的异常。源代码如下:
incursor = indb.cursor()
incursor.execute("SELECT ...")
indb.commit() # (1) close transaction
outcursor = outdb.cursor()
rows = 0
for (col1, col2, col3) in incursor: # incursor contains ~11.000.000 rows
outcursor.execute("INSERT ...", (col1, col2, col3)) # This fails after ~30 minutes
row += 1
if row % 100 == 0: # (2) Write data every 100 rows
outcursor.close()
outdb.commit()
outcursor = outdb.cursor()
incursor.close()
outcursor.close()
outdb.commit()
在第一次尝试失败后,我在其中插入了(1)
和(2)
,假设一个开放的事务有一个上限时间约为30分钟,或者光标有一个挂起插入的上限。看来这些假设都不正确,错误出现在其他地方。
两个数据库都存储在VirtualBox机器上,我通过端口转发从主机连接。我在主机上运行程序。
这两个数据库仅供测试目的,并且它们没有其他连接需要管理。也许我必须重写问题以解决这个问题,但是我需要在其他地方进行非常耗时的插入(大约运行几天),因此我非常担心psycopg2
或PostgreSQL中存在一些隐藏的时间限制。
COPY
或更大的事务。在单个事务中仅执行100条记录,您需要完成大约110,000个事务才能完成整个作业。单个7400rpm驱动器每秒只能处理120个提交(除非由于缓存而导致不可靠)。您当前的问题听起来像是网络问题。 - Frank Heikens