
前提・実現したいこと
PHP(5.2.17)+PostgreSQL(8.4.20)で集計のプログラムを作成しています。
cronによって定期実行させている、
幾つかの集計クエリーを実行して終了するバッチプログラムで、
サブクエリのあるINSERTや集計前のデータクリアの為のDELETE等、
時間がかかるクエリーの実行が有ると
まれにDB側にメッセージを残して処理が途中で停止し、
バッチプログラムのプロセスが残りっぱなしになる事が有るので
必ず完走させることが目的となります。
宜しくお願い致します。
2018.12.20 追記
トランザクションの分割を行い2日程動かしました。
現状では完走しないケースがまだ有りますが、
対応後で、若干エラー内容は変わりました。
一旦時間がかかるクエリーを個別にチューニングして様子を見ています。
Dec 20 01:02:51 [4191-1] LOG: could not send data to client: Broken pipe
Dec 20 01:02:51 [4192-1] LOG: unexpected EOF on client connection
Dec 20 01:02:51 [4193-1] LOG: disconnection: session time: 0:02:49.872 user=ユーザー database=データベース host=ホスト port=ポート
2018.12.21 追記
トランザクションの分割のみでは結果が同じ模様。
引っかかった物からクエリーチューニングを行っているが、
難航中。(自由に実行、集中して作業が出来ないのが辛い所)
発生している問題・エラーメッセージ
PostgreSQL側に以下のメッセージが表示されます。
LOG: could not receive data from client: Connection reset by peer
LOG: unexpected EOF on client connection
LOG: disconnection: session time: 0:02:51.973 user=USER database=DATABASE host=HOST port=PORT
該当のソースコード
【初回質問時(パターンA)】
$con = new PDO(DSN, USERNAME, PASSWORD);
$con->begin();
$con->exec($delete_sql1, $where); //集計テーブルクリア
$con->exec($delete_sql2, $where); //集計テーブルクリア
$con->exec($delete_sql3, $where); //集計テーブルクリア
//<<---↑このクエリに時間がかかった場合はログがここまでになる
$con->exec($insert_sql1, $where); //集計テーブルへ集計データを挿入
$con->exec($insert_sql2, $where); //集計テーブルへ集計データを挿入
$con->exec($insert_sql3, $where); //集計テーブルへ集計データを挿入
$con->commit();
↓
【トランザクション分割(パターンB)】
$con = new PDO(DSN, USERNAME, PASSWORD);
$con->begin();
$con->exec($delete_sql1, $where); //集計テーブルクリア
$con->commit();
$con->begin();
$con->exec($delete_sql2, $where); //集計テーブルクリア
$con->commit();
$con->begin();
$con->exec($delete_sql3, $where); //集計テーブルクリア
//<<---↑このクエリに時間がかかった場合はログがここまでになる
$con->commit();
$con->begin();
$con->exec($insert_sql1, $where); //集計テーブルへ集計データを挿入
$con->commit();
$con->begin();
$con->exec($insert_sql2, $where); //集計テーブルへ集計データを挿入
$con->commit();
$con->begin();
$con->exec($insert_sql3, $where); //集計テーブルへ集計データを挿入
$con->commit();
試したこと
【パターンA時】
PHP側に
set_time_limit(0);
ini_set("session.gc_maxlifetime", 60*30);
を入れてみましたが改善できませんでした。
【パターンB時】
トランザクションを分割しました。
補足情報(FW/ツールのバージョンなど)
PHP(5.2.17)
PostgreSQL(8.4.20)

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/12/18 03:47
退会済みユーザー
2018/12/18 03:59