57729


sqlalchemy+pymysql で MySQL サーバーから大量のレコードを select しようとしました。

その際、 stream_results=True の設定を行うと、 select から 2,3 分ほど経った段階で、

> Lost connection to server during query

のエラーが発生し、 select が途中で中断してしまいます。なお、 stream_results=True
を付与しなければ、この問題は発生しませんでした。

<https://dev.mysql.com/doc/refman/8.0/en/error-lost-connection.html>

上記ページをみてみても、

  1. `net_read_timeout` => 3600 にしたけど、 2,3分で例外発生
  2. `connection_timeout` => 最初の何件かは select できていることを確認したので、 establish connection まわりの例外ではなさそう
  3. `max_allowed_packet` => MySQL Workbench で、個別に例外が発生したタイミングで select していたレコードたちを個別で select してみると、問題なく select できる

であり、解決に至っていません。

# 質問

  * 何が原因で、この問題は発生していますか？


CC BY-SA 4.0
2019-08-31T04:33:59.850
57728
2019-08-31T04:37:07.083
2019-08-31T04:37:07.083
754
754
question
mysql sqlalchemy pymysql
sqlalchemy + pymysql にて、 stream_results=True にしたら Lost connection to server during query が出た時の対処方法


この問題は、 `net_write_timeout` の上限にひっかかっていた様子です。

`net_write_timeout` は、 MySQL
サーバーが通信の際にソケットに対して送信内容を読み書きしますが、その書き込みの際の、ブロック時間の上限を定めている様子です。

今回、大量のデータを `stream_results=True` しながら、データ取得と同時にもろもろの処理を随時行なっていたので、ブロックが発生するのは
MySQL サーバーの書き込み側になっていた様子です。

`net_write_timeout` を 3600 にしたところ、問題は解消しました。


CC BY-SA 4.0
2019-08-31T04:36:45.853
57729
2019-08-31T04:36:45.853
754
57728
answer