【MySQL】タイムアウト時に起こるserver has gone awayの回避方法についての解説
  • facebookページ
  • twitterページ
  • 2020.01.31

    【MySQL】タイムアウト時に起こるserver has gone awayの回避方法についての解説

    MySQLには「mysql server has gone away」という見慣れないエラーがあります。

    恐らくシステム開発に携わっていない方は見たことのないエラーではないでしょうか?

    かくいう私もまだ一度も見たことはありませんが、今回はこの珍しいエラーでもあるmysql server has gone awayについて色々と解説してみたいと思います。

    mysql server has gone awayとは

    mysql server has gone awayとはサーバーがタイムアウトして接続がクローズした場合に起きるエラーです。

    デフォルトでは無動作状態が8時間程度続くとサーバーは自動的に接続をクローズします。

    mysql server has gone awayとなる原因

    ではこのエラーは一体どのような場合に起こり得るのでしょうか?

    最も多い原因となるのは、非常に膨大な量のクエリを発行した場合です。

    これはPCの環境にも依存するのですが、あまりにも膨大な量のクエリを処理しようとすると、メモリやパケットがパンクしてしまいます。

    こうなるとフリーズ状態となるため、結果としてサーバータイムアウトとなり、このエラーが起こります。

    また別の原因としては、MySQLコネクション上で意図的に”close”を発行し、コネクションクローズさせた状態のまま新たに別のクエリを実行した場合にも同じように当エラーが返ってきます。

    通常MySQLは自動でクローズ処理を完結するため、明示的にクローズ処理をするケースは減ってきましたが、セキュリティ上の問題や開発の仕方によっては明示的にクローズを発行するため、このようなケースに陥ることがあります。

    mysql server has gone awayを防ぐ方法

    エラーとしてはあまりメジャーなものではないため必須というわけではないかもしれませんが、MySQLの学習をしていく中でエラーの回避方法は覚えておいて損はないと思います。

    ここではこの「mysql server has gone away」を回避する方法についていくつか挙げていきたいと思います。

    パケットサイズの拡張

    クエリを発行する際にあまり大きなクエリというのはないかもしれませんが、もし万が一そういったクエリを発行するケースがあるなら、まずは構成ファイル内の設定を見直す必要があります。

    構成ファイルとは「my.ini」を指します。

    この中にある”max_allowed_packet”の値を拡張することで未然に防げる場合があります。

    “max_allowed_packet”は以下の場所にあります。

    # The MySQL server
    default-character-set=utf8
    [mysqld]
    port=3306
    socket=”C:/mysql/mysql.sock”
    basedir=”C:/mysql”
    tmpdir=”C:/tmp”
    datadir=”C:/mysql/data”
    pid_file=”mysql.pid”
    # enable-named-pipe
    key_buffer=16M
    max_allowed_packet=1M
    sort_buffer_size=512K
    net_buffer_length=8K
    read_buffer_size=256K
    read_rnd_buffer_size=512K
    myisam_sort_buffer_size=8M
    log_error=”mysql_error.log”

    [mysqld]の項目内にある”max_allowed_packet”は、環境にもよりますがMySQLインストール時に変更を加えていなければ恐らくデフォルトは1Mとなっています。

    クエリ実行時に頻繁にタイムアウトやバッファオーバーフローが起こるようであれば、まずこの数値を大きくすべきです。

    目安としては20MB以上にしていれば大規模なクエリを実行した場合でも対応できると思います。

    タイムアウトの時間設定を変更する

    クエリにも問題がなく、記述ミスも見られないのになぜかタイムアウトを頻発する場合には別の対処法もあります。

    それが二つ目の対処法でもあるwait_timeoutという設定項目を追加する方法です。

    MySQLの初期設定では8時間となっているので設定を変更していないのであれば問題はありませんが、開発時に何かしらの要因で変更している可能性がある方は一度確認しても良いでしょう。

    my.iniで設定変更する場合には[mysqld]より下の行へ以下のように追記します。

    また、シェルコマンドで変更する場合には、次のように記述します。

    なお、現在の設定を調べる場合には以下のコマンドを実行すれば確認することが出来ます。

    一番下に”wait_timeout”という項目があることが確認できます。

    因みにこの例では初期設定のままなので28800秒(8時間)となっています。

    まとめ

    いかがでしたか?

    今回は”MySQL server has gone away”エラーについて原因や回避方法などを解説してみました。

    学習時に最もよくあるケースとして、PCでコマンドラインを開いた状態のまま放置しタイムアウトの設定時間を過ぎてしまい、それに気づかずそのままクエリを実行するとエラーが出るということがあります。

    まず放置しないことが一番良いのですが、どうしても何かしらの原因でコマンドラインを閉じることが出来ない場合には同じクエリを2回実行してみると2回目にはエラーが出なくなったりしますので、色々なケースを試してみましょう。

    わざとエラーを出してみるというのも勉強になりますので、そういったケースを一度経験することも大切に思います。


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!フリーエンジニアになりたい方向けのコンテンツも盛りだくさんです。

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。年収800万円以上のハイスペック転職をご希望の方は「ポテパンプロフェッショナル」もご用意しておりますのでご利用下さいませ。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料25万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテクラバナー ポテプロバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE