以前に選択した〜11.000.000行のPostgreSQLテーブルを他のデータベースから読み込んでいます。私はPythonとpsycopg2を使用しています。プロセス全体が完了するまでにおよそ1.5時間かかります。しかし、〜30分後、私は "接続が予期せず閉じられました"という例外を受け取ります。ソースコードは次のようになります。大きい挿入を実行すると、PostgreSQLの接続が予期せず終了する
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()
私は開いているトランザクションが〜30分の時間制限の上限を持っているか、カーソルが保留中の上限を持っていることと仮定して、失敗した最初の試みの後(1)
と(2)
を挿入しました挿入物。この仮定は真実ではなく、エラーはどこかにあると思われます。
両方のデータベースは、ホストからのポート転送を介して接続するVirtualBoxマシンに格納されています。私はホストマシン上でプログラムを実行します。
両方のデータベースはテストのためのもので、管理するための他の接続はありません。たぶん私はこの問題を回避するために問題を書き直さなければならないかもしれませんが、私はpsycopg2
やPostgreSQLのいくつかの隠された時間制限について非常に心配しています。
私は問題が構成内のあなたのwork_mem変数にある可能性があることです。 AFAIKこの変数は、1つの接続に許可される最大メモリを設定します。ログに何が間違っているかについてのエントリがあることを確認してください – Voooza
しかし、SELECT文は全く機能しません。しかし、私は 'outdb'との接続がゆるいです。 – WolfgangA
'COPY'以上のトランザクションを使用してください。 1回の取引で100件のレコードを実行すると、約110件が得られます。000トランザクションを完了してジョブ全体を完了します。 1台の7400rpmドライブでは、1秒間に120回のコミットしか処理できません(キャッシュが原因でなければ、信頼性が低くなります)。現在の問題はネットワークの問題のように聞こえます。 –