web-dev-qa-db-ja.com

mysqlはdebian起動(systemd)で起動に失敗しますが、手動で起動することはできます

Debian(Jessie)サーバー上のMySQLに奇妙な問題があります。

サーバーを再起動すると、systemdはmysqldを起動しようとしますが、失敗します(ポート3306はすでに使用されているように見えますが、なぜそうなるのかわかりません)。

ただし、ほんの数分後にサーバーにSSHで接続し、Sudo systemctl start mysqlを実行すると、成功します。

この問題は、サーバーを再起動するたびに再現される可能性があります。

誰かがすでにこの問題を抱えていましたか、それともMySQLが正しく起動するのを妨げる可能性があると思いますか?再起動後にMySQLを起動する前に遅延を追加することはできますが、何が起こっているのかを理解したいので、実際にはそれで問題が解決するかどうかさえわかりません。

再起動後のSudo systemctl status mysql -lの結果は次のとおりです。

● mysql.service - LSB: Start and stop the mysql database server daemon
   Loaded: loaded (/etc/init.d/mysql)
   Active: failed (Result: exit-code) since Fri 2017-09-01 21:54:44 CEST; 1min 41s ago
  Process: 581 ExecStart=/etc/init.d/mysql start (code=exited, status=1/FAILURE)

Sep 01 21:54:06 gimli systemd[1]: Starting LSB: Start and stop the mysql database server daemon...
Sep 01 21:54:44 gimli mysql[581]: Starting MySQL database server: mysqld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . failed!
Sep 01 21:54:44 gimli systemd[1]: mysql.service: control process exited, code=exited status=1
Sep 01 21:54:44 gimli systemd[1]: Failed to start LSB: Start and stop the mysql database server daemon.
Sep 01 21:54:44 gimli systemd[1]: Unit mysql.service entered failed state.

および/var/log/mysql/error.logからの対応するログ

170901 21:54:16 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
170901 21:54:16 [Note] Plugin 'FEDERATED' is disabled.
170901 21:54:17 InnoDB: The InnoDB memory heap is disabled
170901 21:54:17 InnoDB: Mutexes and rw_locks use GCC atomic builtins
170901 21:54:17 InnoDB: Compressed tables use zlib 1.2.8
170901 21:54:17 InnoDB: Using Linux native AIO
170901 21:54:17 InnoDB: Initializing buffer pool, size = 128.0M
170901 21:54:17 InnoDB: Completed initialization of buffer pool
170901 21:54:17 InnoDB: highest supported file format is Barracuda.
170901 21:54:22  InnoDB: Waiting for the background threads to start
170901 21:54:23 InnoDB: 5.5.57 started; log sequence number 351234412
170901 21:54:23 [Note] Server hostname (bind-address): '192.168.1.14'; port: 3306
170901 21:54:23 [Note]   - '192.168.1.14' resolves to '192.168.1.14';
170901 21:54:23 [Note] Server socket created on IP: '192.168.1.14'.
170901 21:54:23 [ERROR] Can't start server: Bind on TCP/IP port: Cannot assign requested address
170901 21:54:23 [ERROR] Do you already have another mysqld server running on port: 3306 ?
170901 21:54:23 [ERROR] Aborting

170901 21:54:23  InnoDB: Starting shutdown...
170901 21:54:24  InnoDB: Shutdown completed; log sequence number 351234412
170901 21:54:24 [Note] /usr/sbin/mysqld: Shutdown complete

ただし、Sudo systemctl start mysqlを手動で実行すると、正しく機能します。

170901 22:01:36 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
170901 22:01:36 [Note] Plugin 'FEDERATED' is disabled.
170901 22:01:36 InnoDB: The InnoDB memory heap is disabled
170901 22:01:36 InnoDB: Mutexes and rw_locks use GCC atomic builtins
170901 22:01:36 InnoDB: Compressed tables use zlib 1.2.8
170901 22:01:36 InnoDB: Using Linux native AIO
170901 22:01:36 InnoDB: Initializing buffer pool, size = 128.0M
170901 22:01:36 InnoDB: Completed initialization of buffer pool
170901 22:01:36 InnoDB: highest supported file format is Barracuda.
170901 22:01:36  InnoDB: Waiting for the background threads to start
170901 22:01:37 InnoDB: 5.5.57 started; log sequence number 351234412
170901 22:01:37 [Note] Server hostname (bind-address): '192.168.1.14'; port: 3306
170901 22:01:37 [Note]   - '192.168.1.14' resolves to '192.168.1.14';
170901 22:01:37 [Note] Server socket created on IP: '192.168.1.14'.
170901 22:01:37 [Note] Event Scheduler: Loaded 0 events
170901 22:01:37 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.57-0+deb8u1'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  (Debian)

私の知る限り、systemdスクリプトは変更されておらず(Debian mysqlパッケージに付属しているものです)、私が知る限り、正しく機能することはありませんでした。 3306ポートは、別のプロセスによって使用されることは想定されていません。

2
youen

どうやら問題は、mysqlの起動時にネットワークインターフェイスが起動していなかったことでした。これはおそらくDHCPに少し時間がかかることに関係しています。

少なくとも、インターフェイスを静的IPに設定したので、mysqlの問題はもう観察されません(ここでも、すべての起動で再現可能です)。これで問題は解決しました。

Debianに静的IPを設定する手順は次のとおりです。

  1. Ssh機能を失う可能性があるため、ネットワークを混乱させる前に、サーバー(電源ボタン、キーボード、画面)に物理的にアクセスできることを確認してください。
  2. / etc/network/interfacesを編集します
  3. iface eth0 inet dhcpを次のように置き換えます。

    iface eth0 inet static
        address 192.168.1.14
        network 192.168.1.0
        netmask 255.255.255.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
    
  4. 再起動(注:たとえばsystemctl restart networkingを使用すると、ネットワークを再起動するだけで十分ですが、私の場合、接続が失われましたが、電源ボタンでサーバーを再起動しないと再接続できませんでした)

この例では、静的IP192.168.1.14とゲートウェイ192.168.1.1を割り当てます

もちろん、これは回避策にすぎません。本当の問題は、mysqlがネットワークインターフェイスが起動するのを待つ必要があるということですが、systemdがそれを行うのに十分なことはわかりません。

2
youen

再起動して実行した直後にサーバーにSSHで接続してみてくださいnetstat -lp | grep 3306 rootとして、どのプログラムがそのポートで実際にリッスンしているかを確認し、問題をさらにデバッグできるようにします。

2
Oxfist