mongoDB常用命令与安全加固
一、介绍
MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它的特点是高性能、易部署、易使用,存储数据非常方便。
主要功能特性有:
- MongoDB是一个独立的服务器;
- 它是基于文档的,而不是基于表格的;
- 它是非结构化的;
- 它具有强大的主流开发语言支持,如C#、C++、Java、PHP、Perl、Python、Ruby。
- 可扩展性
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 支持完全索引,包含内部对象。
- 面向集合存储,易存储对象类型的数据。
二、mongodb基本概念
- 文档:是MongoDB中数据的基本单元,非常类似于关系型数据库系统中的行(但是比行要复杂很多)
- 集合:就是一组文档,如果说MongoDB中的文档类似于关系型数据库中的行,那么集合就如同表
- MongoDB的单个计算机可以容纳多个独立的数据库,每一个数据库都有自己的集合和权限
- MongoDB自带简洁但功能强大的JavaScript shell,这个工具对于管理MongoDB实例和操作数据库作用非常大
- 每一个文档都有一个特殊的键"_id",它在文档所处的集合中是唯一的,相当于关系数据库中的表的主键
三、MongoDB数据类型
四、常用命令
1、常用基本操作
show dbs :查看数据库列表;
db :查看当前数据库;
db.createCollection('要新建的表名') :新建一个表;
show collections :查看当前数据库下的表;
db.表名.drop() :删除当前数据库指定表
db.dropDatabase() :删除当前数据库
show users :查看当前库的所有用户
db.dropDatabase() :删除当前使用数据库
db.cloneDatabase(“127.0.0.1”) :将指定机器上的数据库的数据克隆到当前数据库
db.copyDatabase("mydb", "temp", "127.0.0.1"):将本机的mydb的数据复制到temp数据库中
db.repairDatabase() :修复当前数据库
db.getName() :查看当前使用的数据库
db.stats() :显示当前db状态
db.version() :当前db版本
db.getMongo() :查看当前db的链接机器地址 db.serverStatus().connections.current :查看当前的连接数
2、Collection聚集集合(表)
db.createCollection(“collName”, {size: 20, capped: 5, max: 100});创建一个聚集集合(table)
db.getCollection("account");得到指定名称的聚集集合(table)
db.getCollectionNames();得到当前db的所有聚集集合
db.printCollectionStats();显示当前db所有聚集索引的状态 #查看聚集集合基本信息
1、查看帮助
db.yourColl.help();
2、查询当前集合的数据条数
db.yourColl.count();
3、查看数据空间大小
db.userInfo.dataSize();
4、得到当前聚集集合所在的db
db.userInfo.getDB();
5、得到当前聚集的状态
db.userInfo.stats();
6、得到聚集集合总大小
db.userInfo.totalSize();
7、聚集集合储存空间大小
db.userInfo.storageSize();
8、Shard版本信息
db.userInfo.getShardVersion()
9、聚集集合重命名
db.userInfo.renameCollection("users"); 将userInfo重命名为users
10、删除当前聚集集合
db.userInfo.drop();
3、数据的增删改查操作
#增:
1、插入一条数据
db.表名.insert(数据);
db.test1.insertOne(数据); #insertOne只能插入1条数据 2、插入多条数据
db.表名.insert([数据1,数据2]);
db.表名.insertMany([数据1,数据2]); 方法二、save
db.表名.save(数据); insert与save区别:
当默认的“_id”值已存在时,调用insert方法插入会报错;而save方法不会,会更新相同的_id所在行数据的信息 #删
db.表名.remove(条件); #默认只删除第1条符合条件的数据
db.表名.deleteOne(条件) #删除所有符合条件的数据
db.表名.deleteMany(条件) #改
db.表名.update({"条件字段名":"字段值"},{$set:{"要修改的字段名":"修改后的字段值"}}); #修改一条数据updateOne
db.inventory.updateOne(
{ item: "paper" },
{
$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true }
}
) #修改多条数据updateMany
db.inventory.updateMany(
{ "qty": { $lt: 50 } },
{
$set: { "size.uom": "in", status: "P" },
$currentDate: { lastModified: true }
}
) #替换replaceOne
db.inventory.replaceOne(
{ item: "paper" },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
) #查
db.表名.find():查询表中所有数据
db.表名.find(条件):按条件查询
db.表名.findOne(条件):查询第一条(支持条件)
db.表名.find().limit(数量):限制数量(分页)
db.表名.find().skip(数量):跳过指定数量
db.表名.find().skip(起始数量).limit(显示的数量) :如:显示从10开始的10条数据
4、db.serverStatus()详解
PRIMARY> db.serverStatus()
{
"host" : "cd9a511a2d0e", #主机名
"version" : "2.6.1", ,#版本号
"process" : "mongod", #进程名
"pid" : NumberLong(41), #进程ID
"uptime" : 3785943, #运行时间
"uptimeMillis" : NumberLong("3785942955"),
"uptimeEstimate" : 3755878,
"localTime" : ISODate("2015-10-16T02:46:27.368Z"), #当前时间
"asserts" : { #各个断言的数量
"regular" : 0,
"warning" : 0,
"msg" : 0,
"user" : 58,
"rollovers" : 0
},
"backgroundFlushing" : {
"flushes" : 63098, #刷新次数
"total_ms" : 144997713, #刷新花费总时间
"average_ms" : 2297.97637009097, #平均时间
"last_ms" : 10913, #最后一次时间
"last_finished" : ISODate("2015-10-16T02:45:40.363Z") #最后刷新时间
},
"connections" : {
"current" : 1444, #当前连接数
"available" : 18556, #可用连接数
"totalCreated" : NumberLong(2429949)
},
"cursors" : {
"note" : "deprecated, use server status metrics",
"clientCursors_size" : 1, #客户端游标大小
"totalOpen" : 1, #打开游标数
"pinned" : 0,
"totalNoTimeout" : 481,
"timedOut" : 84 #超时时间
},
"dur" : {
"commits" : 27,
"journaledMB" : 2.711552,
"writeToDataFilesMB" : 5.213888,
"compression" : 0.5158220112430492,
"commitsInWriteLock" : 0,
"earlyCommits" : 0,
"timeMs" : {
"dt" : 3003,
"prepLogBuffer" : 1,
"writeToJournal" : 228,
"writeToDataFiles" : 10,
"remapPrivateView" : 2
}
},
"extra_info" : {
"note" : "fields vary by platform",
"heap_usage_bytes" : 96529464, #堆使用情况(字节)
"page_faults" : 11253067 #页面故障数
},
"globalLock" : {
"totalTime" : NumberLong("3785942955000"),
"lockTime" : NumberLong("47441423960"),
"currentQueue" : {
"total" : 0,
"readers" : 0,
"writers" : 0
},
"activeClients" : {
"total" : 0,
"readers" : 0,
"writers" : 0
}
},
"indexCounters" : {
"accesses" : 5980339643, #索引被访问数
"hits" : 5980339322, #索引命中数
"misses" : 0, #索引偏差数
"resets" : 0, #复位数
"mi***atio" : 0 #未命中率
},
"locks" : {
"." : {
"timeLockedMicros" : {
"R" : NumberLong(1300731481),
"W" : NumberLong("47441423960")
},
"timeAcquiringMicros" : {
"R" : NumberLong("83350794378"),
"W" : NumberLong("8842280365")
}
},
},
"network" : {
"bytesIn" : 182494603618, #输入数据(byte)
"bytesOut" : NumberLong("2936449550300"), #输出数据(byte)
"numRequests" : 600302443 #请求数
},
"opcounters" : {
"insert" : 214538892, #插入操作数
"query" : 388689, #查询操作数
"update" : 3462611, #更新操作数
"delete" : 0, ,#删除操作数
"getmore" : 188590632, #获取更多的操作数
"command" : 197825527 #其他命令操作数
},
"opcountersRepl" : {
"insert" : 1,
"query" : 0,
"update" : 0,
"delete" : 0,
"getmore" : 0,
"command" : 0
},
"recordStats" : {
"accessesNotInMemory" : 8377141,
"pageFaultExceptionsThrown" : 2926497,
"admin" : {
"accessesNotInMemory" : 94,
"pageFaultExceptionsThrown" : 0
}
},
"repl" : { #复制情况
"setName" : "c562ca6c-1d72-4c6a-a943-b46fe87e47ca",
"setVersion" : 105039,
"ismaster" : true,
"secondary" : false,
"hosts" : [
"10.10.1.1:27017",
"10.10.1.2:27017"
],
"arbiters" : [
"10.10.1.2:27017"
],
"primary" : "10.10.1.4:27017",
"me" : "10.10.1.5:27017"
},
"writeBacksQueued" : false,
"mem" : { #内存情况
"bits" : 64, #64位操作系统
"resident" : 4430, #占有物理内存数
"virtual" : 813370, #占有虚拟内存数
"supported" : true, #是否支持内存扩展
"mapped" : 405498,
"mappedWithJournal" : 810996
},
"metrics" : {
"cursor" : {
"timedOut" : NumberLong(84),
"open" : {
"noTimeout" : NumberLong(481),
"pinned" : NumberLong(0),
"total" : NumberLong(1)
}
},
"document" : {
"deleted" : NumberLong(0),
"inserted" : NumberLong(214538892),
"returned" : NumberLong("6735629965"),
"updated" : NumberLong(6502807)
},
"getLastError" : {
"wtime" : {
"num" : 0,
"totalMillis" : 0
},
"wtimeouts" : NumberLong(0)
},
"operation" : {
"fastmod" : NumberLong(3483995),
"idhack" : NumberLong(39),
"scanAndOrder" : NumberLong(6)
},
"queryExecutor" : {
"scanned" : NumberLong(107218344),
"scannedObjects" : NumberLong(107217952)
},
"record" : {
"moves" : NumberLong(1604)
},
"repl" : {
"apply" : {
"batches" : {
"num" : 2,
"totalMillis" : 8
},
"ops" : NumberLong(1)
},
"buffer" : {
"count" : NumberLong(0),
"maxSizeBytes" : 268435456,
"sizeBytes" : NumberLong(0)
},
"network" : {
"bytes" : NumberLong(709),
"getmores" : {
"num" : 18,
"totalMillis" : 86108
},
"ops" : NumberLong(2),
"readersCreated" : NumberLong(35)
},
"preload" : {
"docs" : {
"num" : 0,
"totalMillis" : 0
},
"indexes" : {
"num" : 1,
"totalMillis" : 0
}
}
},
"storage" : {
"freelist" : {
"search" : {
"bucketExhausted" : NumberLong(0),
"requests" : NumberLong(6551285),
"scanned" : NumberLong(12001208)
}
}
},
"ttl" : {
"deletedDocuments" : NumberLong(0),
"passes" : NumberLong(63048)
}
},
"ok" : 1
}
五、权限管理
1、mongodb数据库用户角色
#数据库用户角色
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库 #数据库管理员角色
dbAdmin:允许用户进行索引创建、删除,查看统计或访问system.profile,但没有角色和用户管理的权限
userAdmin:提供了在当前数据库中创建和修改角色和用户的能力
dbOwner: 提供对数据库执行任何管理操作的能力。这个角色组合了readWrite、dbAdmin和userAdmin角色授予的特权。 #集群管理角色
clusterAdmin : 提供最强大的集群管理访问。组合clusterManager、clusterMonitor和hostManager角色的能力。还提供了dropDatabase操作
clusterManager : 在集群上提供管理和监视操作。可以访问配置和本地数据库,这些数据库分别用于分片和复制
clusterMonitor : 提供对监控工具的只读访问,例如MongoDB云管理器和Ops管理器监控代理。
hostManager : 提供监视和管理服务器的能力。 #备份恢复角色
backup : 提供备份数据所需的能力,使用MongoDB云管理器备份代理、Ops管理器备份代理或使用mongodump
restore : 提供使用mongorestore恢复数据所需的能力 #所有数据库角色
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 #超级用户角色
root:提供对readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、restore和backup的所有资源的访问
2、创建用户
#创建超级管理员
use admin
db.createUser({
user:"admin",
pwd:"123456",
roles:[{
role:"root",
db:"admin"
}]
}) #创建普通用户
#创建test用户,密码为123456,权限为testDB数据库的readWrite权限
use testDB #进入testDB数据库
db.createUser({user:'test',pwd:'123456',roles:[{role:'readWrite',db:'testDB'}]}) #修改密码
db.updateUser('test',{user:'test',pwd:'admin',roles:[{role:'read',db:'testDB'}]}) //修改密码 并且 //修改角色为只读
3、常用的用户命令
#添加一个用户
db.addUser("name");
db.addUser("userName", "pwd123", true); 添加用户、设置密码、是否只读 #数据库认证、安全模式
db.auth("userName", "123123"); #查看所有用户
show users;
#删除用户
db.removeUser("test")
六、索引
1、创建索引
db.userInfo.ensureIndex({name: 1});
db.userInfo.ensureIndex({name: 1, ts: -1}); 2、查询当前聚集集合所有索引
db.userInfo.getIndexes(); 3、查看总索引记录大小
db.userInfo.totalIndexSize(); 4、读取当前集合的所有index信息
db.users.reIndex(); 5、删除指定索引
db.users.dropIndex("name_1"); 6、删除所有索引索引
db.users.dropIndexes();
七、安全加固
1、不使用root运行mongodb,创建普通用户运行mongodb
2、精确bind_ip(不要使用0.0.0.0)
3、使用登录验证 (auth = true)
4、mongodb的端口不允许对外开放
八、配置使用systemcal启动mongodb
#1、配置文件查看
[root@localhost ~]# cat /usr/local/mongodb/conf/mongodb.conf
#数据文件存放目录
dbpath = /data/mongodata
#日志文件存放目录
logpath = /data/logs/mongolog/mongodb.log
#端口
port = 27017
#以守护程序的方式启用,即在后台运行
fork = true
#监听ip
bind_ip=127.0.0.1
#最大连接数
maxConns=65536
# pid文件
pidfilepath=/var/run/mongo/mongod.pid
#开启认证
#auth = true #2、创建mongo账号
useradd -s /sbin/nologin -M mongo #创建目录与授权
mkdir -p /data/mongodata
mkdir -p /data/logs/mongolog
mkdir -p /var/run/mongo
chown -R /data/mongodata
chown -R /data/logs/mongolog
chown -R /var/run/mongo #service配置文件
[root@localhost ~]# cat /usr/lib/systemd/system/mongodb.service
[Unit]
Description=mongodb
After=network.target [Service]
Type=forking
PIDFile=/var/run/mongo/mongod.pid
ExecStart=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true User=mongo
Group=mongo [Install]
WantedBy=multi-user.target
mongoDB常用命令与安全加固的更多相关文章
- (转)mongodb常用命令脚本化-自动化运维
mongodb常用命令脚本化-自动化运维 把一些运维中常用到的mongodb命令写成shell脚本,极大的方便了维护 1 设置副本集 #!/bin/bash#mongodb 进入client ...
- mongodb常用命令学习笔记
mongodb常用命令学习笔记 创建数据库 use DATABASE_NAME eg: use users; 如果数据库不存在,则创建数据库,否则切换到指定数据库.要显示刚刚创建的数据库,需要向数据库 ...
- MongoDB常用命令
本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell.pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程. MongoDB的使用之前也分享过一篇, ...
- 【命令】MongoDB常用命令记录
如果你想创建一个“myTest”的数据库,先运行use myTest命令,之后就做一些操作(如:db.createCollection('user')),这样就可以创建一个名叫“myTest”的数据库 ...
- mongodb常用命令【转】
mongodb由 C++编写,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-performance, ...
- Mongodb常用命令介绍
查看命令的方式: 1.在shell中运行db.listCommands() 2.在浏览器中访问管理员接口:http://ipaddress:28017/_commands 下面介绍在Mongodb中最 ...
- [转载]MongoDB 常用命令
mongodb由C++编写,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-performance, o ...
- Windows下MongoDB常用命令
以下命令中的启动与暂停服务命令需要使用管理员身份运行cmd.exe,其他命令需要先cd到Mongodb安装目录的bin目录. 1.启动服务:net start [Mongodb服务名].示例: net ...
- ubuntu下mongodb常用命令
1. 启动脚本 #!/bin/bash mongod --dbpath /usr/local/mongodb/data1 chmod +x run-mongodb 2. 关闭数据库服务 官方文档说可以 ...
随机推荐
- 在 Vue 中使用 Typescript
前言 恕我直言,用 Typescript 写 Vue 真的很难受,Vue 对 ts 的支持一般,如非万不得已还是别在 Vue 里边用吧,不过听说 Vue3 会增强对 ts 的支持,正式登场之前还是期待 ...
- 为WPF, UWP 及 Xamarin实现一个简单的消息组件
原文地址:Implementing a simple messenger component for WPF, UWP and Xamarin 欢迎大家关注我的公众号:程序员在新西兰了解新西兰IT行业 ...
- APICloud开发者进阶之路 |纯手工编写日程表功能
本文出自APICloud官方论坛, 感谢论坛版主 赵永亮 的分享. 最近看论坛内关于极光推送的问题有很多, 本想写一个关于极光的详细教程的,无奈已经有很多大牛分享过了,所以只得纯手工写了一个日程表,可 ...
- cogs 1176. [郑州101中学] 月考 Map做法
1176. [郑州101中学] 月考 ★★☆ 输入文件:mtest.in 输出文件:mtest.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 在上次的月考中B ...
- typescript学习笔记(一)---基础变量类型
作为一个前端开发者,学习新技术跟紧大趋势是必不可少的.随着2019年TS的大火,我打算利用一个月的时间学习这门语言.接下来的几篇文章是我学习TS的学习笔记,其中也会掺杂一些学习心得.话不多说,先从基础 ...
- es7中数组如何判断元素是否存在
const arr = [1,2,3,4,5,6] console.log(arr.includes(4)) //true
- 痞子衡嵌入式:ARM Cortex-M内核那些事(3.2)- 安全模块看特性(M23/33/35P)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M功能模块,不过侧重点是三款安全特性处理器. ARM Cortex-M处理器家族发展至今(2020),已有8代产品 ...
- 机器学习-MNIST数据集使用二分类
一.二分类训练MNIST数据集练习 %matplotlib inlineimport matplotlibimport numpy as npimport matplotlib.pyplot as p ...
- SpringBoot实现简单的CRUD
CRUD-员工列表 实验要求: 1).RestfulCRUD:CRUD满足Rest风格: URI: /资源名称/资源标识 HTTP请求方式区分对资源CRUD操作 2).实验的请求架构; 3).员工列表 ...
- Day6-Python3基础-面向对象编程
面向过程 VS 面向对象 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大 ...