Mongodb 安装和使用

135 阅读9分钟

安装

1.配置yum源

#vim /etc/yum.repos.d/mongodb-org-5.0.repo
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc
​
#yum repolist

2.安装mongodb

#安装稳定版本
yum install -y mongodb-org
​
#安装指定版本
 yum install -y mongodb-org-5.0.2 mongodb-org-database-5.0.2 mongodb-org-server-5.0.2 mongodb-org-shell-5.0.2 mongodb-org-mongos-5.0.2 mongodb-org-tools-5.0.2
​
#防止升级出现意外,固定包配置/etc/yum.conf
exclude=mongodb-org,mongodb-org-database,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools
​
`启动服务`
 /data/mongodb_bin/bin/mongod --config /etc/mongodb.conf
 /usr/bin/mongod -f /etc/mongod.conf
/usr/bin/mongod --config /etc/mongod.conf
​
systemctl daemon-reload
systemctl start  mongod
​
卸载mongo
sudo service mongod stop
sudo yum erase $(rpm -qa | grep mongodb-org)
sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongo
​
#确定使用哪个init系统
ps --no-headers -o comm 1
    `systemd- 选择下面的systemd (systemctl)选项卡。
            systemctl daemon-reload
            systemctl start mongod
            systemctl status mongod
            systemctl enable mongod
            systemctl stop mongod
            systemctl restart mongod
​
    `init- 选择下面的System V Init(服务)选项卡
            chkconfig mongod on
            service mongod start
            service mongod stop
            service mongod restart
            
#cat /usr/lib/systemd/system/mongod.service
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target
​
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod.conf"
EnvironmentFile=-/etc/sysconfig/mongod
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings[Install]
WantedBy=multi-user.target
​

3 本地主机绑定

默认情况下,MongoDB 以bindIpset to 启动127.0.0.1,它绑定到 localhost 网络接口。这意味着mongod只能接受来自在同一台机器上运行的客户端的连接。远程客户端将无法连接到mongod,并且除非将此值设置为有效的网络接口,否则mongod将无法初始化副本集

可以配置此值:

  • 在 MongoDB 配置文件中使用bindIp, 或
  • 通过命令行参数 --bind_ip

4 创建数据库

MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中 。

#创建数据库
> use mongo  
#show dbs 查看所有数据库 ,发现mongo数据库不在数据库列表里
> show dbs#显示创建数据库,需要向mongo数据库中插入一些数据
> db.mongo.insert({"name":"mongodb"})

5.删除数据库

#删除数据库runoob
> db.dropDatabase()  
{ "dropped" : "runoob", "ok" : 1 }

> `删除集合`
> **db.collection.drop()**

6. 文档

> **插入文档可以使用db.col.save(document)命令。如果不指定 _id字段save()方法类似insert()方法。如果指定 _id字段,则会更新该 _id的数据。**

> # MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下  
> db.COLLECTION_NAME.insert(document)  

> #插入文档,文档存储在mongodb的mongo数据库的col集合,col是集合名,如果该集合名不在该数据库中,MongoDB会自动创建该集合并插入文档  
> > db  
> mongo  
> > db.col.insert ( { title: "Mongodb",  
> description: "mongodb是Nosql数据库",  
> by: "mongoDB",  
> url: "http://www.mongodb.org.cn",  
> tags: ["mongodb","database","Nosql"],  
> likes: 100  
> })


> #查看插入的文档  
> > db.col.find ()

> #可以将数据定义为一个变量,如下  
> > document=( { title: "Mongodb",  
> description: "mongodb是Nosql数据库",  
> by: "mongoDB",  
> url: "http://www.mongodb.org.cn",  
> tags: ["mongodb","database","Nosql"],  
> likes: 100  
> })

> #执行插入操作  
> > db.col.insert(document)

> #查看插入的文档  
> > db.col.find ()  
> #查看更新修改的标题  
> > db.col.find().pretty()

> #创建集合  
> > db.createCollection("name")  
> #查看集合  
> > show tables  
> > show collections

7 MongoDB复制

mongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据库副本,提高了数据的高可用性,并可以保证数据的安全性。复制允许从硬件故障和服务中断中恢复数据。

复制优点

  • 保障数据的安全性
  • 数据高可用性
  • 灾难恢复
  • 无需停机维护(如,备份,重建索引,压缩)
  • 分布式读取数据

复制原理

MongoDB的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。各节点常见的搭配方式为: 一主一从、一主多从。 主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,保证从节点的数据和主节点一致。 客户端总主节点,在客户端写入数据到主节点,主节点与从节点进行数据交互保障数据的一致性

副本集特征

  • N个节点的集群
  • 任何节点可作为主节点
  • 所有写入操作都在主节点上
  • 自动故障转移
  • 自动恢复

8 创建角色和用户

role: 权限 db: 拥有对这个库的操作权限

mongodb与其他数据库不一样,mongo中在哪个库中创建的用户就只有对那个库有操作权限,除非在role中特别说

> rs0:PRIMARY> use admin
> switched to db admin
> rs0:PRIMARY> db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]})
> Successfully added user: {
>     "user" : "admin",
>     "roles" : [
>         {
>             "role" : "root",
>             "db" : "admin"
>         }
>     ]
> }

> #mongo mongodb://admin:123456@10.0.0.107:27018

用户角色:

1:可以使用的数据库管理员角色如下:

  • dbAdmin----授予执行管理任务的特权
  • userAdmin---允许您在当前数据库上创建和修改用户和角色
  • dbOwner----此角色结合了以下内容: readWrite dbAdmin userAdmin

2.集群管理员角色 用于管理整个系统的管理数据库中的角色。 clusterMonitor---提供对监视工具的只读访问。 clusterManager---用于管理和监视集群上的操作 hostManager---监视和管理服务器 clusterAdmin----结合了其他三个角色和dropDatabase操作

3.备份和恢复角色 这个角色数据管理数据库。 backup---提供备份数据所需的权限 restore---提供从备份中还原数据所需的特权

4.所有数据库角色 这些角色位于管理数据库上,并提供适用于所有数据库的特权。 readAnyDatabase——与“read”角色相同,但适用于所有数据库 readWriteAnyDatabase——与“readWrite”角色相同,但适用于所有数据库 userAdminAnyDatabase——与‘userAdmin’角色相同,但适用于所有数据库 dbAdminAnyDatabase——与“dbAdmin”角色相同,但适用于所有数据库

5.超级用户角色 以下角色不是直接的超级用户角色,但是能够为任何用户分配任何数据库上的任何特权,也包括他们自己。 userAdmin dbOwner userAdminAnyDatabase root角色提供对所有资源的完全特权: root

9 备份还原

MongoDB 备份(mongodump)

在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。 mongodump命令可以通过参数指定导出的数据量级转存的服务器。

mongodump命令脚本语法如下:
#mongodump -h dbhost -d dbname -o dbdirectory

> #mongodump -h 10.54.1.13:27018 --gzip -v -j 3  -d koderover  -o /data/backup/mongod_bak/0617_bak

> #mongorestore -h 10.54.1.13 --port 27018 -d zadig_admin --drop /data/backup/mongod_bak/koderover/
> #mongorestore -h 10.54.1.13 --port 27018 -d zadig_admin --dir  /data/backup/mongod_bak/koderover/

> 全备单节点  
> #mongodump --port 27017 -u myUserAdmin -p 123456 --authenticationDatabase admin -o back  
> -o #指定备份后目录名称
> 全备集群  
> #mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -o mongo_backup  
> #mongodump -h 10.0.0.107:27018 --gzip -o /data/ 
> 只备份某个数据库  
> #mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d oldboy -o mongo_backup  
> -d #指定备份库的名称
>
> 只备份某个库下的某个集合  
> #mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d oldboy -c user_info -o mongo_backup  
> -c #指定集合的名称
> -h:
> -   MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
> -   -d:
>     需要备份的数据库实例,例如:test
> -   -o:
>     备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
> | 语法                                                | 描述                | 实例                                               |
> | ------------------------------------------------- | ----------------- | ------------------------------------------------ |
> | mongodump --host HOST_NAME --port PORT_NUMBER     | 该命令将备份所有MongoDB数据 | mongodump --host w3cschool.cc --port 27017       |
> | mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY |                   | mongodump --dbpath /data/db/ --out /data/backup/ |
> | mongodump --collection COLLECTION --db DB_NAME    | 该命令将备份指定数据库的集合。   | mongodump --collection mycol --db test           |
9.2 MongoDB恢复(mongorerstore)

mongodb使用 mongorerstore 命令来恢复备份的数据。

语法

mongorestore命令脚本语法如下:

mongorestore -h dbhost -d dbname --directoryperdb dbdirectory  

  • -h: MongoDB所在服务器地址
  • -d: 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
  • --directoryperdb: 备份数据所在位置,例如:c:\data\dump\test,这里为什么要多加一个test,而不是备份时候的dump,读者自己查看提示吧!
  • --drop: 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除

恢复bson格式的数据
mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" mongo_backup

恢复gzip格式的数据
mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" mongo_backup --gzip

遇到重复的删除再导⼊
mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" mongo_backup --gzip --drop
--drop #遇到重复值删除再导入

模拟执行导入
mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" mongo_backup --gzip --drop --dryRun
--dryRun #模拟执行

恢复到指定集合(恢复到指定集合那么数据格式必须是bson格式)
mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" --dir=./mongo_backup/oldboy/cook.bson -d oldboy -c cook --drop

bsog格式转换成json格式
bsondump cook.bson --outFile=cook.json
将cook.bson到处成为cook.json

腾讯云原生mongodb备份和恢复

mongodump --host 10.54.1.18:27018 -u zadig -p zadig --authenticationDatabase=admin --gzip -d zadig_admin -o /dir/zadig_admin
mongodump --host 10.54.1.18:27018 -u zadig -p zadig --authenticationDatabase=admin --gzip -d koderover -o /dir/koderover

mongorestore --host 10.54.2.122:27017 --drop --gzip --dir=/dir/zadig_admin --dryRun
mongorestore --host 10.54.2.122:27017 -u zadig -p zadig --authenticationDatabase=admin -d zadig_admin --drop --gzip --dir=/dir/zadig_admin --dryRun
mongorestore --host 10.54.2.18:27017 -uzadig -p zadig  --authenticationDatabase=admin -d koderover --drop --gzip --dir=/dir/koderover --dryRun

9.3 mongoexport/mongoimport备份和恢复

`备份 --authenticationDatabase admin 导出指定集合为json格式 mongoexport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d test -c user_info -o mongo_backup/test.user_info.json

导出成csv格式 --fields=_id,title,description,by,url,tags,likes   -f _id,title,description,by,url,tags,likes #mongoexport --host="10.0.0.107:27018,10.0.0.117:27018,10.0.0.127:27018" -d mongo -c col --type=csv --fields=_id,title,description,by,url,tags,likes -o /data/mongo.col.csv

mongoexport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d test -c user_info --type=csv --fields=name,age,host -o mongo_backup/test.user_info.csv --fields #指定字段

`恢复 #mongoimport --host="10.0.0.107:27018,10.0.0.117:27018,10.0.0.127:27018" -d mongo -c col /data/mongo.col.json --drop #mongoimport --host="10.0.0.107:27018,10.0.0.117:27018,10.0.0.127:27018" --type=csv --headerline -d mongo -c col /data/mongo.col.csv --drop

从json格式恢复数据 mongoimport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d test -c user_info mongo_backup/test.user_info.json --drop

从csv格式恢复数据 mongoimport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" --type=csv --headerline -d test -c user_info mongo_backup/test.user_info.csv --drop --headerline #以第一行数据作为列的依据,作为列名识别,不导入数据 -j n  #并发导入,n是CPU核数

9.4 将mysql数据导入mongo

1、mysql开启安全路径 vim /etc/my.cnf #添加以下配置 secure-file-priv=/tmp

重启数据库生效 /etc/init.d/mysqld restart

2、mysql⾃定义分隔符导出成csv格式 select * from test.t100w limit 10 into outfile '/tmp/100w.csv'   fields terminated by ',';

PS:mysql导出csv fields terminated by ','    ------字段间以,号分隔 optionally enclosed by '"'   ------字段用"号括起 escaped by '"'    ------字段中使用的转义符为" lines terminated by '\r\n';  ------行以\r\n结束

PS:mysql导入csv load data infile '/tmp/2.csv'   into table t1   fields terminated by ',' ;

3、在mongodb中导入备份 ongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test  -c t100w --type=csv -f id,num,k1,k2,dt --file /tmp/100w.csv

10  批量提取mongodb的单库下所有文档的大小【脚本】

#cat mongdb.py
import os,sys  
list = []  
for i in range(3,50):  
 l = os.popen("/bin/echo 'show collections'| mongo mongodb://10.54.1.13:27018/koderover|sed -n '%sp'" %i)  
 l = l.read()  
if l != "":  
 list.append(l)  
else:  
 print "the collections is %s" %i  
 del list[i-4]  
break  
for i in list:  
 i = i.strip("\n")  
 os.popen("/bin/echo 'db.%s.stats()'| mongo mongodb://10.54.1.13:27018/koderover|sed -n '2p; 4p;6p;8p'>>mongodb_size_count.txt" %i