Соединение PostgreSQL неожиданно закрывается при выполнении большой вставки

Я заполняю таблицу PostgreSQL ~ 11.000.000 строк, которые были выбраны ранее из другой базы данных. Я использую Python и psycopg2. Весь процесс занимает примерно 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.

5
задан WolfgangP 31 July 2011 в 18:34
поделиться