6

私たちのアプリケーションはCOPYクエリを使用して赤方偏移するCSVファイルからデータを挿入していることは、Cをアップロード700ギガバイトCの両端の合計で11000個のファイルそれぞれを。。。。 1つのデータベース・テーブルへのファイルのマップ私たちは前に、ロギングおよび健全性チェックのためのCOPY各後SELECT COUNT(*) FROM <table>を実行pg_query() - ブロックモードへ「に設定することはできません接続(エラー番号8)

一定期間後に(変化するように思える)pg_query()リターンへの呼び出しこのE_NOTICE PHPエラー:。。

この

pg_query() - "Cannot set connection to blocking mode (Error No. 8) 
はのために返されます3210クエリ。私たちのアプリケーションはすべてのPHPエラーを例外に伝播します。この伝播を削除すると、私たちに SELECTCOPYの両方で上記 E_NOTICEに加えて、このエラーメッセージを表示します。

Failed to run query: server closed the connection unexpectedly 
    This probably means the server terminated abnormally 

COPYクエリは間違いなく、実際にファイルを挿入しません。

存在すると、このエラーは、ファイルを挿入するためのあらゆる試みに起こります。それは自分自身を解決するようではありません。

最初に、スクリプトの開始時に1つのデータベース接続を開き(pg_connect()で開かれていた)、SELECTCOPYのすべてに再利用しました。上記のE_NOTICEを取得したら、実験のように、各クエリに対して新しい接続を開始しようとしました。これは何も変わっていない。 PHP iniファイル内

私たちの現在のpgsqlの設定は次のとおりです。このエラーの原因となることができ、それがどのように解決することができるもの

pgsql.allow_persistent = Off 
pgsql.auto_reset_persistent = Off 
pgsql.max_persistent = -1 
pgsql.max_links = -1 
pgsql.ignore_notice = 0 
pgsql.log_notice = 0 

更新 - 添付の画面を参照してください。私たちは 'concurrency'を5に設定し、timeoutを0に設定したデフォルトのクエリキューしか持たないようです。また

enter image description here

main=# select * from stv_sessions; 
     starttime  | process |      user_name      |      db_name 
------------------------+---------+----------------------------------------------------+---------------------------------------------------- 
2017-03-24 10:07:49.50 | 18263 | rdsdb            | dev 
2017-03-24 10:08:41.50 | 18692 | rdsdb            | dev 
2017-03-30 10:34:49.50 | 21197 | <username_removed>        | main 
2017-03-24 10:09:39.50 | 18985 | rdsdb            | dev 
2017-03-30 10:36:40.50 | 21605 | root            | main 
2017-03-30 10:52:13.50 | 23516 | rdsdb            | dev 
2017-03-30 10:56:10.50 | 23886 | root            | main 
+0

読み込みに失敗したファイルについて、 'copy'はどれぐらいの間実行されましたか?ファイルサイズが巨大でなければならないので、15分以上実行しているに違いないと思います。 –

+0

'select * from stv_sessions'にはいくつの接続が見えますか?そのユーザグループのキューに設定されている同時実行性とタイムアウトは何ですか? –

+0

@RedshiftGuy - stv_sessionsテーブルには5つの接続があります:3つはユーザー 'rdsdb'によって作成され、常にRedshiftの一部として実行されていると思いますか?それから、私がコマンドラインで 'psql'クライアントを使って作ったものがあり、最後に私のアプリケーションで作られたものがあります。 (私は元々の投稿で、クエリごとに新しい接続を一時的に開こうとしていたが、それ以上は関係ない)。 また、そのユーザーグループキューの並行性/タイムアウトを確認するにはどうすればよいですか?ありがとう。 – Pete171

答えて

0

が持っている:アプリケーションの実行中に、我々はこれらのみDBのユーザーが接続している(「username_removed」が1は、我々のアプリケーションによって作成された唯一のものです)あなたは変更しようとしましたpg_connectpg_pconnect?これにより、既存の接続が再利用され、データベースへの接続が減少し、サーバーが円滑に実行されます。

私は*を使用して、カウントを行うことはありませんに言うでしょう。データベースで各レジスタのハッシュを作成してカウントする必要があります。独自の値を使用してください。あなたがそれを持っていない場合は、シーケンスを作成し、それを "auto_increment"フィールドで使用することを検討してください。また、あなたのブロッキングモードの設定を確認することができます

は、私はあなたが巨大なファイルで作業することを確認し、パフォーマンスの改善はあなたの仕事をするのに役立ちます。

私は、これはウェブを検索、あなたのために働くことがありました。 "pgsqlの変更から。auto_reset_persistent = offからonにしてApacheを再起動すると、エラーが解決されます。 "

私の最後のアドバイスは、トランザクションを使用している場合はカウントを設定できます。ロックされた行を無視すると、 。

https://www.postgresql.org/docs/9.5/static/explicit-locking.html#LOCKING-ROWS

0

あなたの接続がタイムアウトすることができる。あなたの接続オプションでキープアライブを有効にしてください。

あなたの接続文字列でkeepalives=1を設定するには、キープアライブパケットを送信し、conneを防ぐ必要がありますタイムアウトが発生することがあります。 keepalives_idle=60を設定することもできます。

デフォルトでは、OSからの接続ではキープアライブを要求できないため、対応するOSレベルの設定を更新するまでこれらの設定が機能しないように見えます。

詳細については、同様の質問TCP Keep-Alive PDO Connection Parameterをご覧ください。