CentOS 7 でちょっと作業していた時に、ちょっと躓いたこと。
多分、また躓くだろうから、メモしておきます。
Rails アプリで、 Database の Socket を、 /tmp/mysql.sock
にしていたので、
MySQL ... というよりは、 MariaDB ですが、そっちの設定も
# @ /etc/my.conf [mysqld] datadir=/var/lib/mysql socket=/tmp/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid [client] socket=/tmp/mysql.sock
みたいな状態の時、クライアントを起動させようとすると...
$ mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
となってしまいます。
この時、 /tmp
は、実際に /tmp
ではなく、
/tmp/systemd-private-XXXXXX-mariadb.service-XXX/tmp/
にバインドされているため、
他のアプリやプログラムからだと、「 /tmp/mysql.sock
がない!」ということになります。
この、 /tmp/systemd-private-XXXX...
はなんぞやというと、 RHEL 7 以降にある、
「 PrivateTmp 」という新機能らしいです。
どんな機能かは、だいたい上の通りだけれども、詳しくは、 Fedora の Wiki を。
Features/ServicesPrivateTmp - FedoraProject
じゃあ、どうすればいいの?というと、 /tmp
以外を指定するか、
PrivateTmp そのものを無効にすればOK。
ただ、後者は他のアプリにも影響が出るので、 /tmp
以外を指定してみる。
ちなみに、 /var/tmp
も同様、 PrivateTmp が適用されているので注意。
# @ /etc/my.conf
[mysqld]
datadir=/var/lib/mysql
socket=/var/mysql/mysql.sock
[client]
socket=/var/mysql/mysql.sock
# @ config/database.yml default: &default socket: /var/mysql/mysql.sock
で、再起動
$ sudo systemctl restart mariadb
クライアント起動してみると...
$ mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 5.5.44-MariaDB MariaDB Server Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
できました。
ということで、 CentOS 7 で /tmp
に Socket をおいている場合はできないよというエントリでした。