こんにちは。
ピクトリンク事業部開発部インフラ課の粟田です。

CentOS7で表題の件に引掛ってmysqlが自動起動できない問題にあたったので解決方法のメモを記述します。

問題

まぁ、表題の通りなんですが、OSを再起動しても /var/run/mysqld ディレクトリが作成されていないので、mysql が /var/run/mysqld/mysqld.pid ファイル作成エラーで起動できませんでした。

暫定として、

していたのを根本的に修正したいな、と調査しました。

調査

ここでWebサイトを調査してみると、

systemdでサービスを動かす際、/var/runにディレクトリを作った時の落とし穴と対策

お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ

の様な記事が見つかったので対応できそうかなと進めてみました。

検証

/etc/tmpfiles.d にファイルを作成するとディレクトリが作れる、という事だったので作成して再起動を実施してみました。

再起動してから

できてないじゃないですか……

/etc/tmpfiles.d のファイルを参照するプロセスを確認してみると、 systemd-tmpfiles ってのが見つかりました。

引数見て実行してみると、

できてる……

systemd-tmpfiles がどこから呼ばれているのかを調べてみると、/usr/lib/systemd/system/systemd-tmpfiles-setup.service を見つけました。

早速ステータスを確認してみます。

エラーですやん。

さらに、このプログラムを調べてみると、/usr/lib/tmpfiles.d を参照する様なので見てみる。

あれ、既にある……

エラーを調査するべく sudo journalctl -u systemd-tmpfiles-setup.service を実行。

mysql ユーザが LDAP に定義されていて、ネットワーク起動前に systemd-tmpfiles-setup が実行されるから起動できないんだろうと推測しました。

そこで、mysql ユーザでないユーザで /var/run/mysqld を作ってみます。

再起動してから

ちゃんとできてる!

ここまでで根本解決として以下のものを想定しました。

  1. /var/run/mysql を root で作って起動時に mysql に uid/gid を設定する
  2. mysql 起動直前に /usr/bin/systemd-tmpfiles –create を実行する
  3. pid ファイルの出力位置を変更する
  4. ホストのローカルに LDAP に定義してるuid/gid で mysql ユーザを作成してしまう

実際には1、2、3どの方法でも解決するのは確認しました。
4は未検証です。
LDAP 認証できない様にサーバ起動してユーザ作成するのとかが面倒だったので……

解決

先に提案した中で、1番を選択する事にしました。
理由として、

  • 2番を選択したら systemctl status systemd-tmpfiles-setup で常にエラーになってるのがなんかイヤ
    • プロセス起動のたびに create 呼ばれるのは chown 呼ぶより気色悪いし
  • 3番は /etc/my.cnf を変更したのに pid ファイルの出力先が変らない、と大騒ぎする人がいたのでいじりたくないな
  • どうせどれを選択しても /usr/lib/systemd/system/mysqld.service は編集しないといけないし(4は除く)

を思うと他の人に手順を説明しやすいのは1番かな、と。

これで mysql が自動起動できる様になりました。

あとがき

systemd-tmpfiles-setup と LDAP 相性よろしくないのかも……
他にも記事をいくつか見つけたし。