MongoDBが突然、起動できなくなりました。なんで?
調べてみるとアホなことしてる。コマンド名を間違えて実行してしまいテンポラリファイルのパーミッションが変わってた。
このコマンド名がややこしい。systemdのサービス名と同じにしたら間違えることあるでしょ?
MongoDB | 4.2.8 |
CentOS | 7.8.2003 |
急にMongoDBが起動できなくなりました。こんなエラーが出ます。
systemctl start mongod
Job for mongod.service failed because the control process exited with error code. See "systemctl status mongod.service" and "journalctl -xe" for details.
ジャーナルログを見ろってか? よし、見てみよう。
6月 17 19:39:01 *** polkitd[630]: Registered Authentication Agent for unix-process:1939:135986 (system bus name :1.31 [/usr/bin/pkttyagent --no
6月 17 19:39:01 *** systemd[1]: Starting MongoDB Database Server...
-- Subject: Unit mongod.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit mongod.service has begun starting up.
6月 17 19:39:01 *** mongod[1950]: about to fork child process, waiting until server is ready for connections.
6月 17 19:39:01 *** mongod[1950]: forked process: 1953
6月 17 19:39:01 *** mongod[1950]: ERROR: child process failed, exited with error number 14
6月 17 19:39:01 *** mongod[1950]: To see additional information in this output, start without the "--fork" option.
6月 17 19:39:01 *** systemd[1]: mongod.service: control process exited, code=exited status=14
6月 17 19:39:01 *** systemd[1]: Failed to start MongoDB Database Server.
-- Subject: Unit mongod.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit mongod.service has failed.
--
-- The result is failed.
6月 17 19:39:01 *** systemd[1]: Unit mongod.service entered failed state.
6月 17 19:39:01 *** systemd[1]: mongod.service failed.
『子プロセスがエラー』『--forkオプションなしで起動してみろ』
ログファイルを見てみた。
2020-06-17T19:39:01.042+0900 I CONTROL [main] ***** SERVER RESTARTED *****
2020-06-17T19:39:01.046+0900 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2020-06-17T19:39:01.055+0900 W ASIO [main] No TransportLayer configured during NetworkInterface startup
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] MongoDB starting : pid=1953 port=27017 dbpath=/var/lib/mongo 64-bit host=***
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] db version v4.2.8
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] git version: 43d25964249164d76d5e04dd6cf38f6111e21f5f
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] allocator: tcmalloc
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] modules: none
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] build environment:
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] distmod: rhel70
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] distarch: x86_64
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] target_arch: x86_64
2020-06-17T19:39:01.055+0900 I CONTROL [initandlisten] options: { config: "/etc/mongod.conf", net: { bindIp: "127.0.0.1", port: 27017 }, processManagement: { fork: true, pidFilePath: "/var/run/mongodb/mongod.pid", timeZoneInfo: "/usr/share/zoneinfo" }, security: { authorization: "enabled" }, storage: { dbPath: "/var/lib/mongo", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log" } }
2020-06-17T19:39:01.055+0900 E NETWORK [initandlisten] Failed to unlink socket file /tmp/mongodb-27017.sock Operation not permitted
2020-06-17T19:39:01.055+0900 F - [initandlisten] Fatal Assertion 40486 at src/mongo/transport/transport_layer_asio.cpp 684
2020-06-17T19:39:01.055+0900 F - [initandlisten]
***aborting after fassert() failure
あった。こいつだ。
Failed to unlink socket file /tmp/mongodb-27017.sock Operation not permitted
srwx------ 1 root root 0 6月 17 19:26 mongodb-27017.sock
rootユーザーが作ってる。そういえば、rootユーザでmongoコマンドと間違えて『mongod』って打った。
(mongoコマンドはクライアントツール起動のコマンド。)
ソケットファイルを退避してもう1回起動。
cd /tmp
mv mongodb-27017.sock mongodb-27017.sock.bak
systemctl start mongod
systemctl status mongod
● mongod.service - MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
Active: active (running) since 水 2020-06-17 19:58:21 JST; 1min 20s ago
Docs: https://docs.mongodb.org/manual
Process: 2146 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=0/SUCCESS)
Process: 2143 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 2141 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 2139 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)
Main PID: 2148 (mongod)
CGroup: /system.slice/mongod.service
mq2148 /usr/bin/mongod -f /etc/mongod.conf
6月 17 19:58:20 *** systemd[1]: Starting MongoDB Database Server...
6月 17 19:58:20 *** mongod[2146]: about to fork child process, waiting until server is ready for connections.
6月 17 19:58:20 *** mongod[2146]: forked process: 2148
6月 17 19:58:21 *** systemd[1]: Started MongoDB Database Server.
うん、直った。
ちなみに、ソケットファイルの権限はmongodユーザー。
srwx------ 1 root root 0 6月 17 19:26 mongodb-27017.sock.bak
srwx------ 1 mongod mongod 0 6月 17 19:58 mongodb-27017.sock
mongodは、サービス名だけでなくサービス起動コマンド名にもなっていて、いらぬ間違いを犯してroot権限でファイルを作ってしまったというオチ。
ダサい...。あーダサい。もう一回言っとこう。だっせ~。
こんな間違いやってはいけませんという話でした。
MongoDBはsystemctlに登録されているサービスなので、サービスのステータス(systemctl status)、ジャーナル(journalctl -ex)、サービスのログファイルを見れば、解決のヒントがある。