
最近はMongoDBを使う機会が増えてきましたね。今回は、MongoDBのユーザ権限設定と、バックアップとリストアの方法を紹介します。
見出し
はじめに
ドキュメント型のNoSQLといえばMongoDBです。MongoDBではデフォルトでユーザ権限の設定がされていないため、インストールするとすぐにローカルで動かすことができます。遊びで使うには良いですが、プロダクションとしてはユーサ権限の設定が必要です。そして、プロダクションではデータのバックアップも欠かせません。
今回は、プロダクションを少し意識して、MongoDBのユーザ権限設定と、バックアップとリストアの方法を紹介します。
MongoDBのインストールと初期設定
インストール
まずは、HomebrewでMongoDBをインストールしましょう。
$ brew install mongodb
$ mongo --version
MongoDB shell version v4.0.1
git version: 54f1582fc6eb01de4d4c42f26fc133e623f065fb
allocator: system
modules: none
build environment:
distarch: x86_64
target_arch: x86_64
初期設定
データベース用のフォルダと、mongodbの設定ファイルを編集します。
$ sudo mkdir -p /data/db
$ sudo chown -R $USER /data/db
$ vi /usr/local/etc/mongod.conf
systemLog:
destination: file
path: /data/db/mongo.log
logAppend: true
storage:
dbPath: /data/db
net:
bindIp: 127.0.0.1
MongoDBの起動
それでは、HomebrewからMongoDBを起動しましょう。
$ brew services list
Name Status User Plist
mongodb stopped
$ brew services start mongodb
==> Successfully started `mongodb` (label: homebrew.mxcl.mongodb)
$ brew services list
Name Status User Plist
mongodb started user /Users/user/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
$ mongo
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> exit
bye
正常に起動し、ログインできました。
管理者ユーザの作成
管理者ユーザの作成
ユーザ管理用のユーザを作りましょう。
$ mongo
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> use admin
switched to db admin
> db.createUser({
... user: 'admin',
... pwd: 'admin',
... roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]
... })
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
> exit
bye
ビルトインのユーザ権限に関しては公式ドキュメントを参照してください。
MongoDBの設定変更
MongoDBの設定ファイルにsecurityの項目を追加し、MongoDBを再起動します。
$ vi /usr/local/etc/mongod.conf
systemLog:
destination: file
path: /data/db/mongo.log
logAppend: true
security:
authorization: enabled
storage:
dbPath: /data/db
net:
bindIp: 127.0.0.1
$ brew services restart mongodb
Stopping `mongodb`... (might take a while)
==> Successfully stopped `mongodb` (label: homebrew.mxcl.mongodb)
==> Successfully started `mongodb` (label: homebrew.mxcl.mongodb)
$ mongo -u admin -p admin -authenticationDatabase admin
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> exit
bye
管理者ユーザでログインできました。
データベースユーザの作成
データベースユーザの作成
次に、データベース用のユーザを作りましょう。例として「testdb」というデータベースのユーザ「test」を作ります。
$ mongo
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> use admin
switched to db admin
> db.auth('admin', 'admin')
1
> use testdb
switched to db testdb
> db
testdb
> db.createUser({
... user: 'test',
... pwd: 'test',
... roles: [{role: 'readWrite', db: 'testdb'}]
... })
Successfully added user: {
"user" : "test",
"roles" : [
{
"role" : "readWrite",
"db" : "testdb"
}
]
}
> db.getUsers()
[
{
"_id" : "testdb.test",
"user" : "test",
"db" : "testdb",
"roles" : [
{
"role" : "readWrite",
"db" : "testdb"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
]
> exit
bye
データの準備
次の章のバックアップとリストアに備えれ、carsコレクションを作り、データを入れて置きましょう。
$ mongo -u test -p test -authenticationDatabase testdb
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> use testdb
switched to db testdb
> db.createCollection('cars')
{ "ok" : 1 }
> show collections
cars
> db.cars.insertMany([
... { name: 'audi', price: 30000000, madeIn: 'germany' },
... { name: 'bentley', price: 29000000, madeIn: 'england' },
... { name: 'benz', price: 35000000, madeIn: 'germany' },
... { name: 'toyota suv', price: 5000000, madeIn: 'japan' }
... ])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5b7e88fd243497cbcc098005"),
ObjectId("5b7e88fd243497cbcc098006"),
ObjectId("5b7e88fd243497cbcc098007"),
ObjectId("5b7e88fd243497cbcc098008")
]
}
> db.cars.find()
{ "_id" : ObjectId("5b7e88fd243497cbcc098005"), "name" : "audi", "price" : 30000000, "madeIn" : "germany" }
{ "_id" : ObjectId("5b7e88fd243497cbcc098006"), "name" : "bentley", "price" : 29000000, "madeIn" : "england" }
{ "_id" : ObjectId("5b7e88fd243497cbcc098007"), "name" : "benz", "price" : 35000000, "madeIn" : "germany" }
{ "_id" : ObjectId("5b7e88fd243497cbcc098008"), "name" : "toyota suv", "price" : 5000000, "madeIn" : "japan" }
> exit
bye
BSON形式のバックアップとリストア
MongoDBのバックアップにはmongodumpコマンド、リストアにはmongorestoreを使います。
まずはBSON形式でバックアップして、リストアしてみましょう。
バックアップ
バックアップしましょう。
$ mkdir backup
$ mongodump -u test -p test -d testdb -o ./backup/20180423
2018-04-23T03:31:29.904-0700 writing testdb.cars to
2018-04-23T03:31:29.926-0700 done dumping testdb.cars (4 documents)
$ ls ./backup/
20180423/
リストア
データをドロップします。
$ mongo -u test -p test -authenticationDatabase testdb
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> use testdb
switched to db testdb
> db.cars.drop()
true
> db.cars.find()
> exit
bye
リストアしましょう。
$ mongorestore -u test -p test --authenticationDatabase testdb --nsInclude testdb.* --drop ./backup/20180423
2018-04-23T03:39:52.312-0700 preparing collections to restore from
2018-04-23T03:39:52.336-0700 reading metadata for testdb.cars from backup/20180423/testdb/cars.metadata.json
2018-04-23T03:39:52.473-0700 restoring testdb.cars from backup/20180423/testdb/cars.bson
2018-04-23T03:39:52.502-0700 no indexes to restore
2018-04-23T03:39:52.502-0700 finished restoring testdb.cars (4 documents)
2018-04-23T03:39:52.502-0700 done
データが元に戻っていることを確認します。
$ mongo -u test -p test -authenticationDatabase testdb
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> use testdb
switched to db testdb
> db.cars.find()
{ "_id" : ObjectId("5b7e88fd243497cbcc098005"), "name" : "audi", "price" : 30000000, "madeIn" : "germany" }
{ "_id" : ObjectId("5b7e88fd243497cbcc098006"), "name" : "bentley", "price" : 29000000, "madeIn" : "england" }
{ "_id" : ObjectId("5b7e88fd243497cbcc098007"), "name" : "benz", "price" : 35000000, "madeIn" : "germany" }
{ "_id" : ObjectId("5b7e88fd243497cbcc098008"), "name" : "toyota suv", "price" : 5000000, "madeIn" : "japan" }
> exit
bye
うまくいきました。
アーカイブ形式のバックアップとリストア
次に、アーカイブ形式でバックアップし、リストアしてみましょう。
バックアップ
バックアップしましょう。
$ mongodump -u test -p test -d testdb --gzip --archive=./backup/20180423.dump
2018-04-23T03:43:28.847-0700 writing testdb.cars to archive './backup/20180423.dump'
2018-04-23T03:43:28.873-0700 done dumping testdb.cars (4 documents)
$ ls backup/
20180423.dump
リストア
データをドロップします。
$ mongo -u test -p test -authenticationDatabase testdb
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> use testdb
switched to db testdb
> db.cars.drop()
true
> db.cars.find()
> exit
bye
データをリストアしましょう。
$ mongorestore -u test -p test --authenticationDatabase testdb --drop --gzip --archive=./backup/20180423.dump
2018-04-23T03:47:26.174-0700 preparing collections to restore from
2018-04-23T03:47:26.249-0700 reading metadata for testdb.cars from archive './backup/20180423.dump'
2018-04-23T03:47:26.322-0700 restoring testdb.cars from archive './backup/20180423.dump'
2018-04-23T03:47:26.383-0700 no indexes to restore
2018-04-23T03:47:26.383-0700 finished restoring testdb.cars (4 documents)
2018-04-23T03:47:26.383-0700 done
データが元に戻っていることを確認しましょう。
$ mongo -u test -p test -authenticationDatabase testdb
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
> use testdb
switched to db testdb
> db.cars.find()
{ "_id" : ObjectId("5b7e88fd243497cbcc098005"), "name" : "audi", "price" : 30000000, "madeIn" : "germany" }
{ "_id" : ObjectId("5b7e88fd243497cbcc098006"), "name" : "bentley", "price" : 29000000, "madeIn" : "england" }
{ "_id" : ObjectId("5b7e88fd243497cbcc098007"), "name" : "benz", "price" : 35000000, "madeIn" : "germany" }
{ "_id" : ObjectId("5b7e88fd243497cbcc098008"), "name" : "toyota suv", "price" : 5000000, "madeIn" : "japan" }
> exit
bye
ちゃんと戻っていますね。
最後に
いかがでしたか?MongoDBをより実践的に使えるようになったのではないでしょうか。それでは。
環境
- PC: macOS High Sierra 10.13.6
- Homebrew: 1.7.2
- MongoDB: v4.0.1


コメントを残す