PowerCMS X ブログ

2025-12-23

リストア時に「2006:MySQL server has gone away」で詰まった話

大容量の SQL ダンプを MySQL にリストアする際、苦戦しました。

ログの重要性をあらためて再認識した話です。

リストア中に発生したエラー

SQL ファイルを mysql コマンドでリストアしていたところ、途中で以下のエラーが発生しました。

ERROR 2006 (HY000) at line 29669: MySQL server has gone away

一見すると「接続が切れた」ということしか分からず、何が原因なのか見当がつかない状態でした。

ネットで調べると原因候補が多かった

エラーメッセージをそのまま検索すると、次のような原因が挙げられていました。

  • MySQL がクライアントの接続をタイムアウトした
  • 非常に大きなクエリやデータ(BLOB など)を送信し、パケットサイズ制限を超えた
  • 不正または不完全な SQL 文を送信した
  • MySQL サーバーが再起動・クラッシュした

どれも あり得そうではあるものの、「今回はどれが該当するのか」「どの対策を取るべきなのか」が分からず、1つずつ設定を見直していくかと考えていました。

ログはあるのか

MySQL 自身のログを見れば原因がわかりそうと思ったものの、普段、障害調査を行う際には PHP のエラーログや Apache(httpd) のログを確認することが多く、データベースに関連するログを確認した経験はありませんでした。

調べてみると my.cnf にログの出力先が記載されていることが分かり、実際に確認すると以下の設定がありました。

log-error=/var/log/mysqld.log

mysqld.log を確認

ログを確認すると、以下のエラーが出力されていました。

Got a packet bigger than 'max_allowed_packet' bytes

リストア中に送信された SQL が max_allowed_packet の上限を超えていたのだと分かりました。

max_allowed_packet を設定して解消

SET GLOBAL max_allowed_packet = 1073741824; だと再起動時に元の設定に戻ってしまうため、恒久設定として my.cnf に追記することにしました。(再起動を避けたいが設定は変更したい場合、SET GLOBAL でもよいかもしれません)

[mysqld]
max_allowed_packet=1024M

設定後、MySQL を再起動

systemctl restart mysqld

その後、再度リストアを実行したところ、エラーは発生せず、無事にリストアが完了しました。

 

ログの確認って大切だなとあらためて感じました。

カテゴリー:トラブルシューティング

投稿者:Matsuoka

ブログ内検索

アーカイブ


日本語
ふりがな付き
English
简体中文
繁體中文
한국어