Я заполняю таблицу 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.