更改 MongoDB 的数据库路径时的故障排除
如果你尝试随意更改MongoDB的数据目录,却发现很难从journalctl -xe的消息中确定原因,而且很难获取到有力的信息,那么你可能会陷入困境。下面我将分享解决这个问题的方法。
环境
-
- MongoDB 3.4.20 または 4.0.10
- CentOS 7.5
病征
尝试更改 /etc/mongod.conf 中的 dbpath,并尝试使用 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.
查看 journalctl -xe 但是很难理解错误的原因,这真是一件麻烦事。
ERROR: child process failed, exited with error number 1
我只需要一个选择,用中文将以下内容表达得更简洁。
以下の6項目を見直す必要があります。権限は、mongod ユーザーが読み書きできるよう設定されている必要があります。
-
- mongod プロセスが残留していないか
-
- ログファイルの権限
-
- dbPathの権限
-
- dbPath内にあるファイル・ディレクトリの権限
-
- pidファイルの権限
- sockファイルを一度削除する
确认方式
确认进程
首先,我们确认一下是否还有 mongod 进程存在。
$ ps -ef | grep mongod
mongod 45246 1 0 16:06 ? 00:00:02 /usr/bin/mongod -f /etc/mongod.conf
user 45611 22414 0 16:12 pts/0 00:00:00 grep --color=auto mongo
/usr/bin/mongod -f /etc/mongod.conf の行が mongod プロセスです。
-f オプションで設定ファイルを指定して起動しています。
grep –color=auto mongo は検索結果に関わらず表示されます。
残っていた場合は kill コマンド等で終了させてから再度 mongod のスタートを試みます。
$ sudo kill -15 プロセスID
$ systemctl start mongod
查看日志文件
次にログファイルを確認出来るようにします。
デフォルトなら /var/log/mongodb/mongod.log にあるはずですが、なければ mongod.conf のpath行を確認します。
$ cat /var/log/mongodb/mongod.log
$ grep path /etc/mongod.conf
もう一度 systemctl start mongod を実行してログファイルの内容が変化するか確認します。
しないのであれば、このファイルの権限に問題がある可能性が高いです。mongod ユーザが読み書きできるよう修正します。
$ chmod 644 ファイル名
$ chown mongod ファイル名
ちなみに mongod.log の権限に問題があると systemctl ではなく mongod コマンドで実行した場合もエラーが発生します。
$ mongod --config /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 42346
ERROR: child process failed, exited with error number 1
To see additional information in this output, start without the "--fork" option.
当编辑/etc/mongod.conf并切换fork选项后,重新启动会提示日志文件权限问题。
$ sudo vi /etc/mongod.conf
fork: true
# fork: true
$ mongod --config /etc/mongod.conf
F CONTROL [main] Failed global initialization: FileNotOpen: Failed to open "/var/log/mongodb/mongod.log"
错误检查和修正
如果 `systemctl start mongod` 启动失败,则使用 `tail -n 20 mongod.log` 命令来查看日志文件。根据错误内容进行修正。以下为错误示例:
权限相关
需要重新设置Mongod用户的读写权限,以便其可以进行读写操作。
$ chmod 644 ファイル名
$ chown mongod ファイル名
- dbPathの権限
[initandlisten] exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: /var/lib/mongobk, terminating
- dbPath内にあるファイル・ディレクトリの権限
[initandlisten] Unable to read the storage engine metadata file: FileNotOpen: Failed to read metadata from /var/lib/mongobk/storage.bson
[initandlisten] WiredTiger error (13) [1559895370:747933][18875:0x7fe36a414b80], wiredtiger_open: __posix_open_file, 715: /var/lib/mongobk/WiredTiger.lock: handle-open: open: Permission denied Raw: [1559895370:747933][18875:0x7fe36a414b80], wiredtiger_open: __posix_open_file, 715: /var/lib/mongobk/WiredTiger.lock: handle-open: open: Permission denied
- pidファイルの権限
被告知无法写入 /var/run/mongodb/mongod.pid。
[main] ERROR: Cannot write pid file to /var/run/mongodb/mongod.pid: Unknown error
袜子文件相关
- sockファイルを一度削除する
在此消息中,sock文件的路径为 /tmp/mongodb-27017.sock。
E NETWORK [initandlisten] Failed to unlink socket file /tmp/mongodb-27017.sock Unknown error
WiredTiger error (1) [1559895679:626956][19170:0x7f2a81d8fb80], file:WiredTiger.wt, connection: __posix_open_file, 715: /var/lib/mongobk/WiredTiger.wt: handle-open: open: Operation not permitted Raw: [1559895679:626956][19170:0x7f2a81d8fb80], file:WiredTiger.wt, connection: __posix_open_file, 715: /var/lib/mongobk/WiredTiger.wt: handle-open: open: Operation not permitted
这就是全部内容。