2055: Lost connection … , system error: 10053 が出たときの対処法 | MySQL, Python

私の場合、インサートするレコード数を分割(約20,000レコード → 5,000レコード単位で分割)することで、エラーは出なくなりました。

この記事で使用したソフトウェアのバージョンを記載しておきます。

  • Windows 10

  • MySQL 8.0

  • Python 3.7.4

  • mysql-connector-python 8.0.16

エラーが発生したケース

Python の mysql-connector-python で20,000レコードほどのインサートを試みたところ、エラーになりました。

cur.executemany(sql, values)
conn.commit()
2055: Lost connection to MySQL server at 'localhost:3306', system error: 10053 確立された接続がホスト コンピューターのソウトウェアによって中止されました。

成功したケース

Windows ソケットのエラー コード、値、および意味によると、以下のように記載されています。
そのため、インサート処理に時間がかかり過ぎていることが原因かなと。

WSAECONNABORTED (10053)
意味 : ソフトウェアによって接続が中止されました。
説明 : 確立された接続が、おそらくデータ転送のタイムアウトまたはプロトコル エラーのため、ホスト コンピュータのソフトウェアによって停止されました。

Windows ソケットのエラー コード、値、および意味

タイムアウト時間の延長も考えましたが、ウェブに適当な情報が見つかりませんでした。
そのため、一度にインサートするレコード数を減らす方針で対処することに。

以下のように、5,000レコードずつインサートしたところ、成功しました。
もう少しスマートに書きたいですね。。。

n_exe = 5000
n_rec = len(values)
if n_exe > n_rec: n_exe = n_rec
for idx in range(0, n_rec, n_exe):
    idx_next = idx + n_exe
    if idx_next > n_rec: idx_next = n_rec
    cur.executemany(sql, values[idx:idx_next])
conn.commit()

おわりに

MySQLで、2055: Lost connection … , system error: 10053 が出たときの対処法について記載しました。
今回は、インサートするレコード数の分割で対処しました。
DBには詳しくないため、もっと上手い方法があるかも知れません。
ご参考まで。

この記事が気に入ったらサポートをしてみませんか?