mongoDBの使い方

2020.2.23 (日)

多少今更感があるmonogoです。mysqlとかpoatgresqlとかと比べて大きく違うところは、

  1. テーブルのjoinとかそういうのは不得意というかむしろできない。
  2. いわゆるカラム構造がjsoライクなので入れ子にできる。
  3. テーブルをコレクションと呼ぶ。

こんなところでしょうか。

mongodbのインストール


mongodbの移動。わけあって全然しらんmongodbをデータごと移行するときに調べたこと。mongo自体が新しいものなのでOSはCentOS7で64bitだったので助かった。yumでインストールしたものなのか調べてみる。

# yum list installed | grep mongo
mongodb-org.x86_64               2.6.12-1                       @mongodb-org-2.6
mongodb-org-mongos.x86_64        2.6.12-1                       @mongodb-org-2.6
mongodb-org-server.x86_64        2.6.12-1                       @mongodb-org-2.6
mongodb-org-shell.x86_64         2.6.12-1                       @mongodb-org-2.6
mongodb-org-tools.x86_64         2.6.12-1                       @mongodb-org-2.6

なるほど、こういうもんがインストールされていると。
実際にどんなものが動いているのかと。

# ps aux | grep mongo
mongod    1468  1.6  5.3 12499020 217716 ?     Sl    2019 1548:15 /usr/bin/mongod --slowms 500 --syslog -f /etc/mongod.conf

mongodという感じでデーモンかな。だとすると、サービスが動いてるから、ステータス確認してみる。

# systemctl status mongod
● mongod.service - SYSV: Mongo is a scalable, document-oriented database.
   Loaded: loaded (/etc/rc.d/init.d/mongod; bad; vendor preset: disabled)
   Active: active (running) since 金 2019-12-20 01:03:59 JST; 2 months 4 days ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1371 ExecStart=/etc/rc.d/init.d/mongod start (code=exited, status=0/SUCCESS)
 Main PID: 1468 (mongod)
....

ほう。
/etc/mongod.confの中身を見てみる。以外に短い。げ、replication:ってのあるから、レプリケーション設定をやっているっぽい。mongodbのサーバーが3つあったのでそれかな。

systemLog:
    quiet: true
    verbosity: 0
    destination: syslog
    syslogFacility: local1
    logAppend: true
processManagement:
    fork: true
    pidFilePath: "/var/run/mongodb/mongod.pid"
storage:
    dbPath: "/var/lib/mongo"
    journal:
        enabled: true
net:
    port: 27017
#security:
#    authorization: enabled
#    keyFile: "/etc/mongod.keyfile"
replication:
    oplogSizeMB: 512
    replSetName: bazx

ログを見てみる。/var/log/mongodb/mongodにある。レプリケーションの設定が完了したとかそういうものしか書かれてない。
そういえばポートはいくつを使うんだろ。27017がデフォルトのポートらしい。nmap localhostでは特に使っている様子なし。そとからポートスキャンかけても空いてない。

# netstat -ltup4
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      1468/mongod     

あ、あった。

# which mongo
/bin/mongo

実態はここにある。

# mongo --version
MongoDB shell version: 2.6.12

概要としてはここまで。
historyを見ると、mondodbのリポジトリを入れていたので、確認。(ちまたの最新記事では2020-02-23時点で4.xになっていたので日々進化してますね。)

$ less /etc/yum.repos.d/mongodb2.6.repo

中身は、

[mongodb-org-2.6]
name=MongoDB 2.6 Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

マイグレーションなので同じリポジトリ使うのがベストなのかな。(と思う)
ログインしてみる。パスワードとか設定してなくてよかった。rootユーザーからだとログインできる。
(抜けるときはexit

# mongo
MongoDB shell version: 2.6.12
connecting to: test
foobar:SECONDARY> 

DBの一覧を出してみる。4GBぐらいのDBがある。

foobar:SECONDARY> show dbs;
admin    (empty)
local    1.078GB
test     (empty)
baz      3.952GB

DBに入ってみる。

use baz

DBの状態は、

foobar:SECONDARY> db.stats()
{
    "db" : "baz",
    "collections" : 3,
    "objects" : 4332,
    "avgObjSize" : 236.89750692520775,
    "dataSize" : 1026240,
    "storageSize" : 2842624,
    "numExtents" : 8,
    "indexes" : 2,
    "indexSize" : 392448,
    "fileSize" : 1006632960,
    "nsSizeMB" : 16,
    "dataFileVersion" : {
        "major" : 4,
        "minor" : 5
    },
    "extentFreeList" : {
        "num" : 46,
        "totalSize" : 720834560
    },
    "ok" : 1
}

なるほど。。コレクションを見てみる。

foobar:SECONDARY> show collections;
2020-02-23T17:07:16.955+0900 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131

Slave参照じゃないと見れない?

foobar:SECONDARY> db.getMongo().setSlaveOk()
foobar:SECONDARY> show collections;
foo
bar
baz
...

見れた。

mongodbをダンプする

mongodb自体をマイグレーションするときには普通にdump & restoreするのがいいのかなと思います。
mongodumpコマンドはバイナリでdumpし、mongoexportはjsonで吐き出してくれます。まるっとそのまま出したいときなどは前者ですが、テキストで出したい場合は後者を使います。
アクセス制限がなければ以下のコマンドで丸っと全部ダンプができます。容量が大きい場合はこのコマンドが使えないかもしれません。

mongodump -o /tmp/mongo-dump

sqlと違って1つのファイルにまとまって落ちてくるのではなくてディレクトリで落ちてきます。上記の例ではmongo-dump内にそれぞれのコレクションのディレクトリが作成されて、中にデータファイルがあります。.bsonファイルはバイナリなのでテキストエディタでは閲覧不可能なので、テキストをそのまま出したいときはmongoexportでダンプします。