MySQLが勝手に落ちる
こんばんは。 にしやまです。
大して内容がなくても積極的に記事にしていこうと思っているので雑に書いていきます。
さっきとあるサーバのシステムを動かしていたらMySQLが落ちているエラーが発生していることに気づきました。
その問題と解決までの一連の経緯を記します。
経緯
- EC2にサーバ構築(PHP8, MySQL8, Nginx)
- サービスのデプロイ(本番ではありません)
- 数時間後、MySQLがexit
- ログイン出来なくて問題発覚
問題
storage/logs/laravel-07-21.log
を見てみたところ、ログイン失敗時のログに以下のように記載されていた。
とりあえずMySQLの起動状態を確認しようと思い、状態確認。
次にsystemdのログを確認
"7月 21 03:31:55"に正常起動しているのに、"7月 21 11:14:46"にプロセスがkillされているのが気がかりですね。
11:14:46のaccess.logを確認しましたが何もありませんでした。
ともあれ問題の発生した頃のMySQLのログを確認。
"Data Dictionary initialization failed."がそれっぽいので検索。
対策1
いくつか出てきましたが、今回はMySQL 8 won't start after “Data dictionary upgrading” in log file という記事をあてにすることにしました。 その他に出てきたものは大体設定済みだったので。 追記:こちらは解決策ではないので注意
(my.cnfにdatadir
やlog-error
が設定されていないのでそれらを設定しましょうという内容が多かった)
手元のよく使っているdockerのmy.cnfや過去に設定したMySQL8系のmy.cnfを確認してみると確かに上記記事のようにutf8mb4
の記述があったので、まぁ可能性はあるかなぁと。
ただ、根本の原因(特に起動できていたのに突然exitしたあたり)はなぜか分かっていないので、もう少し様子見したいですね。
今のところは上記記事に従いmy.cnf
に追記し、以下のようにして問題なく稼働しています。(まだ数時間なのでわからないですが)
原因
原因が判明したので追記です。 本当は結構前にわかってたけど更新が遅くなってしまった。。
結論としては、このサーバーはEC2の一番小さいやつを使っていたので、メモリ容量が少なく、MySQLがメモリ圧迫して落ちていました。 また、デフォルトでswapファイルも存在しないサーバーだったこともあるようです。
対策としては、契約するサーバーのメモリを大きくする、DBサーバーを別にする、swapファイルを作成する、などあります。 今回はswapファイルを作成したのでその手順も記載します。