はじまりは @uessy_akrさん のツイート。
mysqlの接続がおかしい…— うえしー (@uessy_akr) 2017年8月10日
ログインしてすぐ SHOW TABLES; とかすると MySQL server has gone away って言われ、
connect; したら接続回復するんだけども…
初めて遭遇した。なんなんだこれは…(´;ω;`)
“MySQL Server has gone away” はクライアント側のエラー
CR_SERVER_GONE_ERROR
で、「クライアントは接続張りっぱなしのつもりなのに次のクエリーを投げたら実はサーバー側から接続を切られていた」時に出るエラー。
よって原因になり得るのは
- タイムアウトが非常に短く設定されていて、クエリーの間隔がサーバー側タイムアウトに引っかかっている
- パラメーターがちょっとややこしくて、この記事がとても丁寧
- ちなみに「wait_timeoutはアイドル時間の累積」は都市伝説で、単純にクエリーとクエリーの間の時間です
- 非常に短い間隔でmysqldがダウンしている
- サーバープロセスがクラッシュすれば当然、接続していたコネクションは破棄されるから。
- で、mysqld_safeがすぐにmysqldを再起動するので直後の接続は成功して、またクラッシュするやーつ。
- 地雷erにはこっちの方が馴染みがある。。
SHOW STATUS LIKE 'uptime'
やps
でmysqldの起動時刻を見たり、エラーログを見たりするのもいい。
- サーバープロセスがクラッシュすれば当然、接続していたコネクションは破棄されるから。
- ネットワークなどに問題があり、しょっちゅう接続が(中間のどこかで)プチプチ切れている
- 体験したことないけど可能性としては一応
あたり。
で、なんかどうもどうやら
I hit a bug on mysql? (´・ω・`) pic.twitter.com/QWvCNYsLWN— うえしー (@uessy_akr) 2017年8月10日
mysqldが毎回クラッシュしている方のケースだったらしい。。
signal 6
は SIGABRT
で、MySQL内部のAssertに引っかかるとこれで落ちる。 ちなみに This could be because you hit a bug.
は単なる(?)決まり文句で必ず言われるのであんまり関係ない。 体感で一番起きやすいのはInnoDBのページ破損でAssertに引っかかって食らうことが多い印象。
どうやら大正解だったっぽい。
な…なるほど。— うえしー (@uessy_akr) 2017年8月10日
確かに、ログに「InnoDB: Database page corruption on disk or a failed」って出てたのを見付けました。
こんなこともあるんですね…
yokuさん、色々とアドバイスをありがとうございます…!!助かりました??
バックアップがある場合はそこから切り戻すのが一番手っ取り早いし、それができない(最新の状態が壊れたところにしかないとか)場合は
innodb_force_recovery
を駆使して無理矢理データを引っこ抜くしかない。
この手順はここが丁寧(クラッシュしてるわけじゃないからちょっと状況は違うけど、「解決策 - I. InnoDB の修復」が修復方法に当たる)
( ´-`).oO(あれ、他所へのリンクを貼りまくってるだけの記事になってしまった…