MongoDBのロゴ

皆さんこんにちは、Yuap Techの竹村です。

先日、MongoDBのサーバを起動しようとしたところ、エラーを吐いてシャットダウンしてしまうことがありました。

結論からいうと、データの格納先がうまく指定できていなかったことが原因だったので、対処法をブログにまとめて置きたいと思います。

MongoDBとは

MongoDBのロゴ
まず、MongoDBについて。MongoDBはクロスプラットフォーム対応のオープンソースドキュメントDBです。

日本語でばかでかいを意味する「humongous」からきている通り、スケーラビリティが高く、データをフレキシブルなJSONライクなドキュメントデータとして保存します。

Web APIのJSONデータに柔軟に対応できるDBとして人気を集めています。

ディレクトリを作成

デフォルトでデータが置かれるpathに、ディレクトリ(/data/db/)を作成しておきましょう。

Mac OSXの場合はデフォルトのパスがdbpath=/data/dbとなっており、/data/db/ にデータが置かれるので、このディレクトリを作成して権限設定をしないとエラーが起こります。

これをせずにmongodコマンドでサーバを起動しようとすると、

exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: /data/db, terminating
~~~その他諸々~~~
shutting down with code:100

「/data/dbが読み取り専用ディレクトリだったから、lockファイルを作成しようとしたけど無理だったよー。もう終了するねー」みたいなことを言われちゃいます。

mkdir -p /data/db

まずは⇡でデータを置くディレクトリを作成しましょう。

権限設定を変更

このままでは、/data/dbディレクトリを読み書きする権限を持たないので、chmodコマンドでディレクトリの実行権限を変更します。

chmod -R 777 /data/db

これでmongodコマンドを実行すれば、デフォルトのdbpathが通り、mongodbのサーバーが起動します。

mongod
$ mongod
2018-11-09T12:11:56.114+0900 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2018-11-09T12:11:56.129+0900 I CONTROL  [initandlisten] MongoDB starting : pid=2037 port=27017 dbpath=/data/db 64-bit host=tkayanoMacBook-Pro.local
2018-11-09T12:11:56.129+0900 I CONTROL  [initandlisten] db version v4.0.3
2018-11-09T12:11:56.129+0900 I CONTROL  [initandlisten] git version: 7ea530946fa7880364d88c8d8b6026bbc9ffa48c
2018-11-09T12:11:56.129+0900 I CONTROL  [initandlisten] allocator: system
2018-11-09T12:11:56.129+0900 I CONTROL  [initandlisten] modules: none
2018-11-09T12:11:56.129+0900 I CONTROL  [initandlisten] build environment:
2018-11-09T12:11:56.129+0900 I CONTROL  [initandlisten]     distarch: x86_64
2018-11-09T12:11:56.129+0900 I CONTROL  [initandlisten]     target_arch: x86_64
2018-11-09T12:11:56.129+0900 I CONTROL  [initandlisten] options: {}
2018-11-09T12:11:56.129+0900 I STORAGE  [initandlisten] Detected data files in /data/db created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2018-11-09T12:11:56.129+0900 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=7680M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
2018-11-09T12:11:56.867+0900 I STORAGE  [initandlisten] WiredTiger message [1541733116:867792][2037:0x7fffa92df380], txn-recover: Main recovery loop: starting at 2/8832
2018-11-09T12:11:56.993+0900 I STORAGE  [initandlisten] WiredTiger message [1541733116:993807][2037:0x7fffa92df380], txn-recover: Recovering log 2 through 3
2018-11-09T12:11:57.082+0900 I STORAGE  [initandlisten] WiredTiger message [1541733117:82683][2037:0x7fffa92df380], txn-recover: Recovering log 3 through 3
2018-11-09T12:11:57.148+0900 I STORAGE  [initandlisten] WiredTiger message [1541733117:148897][2037:0x7fffa92df380], txn-recover: Set global recovery timestamp: 0
2018-11-09T12:11:57.264+0900 I RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] 
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] 
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] **          Remote systems will be unable to connect to this server. 
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] **          Start the server with --bind_ip <address> to specify which IP 
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] **          addresses it should serve responses from, or with --bind_ip_all to
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] **          bind to all interfaces. If this behavior is desired, start the
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] **          server with --bind_ip 127.0.0.1 to disable this warning.
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] 
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] 
2018-11-09T12:11:57.328+0900 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000
2018-11-09T12:11:57.380+0900 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2018-11-09T12:11:57.384+0900 I NETWORK  [initandlisten] waiting for connections on port 27017

サーバを起動できましたね。

データディレクトリの変更はdbpath指定で

データの置き場所であるディレクトリそのものを変更した場合は、mongodコマンド実行時のオプションに dbpath=/読み込みたいディレクトリ/ で実行しましょう。

mongod --dbpath=/任意のディレクトリ/

※詳細は公式ドキュメントにも書いてあるので、こちらも参考にしてみてください。

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/

PROFILE

はじめまして、大阪のWeb制作会社Yuapです。「Yuap(ユアプ)」とは英語で「あなたのプランナー」という、Your Plannerの頭文字をとった社名です。 ホームページ制作|Webシステム開発|Webコンサルティングなどの業務を通じて、みなさまの事業の成長に貢献できるようなプランナーになれるよう、日々チャレンジしております。

※お問い合わせ・お見積りは無料です。 IT|ホームページ|Webシステムのことならなんでもお気軽にご相談ください。お問い合わせはこちらから。