ローカルにインストールしていたMySQLを久々に触る機会があったのですが、パッケージマネージャ経由であれこれしていたところ起動しなくなってしまいました。
$ mysql -v
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
どうやらmysql-serverとの通信に使用するソケットファイルにアクセス出来ていないようです。
結論
MySQLの状態を初期化し、 ‘/var/lib’ 下の関連するファイルの所有者を正しく設定する必要がありました。
$ sudo mysqld --initialize
$ sudo mkdir /var/lib/mysql-files
$ sudo chown mysql:mysql /var/lib/mysql-files
$ sudo chown -R mysql:mysql /var/lib/mysql
初期化後にrootログインするためのパスワードは、1行目のコマンドを実行した際にランダムに生成されます。コンソールに出力されるので忘れずに確認しましょう。
顛末
気合でログを追う。
さて、まずはデーモンの状態を確認してみます。
$ sudo systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2019-07-28 03:00:15 JST; 5s ago
Process: 13034 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=1/FAILURE)
7月 28 03:00:15 ThinkPad systemd[1]: mysql.service: Service hold-off time over, scheduling restart.
7月 28 03:00:15 ThinkPad systemd[1]: mysql.service: Scheduled restart job, restart counter is at 5.
7月 28 03:00:15 ThinkPad systemd[1]: Stopped MySQL Community Server.
7月 28 03:00:15 ThinkPad systemd[1]: mysql.service: Start request repeated too quickly.
7月 28 03:00:15 ThinkPad systemd[1]: mysql.service: Failed with result 'exit-code'.
7月 28 03:00:15 ThinkPad systemd[1]: Failed to start MySQL Community Server.
何やら起動に失敗していますね。
mysqldが起動していなければソケットファイルは存在しないので、これが先程のエラーの原因のようです。
ところで、$systemctl statusで表示されるログは粒度が荒く、何が原因なのかよく分かりません。
11行目に‘exit-code’と書かれており、これを返したプロセスの情報が分かれば良さそうです。
幸い、これは5行目に書かれています。
Process: 13034 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=1/FAILURE)
直接 $/usr/share/mysql/mysql-systemd-start pre を実行してみれば良さそうです。
$ /usr/share/mysql/mysql-systemd-start pre
MySQL system database not found in /var/lib/mysql. Please run mysqld --initialize.
データベースが存在しないらしいです($apt purgeしたから…?)。
言われたとおりに初期化してみます。
$ sudo mysqld --initialize
2019-07-27T18:01:10.547310Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-07-27T18:01:10.866872Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-07-27T18:01:10.941214Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-07-27T18:01:11.007602Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: <略>.
2019-07-27T18:01:11.011673Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-07-27T18:01:11.012839Z 1 [Note] A temporary password is generated for root@localhost: <rootのパスワード>
Warningが出ていますが、よしなにやってくれたと信じて起動します。
$ sudo systemctl start mysql
Job for mysql.service failed because the control process exited with error code.
See "systemctl status mysql.service" and "journalctl -xe" for details.
起動しません…
$ sudo systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2019-07-28 03:01:28 JST; 3s ago
Process: 13270 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=1/FAILURE)
7月 28 03:01:28 ThinkPad systemd[1]: mysql.service: Service hold-off time over, scheduling restart.
7月 28 03:01:28 ThinkPad systemd[1]: mysql.service: Scheduled restart job, restart counter is at 5.
7月 28 03:01:28 ThinkPad systemd[1]: Stopped MySQL Community Server.
7月 28 03:01:28 ThinkPad systemd[1]: mysql.service: Start request repeated too quickly.
7月 28 03:01:28 ThinkPad systemd[1]: mysql.service: Failed with result 'exit-code'.
7月 28 03:01:28 ThinkPad systemd[1]: Failed to start MySQL Community Server.
また同じコマンドでエラーが出ていますね。実行してみます。
$ /usr/share/mysql/mysql-systemd-start pre
ERROR: Unable to start MySQL server:
mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)
2019-07-27T18:01:38.847319Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000)
2019-07-27T18:01:38.847426Z 0 [Warning] Changed limits: table_open_cache: 431 (requested 2000)
2019-07-27T18:01:38.847832Z 0 [ERROR] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files
2019-07-27T18:01:38.853230Z 0 [ERROR] Aborting
Please take a look at https://wiki.debian.org/Teams/MySQL/FAQ for tips on fixing common upgrade issues.
Once the problem is resolved, restart the service.
内容が変わっています。
realpath() として設定されている ‘/var/lib/mysql-files’ が存在しないようです。
作りましょう。
$ sudo mkdir /var/lib/mysql-files
$ sudo chown mysql:mysql /var/lib/mysql-files
再度実行してみます。
$ /usr/share/mysql/mysql-systemd-start pre
すんなり通りました。やったか!?
$ sudo systemctl start mysql
Job for mysql.service failed because the control process exited with error code.
See "systemctl status mysql.service" and "journalctl -xe" for details.
ダメでした。状態を見てみます。
$ sudo systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: activating (start-pre) since Sun 2019-07-28 03:02:59 JST; 8ms ago
Process: 13535 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code=exited, status=1/FAILURE)
Cntrl PID: 13565 (mysql-systemd-s)
Tasks: 0 (limit: 4915)
CGroup: /system.slice/mysql.service
└─13565 /bin/bash /usr/share/mysql/mysql-systemd-start pre
7月 28 03:02:59 ThinkPad systemd[1]: Starting MySQL Community Server...
先程はExecStartPreに設定されているコマンドでエラーが出ていましたが、次はExecStartに設定されているコマンドでエラーが出ています。
同様に直接実行してみます。
$ /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
Please enable --log-error option or set appropriate redirections for standard output and/or standard error in daemon mode.
$ /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid --log-error
2019-07-27T18:04:00.729323Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000)
2019-07-27T18:04:00.729466Z 0 [Warning] Changed limits: table_open_cache: 431 (requested 2000)
2019-07-27T18:04:00.880432Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-07-27T18:04:00.880487Z 0 [Warning] Can't create test file /var/lib/mysql/ThinkPad.lower-test
2019-07-27T18:04:00.880496Z 0 [Warning] Insecure configuration for --secure-file-priv: Location is accessible to all OS users. Consider choosing a different directory.
2019-07-27T18:04:00.880511Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.27-0ubuntu0.18.04.1) starting as process 13629 ...
2019-07-27T18:04:00.882355Z 0 [Warning] Can't create test file /var/lib/mysql/ThinkPad.lower-test
2019-07-27T18:04:00.882366Z 0 [Warning] Can't create test file /var/lib/mysql/ThinkPad.lower-test
2019-07-27T18:04:00.882591Z 0 [ERROR] Could not open file '/run/mysqld/mysqld.err' for error logging: No such file or directory
2019-07-27T18:04:00.882610Z 0 [ERROR] Aborting
2019-07-27T18:04:00.882630Z 0 [Note] Binlog end
Initialization of mysqld failed: 0
2019-07-27T18:04:00.882672Z 0 [Note] /usr/sbin/mysqld: Shutdown complete
色々なWarningが出ていますが、7行目が怪しくみえます。
2019-07-27T18:04:00.880487Z 0 [Warning] Can't create test file /var/lib/mysql/ThinkPad.lower-test
‘/var/lib/mysql‘ を確認してみます。
$ ls -la /var/lib/mysql
total 110628
drwxr-xr-x 5 mysql mysql 4096 7月 28 03:02 .
drwxr-xr-x 88 root root 4096 7月 28 03:02 ..
-rw-r----- 1 root root 56 7月 28 03:01 auto.cnf
-rw-r----- 1 root root 424 7月 28 03:01 ib_buffer_pool
-rw-r----- 1 root root 12582912 7月 28 03:01 ibdata1
-rw-r----- 1 root root 50331648 7月 28 03:01 ib_logfile0
-rw-r----- 1 root root 50331648 7月 28 03:01 ib_logfile1
drwxr-x--- 2 root root 4096 7月 28 03:01 mysql
drwxr-x--- 2 root root 4096 7月 28 03:01 performance_schema
drwxr-x--- 2 root root 12288 7月 28 03:01 sys
ファイルやディレクトリの所有者がrootになっていますね。これを変更すれば良さそうです。
$ sudo chown -R mysql:mysql /var/lib/mysql
$ ls -la /var/lib/mysql/
total 122916
drwxr-xr-x 5 mysql mysql 4096 7月 28 03:47 .
drwxr-xr-x 88 root root 4096 7月 28 03:02 ..
-rw-r----- 1 mysql mysql 56 7月 28 03:01 auto.cnf
-rw-r----- 1 mysql mysql 351 7月 28 03:18 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 7月 28 03:47 ibdata1
-rw-r----- 1 mysql mysql 50331648 7月 28 03:47 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 7月 28 03:01 ib_logfile1
drwxr-x--- 2 mysql mysql 4096 7月 28 03:01 mysql
drwxr-x--- 2 mysql mysql 4096 7月 28 03:01 performance_schema
drwxr-x--- 2 mysql mysql 12288 7月 28 03:01 sys
さて、再度実行してみます。
$ /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid --log-error
2019-07-27T18:05:21`.729323Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000)
2019-07-27T18:05:21`.729466Z 0 [Warning] Changed limits: table_open_cache: 431 (requested 2000)
2019-07-27T18:05:21`.880432Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-07-27T18:05:21`.880487Z 0 [Warning] Can't create test file /var/lib/mysql/ThinkPad.lower-test
2019-07-27T18:05:21`.880496Z 0 [Warning] Insecure configuration for --secure-file-priv: Location is accessible to all OS users. Consider choosing a different directory.
2019-07-27T18:05:21`.880511Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.27-0ubuntu0.18.04.1) starting as process 13629 ...
2019-07-27T18:05:21`.882355Z 0 [Warning] Can't create test file /var/lib/mysql/ThinkPad.lower-test
2019-07-27T18:05:21`.882366Z 0 [Warning] Can't create test file /var/lib/mysql/ThinkPad.lower-test
2019-07-27T18:05:21`.882591Z 0 [ERROR] Could not open file '/run/mysqld/mysqld.err' for error logging: No such file or directory
2019-07-27T18:05:21`.882610Z 0 [ERROR] Aborting
2019-07-27T18:05:21`.882630Z 0 [Note] Binlog end
Initialization of mysqld failed: 0
2019-07-27T18:05:21`.882672Z 0 [Note] /usr/sbin/mysqld: Shutdown complete
あれ…変わってない…
あ、これは管理者権限が必要ですね。
$ sudo /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid --log-error
2019-07-27T18:05:39.416098Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-07-27T18:05:39.417188Z 0 [Warning] Insecure configuration for --secure-file-priv: Location is accessible to all OS users. Consider choosing a different directory.
2019-07-27T18:05:39.417216Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.27-0ubuntu0.18.04.1) starting as process 16339 ...
2019-07-27T18:05:39.418220Z 0 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
2019-07-27T18:05:39.418238Z 0 [ERROR] Aborting
2019-07-27T18:05:39.418259Z 0 [Note] Binlog end
Initialization of mysqld failed: 0
2019-07-27T18:05:39.418302Z 0 [Note] /usr/sbin/mysqld: Shutdown complete
どうなんでしょう…エラーが出ていますが…。
試しにデーモンの起動を行ってみます。
$ sudo systemctl start mysql
$ sudo systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2019-07-28 03:06:07 JST; 7s ago
Process: 13722 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
Process: 13696 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 13724 (mysqld)
Tasks: 27 (limit: 4915)
CGroup: /system.slice/mysql.service
└─13724 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
7月 28 03:06:07 ThinkPad mysqld[13722]: 2019-07-27T18:06:07.068534Z 0 [Note] InnoDB: Buffer pool(s) load completed at 190728 3:06:07
7月 28 03:06:07 ThinkPad mysqld[13722]: 2019-07-27T18:06:07.077511Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and priva
7月 28 03:06:07 ThinkPad mysqld[13722]: 2019-07-27T18:06:07.078509Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
7月 28 03:06:07 ThinkPad mysqld[13722]: 2019-07-27T18:06:07.078569Z 0 [Note] IPv6 is available.
7月 28 03:06:07 ThinkPad mysqld[13722]: 2019-07-27T18:06:07.078581Z 0 [Note] - '::' resolves to '::';
7月 28 03:06:07 ThinkPad mysqld[13722]: 2019-07-27T18:06:07.078608Z 0 [Note] Server socket created on IP: '::'.
7月 28 03:06:07 ThinkPad mysqld[13722]: 2019-07-27T18:06:07.096346Z 0 [Note] Event Scheduler: Loaded 0 events
7月 28 03:06:07 ThinkPad mysqld[13722]: 2019-07-27T18:06:07.096663Z 0 [Note] /usr/sbin/mysqld: ready for connections.
7月 28 03:06:07 ThinkPad mysqld[13722]: Version: '5.7.27-0ubuntu0.18.04.1' socket: '/var/run/mysqld/mysqld.sock' port: 3306 (Ubuntu)
7月 28 03:06:07 ThinkPad systemd[1]: Started MySQL Community Server.
動きました(え…)。
たまたまですが、 ‘/var/lib/mysql’ の所有者が正しくなかったのが原因だったようです。