分类 MongoDB 下的文章

MongoDB删除集合db.collection.drop

MongoDB 的 db.collection.drop() 用于从数据库中删除集合,删除集合collection语法如下:

db.COLLECTION_NAME.drop()

首先,检查数据库 test 中可用的集合。

>use test
switched to db test
> show collections
mycol
mycollection
newcollection

现在删除名称为 mycollection 的集合。

>db.mycollection.drop()
true

再次检查当前数据库的集合列表,如下 -

> show collections
mycol
newcollection

如果选定的集合成功删除,drop()方法将返回true,否则返回false。

MongoDB备份/还原/导出/导入

mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport。
mongodb.png
一、mongodump备份数据库
常用命令

mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径  

如果没有用户谁,可以去掉-u和-p。
如果导出本机的数据库,可以去掉-h。
如果是默认端口,可以去掉--port。
如果想导出所有数据库,可以去掉-d。
导出所有数据库

mongodump -h 127.0.0.1 --port 30000 -o /tmp/mon

导出指定库

mongodump -h 127.0.0.1 --port 30000 -d DBNAME -o /tmp/mon

二、mongorestore还原数据库

mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件路径

--drop的意思是,先删除所有的记录,然后恢复
恢复所有数据库到mongodb中

mongorestore -h 127.0.0.1 --port 30000 /tmp/mon

还原指定的数据库

mongorestore -h 127.0.0.1 --port 30000 -d NEWDB /tmp/mon/newdb

三、mongoexport导出表,或者表中部分字段
常用命令格式

mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名  

-f 导出指字段,以字号分割,-f name,email,age导出name,email,age这三个字段
-q 可以根查询条件导出,-q '{ "uid" : "100" }' 导出uid为100的数据
--csv 表示导出的文件格式为csv的,这个比较有用,因为大部分的关系型数据库都是支持csv,在这里有共同点
导出整张表

mongoexport -d DBNAME -c TBNAME -o /tmp/mon/xxx/xxxx.dat

导出表中部分字段

mongoexport -d DBNAME -c TBNAME -f uid,name,sex -o /tmp/mon/xxx/xxxx.dat

根据条件导出

mongoexport -d DBNAME -c TBNAME -q '{uid:{$gt:1}}' -o /tmp/mon/users.json

四、mongoimport导入表或表字段
还原整表导出的非csv文件

mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop 文件名  
--upsert参数:插入或者更新现有数据

还原部分字段的导出文件

mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsertFields 字段 --drop 文件名
--upsertFields参数:插入或者更新现有数据

还原导出的csv文件

mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 类型 --headerline --upsert --drop 文件名

还原导出的表数据

mongoimport -d DBNAME -c TBNAME --upsert /tmp/mon/users.dat

部分字段的表数据导入

mongoimport -d DBNAME -c TBNAME  --upsertFields uid,name,sex /tmp/mon/users.dat

还原csv文件

mongoimport -d DBNAME -c TBNAME --type csv --headerline --file /tmp/mon/users.csv

MongoDB分片启动失败解决方法

MongoDB机器未能正常关机,机器掉电重启等各种情况,都可能引起mongodb数据文件异常,然后下次启动的时候,会报错大概如下

517322 2018-01-03T22:20:45.939+0800 I NETWORK  [Balancer] scoped connection to 10.249.3.12:20000,10.249.3.11:20000,10.249.3.11:20003 not being returned to the pool
517323 2018-01-03T22:20:45.939+0800 I SHARDING [Balancer] caught exception while doing balance: ReplicaSetMonitor no master found for set: shard1
517324 2018-01-03T22:20:46.540+0800 I NETWORK  [LockPinger] SyncClusterConnection connecting to [10.249.3.12:20000]
517325 2018-01-03T22:20:46.541+0800 I NETWORK  [LockPinger] SyncClusterConnection connecting to [10.249.3.11:20000]
517326 2018-01-03T22:20:46.541+0800 I NETWORK  [LockPinger] SyncClusterConnection connecting to [10.249.3.11:20003]
517327 2018-01-03T22:20:49.748+0800 W SHARDING config servers 10.249.3.12:20000 and 10.249.3.11:20000 differ
517328 2018-01-03T22:20:49.749+0800 W SHARDING config servers 10.249.3.12:20000 and 10.249.3.11:20000 differ
517329 2018-01-03T22:20:49.751+0800 W SHARDING config servers 10.249.3.12:20000 and 10.249.3.11:20000 differ
517330 2018-01-03T22:20:49.752+0800 W SHARDING config servers 10.249.3.12:20000 and 10.249.3.11:20000 differ

重点在differ这里,两个分片不一致,导致不能启动,解决方法如下:
分别安全关闭10.249.3.11和12的MongoDB

/usr/local/mongodb/bin/mongo -host 127.0.0.1 -port 20000
> use admin; 
> db.shutdownServer();

进入到3.11机器的对应数据目录,将文件整个打包,
进入到3.12机器的数据目录/data/mongodb/config20001,删除所有文件,记得备份,
最后scp 11.zip 10.249.3.12:/data/mongodb/config20001 ,然后解压,最后启动mongodb即可;

MongoDB 3.x 添加用户及权限管理配置

MongoDB权限认证流程:

MongoDB没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。
切换到admin数据库,添加的账号才是管理员账号
用户只能在用户所在数据库登录,包括管理员账号
管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。

添加管理员账号

[root@c160 ~]# mongo -host 127.0.0.1 -port 30000
MongoDB shell version v3.4.10
connecting to: mongodb://127.0.0.1:30000/
MongoDB server version: 3.4.10

> use admin                     #切换到admin数据库
switched to db admin

> db.system.users.find();      #用户表没有数据
> show users;

> db.createUser(               #创建管理员账号admin
    {
    user:"admin",
    pwd:"123456",
    roles:[{role:"userAdminAnyDatabase",db:"admin"}]
    }
    )

开启权限验证
修改配置文件加上auth=true参数,开启认证,需重启生效

> show dbs                  #显示所有数据库失败,还没认证  
2017-11-30T22:47:12.341+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13,
        "codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:781:19
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1
> use admin        //切换到admin数据库  
switched to db admin  
> db.auth('admin','123456');   //在admin数据库认证成功  
1  
> show dbs
admin  0.000GB
local  0.000GB

---阅读剩余部分---

MongoDB数据库的启动和停止

MongoDB进程如果直接kill掉进程或机器突然断电等都会可能MongoDB造成数据损坏,所以在停止MongoDB服务的时候,不要用kill -9 或 killall -9 直接干掉MongoDB的进程·

要安全停止可以有两种信号:sigint 信号,或者 sigterm信号

如何安全kill停止:

kill -2 `ps -ef | grep mongod| awk 'NR==1 {print $2}'`    #直接查找出mongodb的pid进程号并发送sigint信号kill
 $ kill -2 8888 其中 8888 为mongod进程号,该进程号可以通过 ps -axu |grep mongo 获取; -2 表示向mongod进程发送sigint信号
$ kill -4 8888 其中 8888 为mongod进程号 ,该进程号可以通过 ps -axu |grep mongo 获取; -4 表示向mongod进程发送sigterm信号

mongod进程收到sigint信号或者sigterm信号,会做一些处理:关闭所有打开的连接,将内存数据强制刷新到磁盘,当前的操作执行完毕后在安全停止服务。

---阅读剩余部分---

MongoDB用户角色权限认证说明

MongoDB用户权限设置逻辑:先初始化一个超级管理员,然后让这个超管用户,创建普通用户和角色,并给用户分配角色,同时也有一些内建的角色可以使用。

  1. MongoDB是没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。
  2. 切换到admin数据库,添加的账号才是管理员账号,添加普通用户,需先打开对应的库在添加,否则就添加到admin里面去了;
  3. 用户只能在用户所在数据库登录,包括管理员账号。

---阅读剩余部分---

最新

分类

归档

评论

  • Liang: 贴下编译参数和步骤,...
  • shao3911: 您好,为什么我在编译...
  • aliang: 先看是yum安装还是...
  • aliang: 将原来的nginx安...
  • yen: 3、如果要回滚的话,...
  • yen: 刚好需要升级ngin...
  • 文雨: 一些新的method...
  • aliang: 默认不屏蔽估计开发团...
  • 山野愚人居: PHP既然允许直接使...
  • aliang: 最下面有github地址·

其它