更改 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

这就是全部内容。

广告
将在 10 秒后关闭
bannerAds