インフラ苦手人間がサーバーと格闘していた件の備忘録。
巻き込んでしまった皆さまには申し訳なさと感謝でいっぱいです。
環境
・OS: RedHat Linux 8.2
・DB: MySQL 5.7
事象
①mysqlとSSH接続してデータ投入していたところ、以下のエラーが発生し接続が切れた
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
②その後mysqlの再起動を図るも、起動コマンド入力・認証後に下記エラーが発生し、再起動ができなかった
Job for mysqld.service failed because the control process exited with error code
結論
サーバー内の容量を使いきっていた
詳しい経緯(戒めとして)
事象までの経緯
・前日から、保守環境DBにてテスト用データ増幅作業を行っていた
・当日もそれを続けており、ストアドプロシージャを1つ実行していた
⇒上記ストアドプロシージャが1時間たっても完了せず(statusはquery end)、やむなく対象プロセスをkill
⇒直後に事象①が発生
・その後mysqlを再起動しようとservice mysqld startを実行
⇒事象②により再起動に失敗
やってみたこと
・ログチェック
⇒プロセスをkillした前後の処理はログに乗っているものの、以下の通り突然ログが切れた状態になっており、
その後の起動試行についてはログ出力されていなかった
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.
[Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
[Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
[Warning] Can't create test file <サーバー内パスのため省略>lower-test
[Note] <サーバー内パスのため省略>/mysqld (mysqld 5.7.37-log) starting as process 2498395 ...
<日時割愛>T10:49:15.333721+09:0 //ここでログが途切れる
⇒「なんかクラッシュしたらしい...」ということしか読み取れず、先輩およびインフラエンジニアの方に泣きつく
⇒上記結論に至る
振り返ってみると
冷静になって考えてみると、結構ヒントはありました。
前日から、保守環境DBにてテスト用データ増幅作業を行っていた
⇒ごりごりにINSERT SELECTを繰り返していたのだから、一番最初に容量を疑うべきだったのでは...?
上記ストアドプロシージャが1時間たっても完了せず(statusはquery end)
⇒特にここ。
これまで何回も繰り返していたストアドプロシージャが、突然完了しなくなった理由を考えるべきだったのではないか。
プロセスをkillした前後の処理はログに乗っているものの、以下の通り突然ログが切れた状態になっており、
⇒その当時は「???」だったが、容量を使いきってログさえも書き込めなくなったということであれば納得がいく
教訓
・データ投入をする場合、以下の2つをあらかじめ確認しておくこと
①投入しようとしているデータ量
②DBサーバーの残りのデータ量( df -h などを使うと良い)
・データ投入中もこまめにサーバー内の空き容量をチェックすること
・普段からLinuxのコマンドは勉強しておくこと
(知識があまりに浅いのでログの確認にすら四苦八苦した。その分だけ解決が遅くなったことは反省すべき)
最後に
丸一日胃をきりきりさせながら調べてたんですが、インフラエンジニアの方が一瞬で解決してくださいました。
やっぱり専門家は偉大。憧れますね。勉強します。