您的位置:首页 > 数据库 > Mongodb

CentOS7安装MongoDB及基础操作

2018-04-09 09:18 260 查看

安装环境说明

系统环境说明
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@master ~]# uname -r
3.10.0-693.el7.x86_64
[root@master ~]# hostname -I
192.168.174.200 192.168.122.1
软件版本
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.3.tgz

安装工作

创建用户
groupadd -g 800 mongodb
useradd  -u 806 -g mongodb  mongodb
修改密码
echo 123456 |passwd --stdin mongodb
创建目录
mkdir -p /usr/local/mongodb/27017/   &&\
cd  /usr/local/mongodb/27017/   &&\
mkdir  -p  bin  conf  log  data
下载程序
cd  /usr/local/mongodb/27017/
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.3.tgz
解压程序
tar xf  mongodb-linux-x86_64-rhel70-3.6.3.tgz
cd mongodb-linux-x86_64-rhel70-3.6.3/bin/ &&\
cp * /usr/local/mongodb/27017/bin
修改程序属性
chown -R mongodb:mongodb /usr/local/mongodb/27017
设置环境变量
su - mongod

cat >> .bash_profile <<'EOF'
export PATH=/usr/local/mongodb/27017/bin:$PATH
EOF
source .bashprofile
如提示.bashprofile不存在,执行vim .bashprofile即可
至此,安装工作完成

管理MongoDB

启动:mongod --dbpath=/usr/local/mongodb/27017/data --logpath=/usr/local/mongodb/27017/log/mongodb.log --port=27017 --logappend
关闭:mongod --shutdown  --dbpath=/usr/local/mongodb/27017/data --logpath=/usr/local/mongodb/27017/log/mongodb.log --port=27017 --logappend
 参数说明
参数
参数说明
--dbpath    
数据存放路径
--logpath   
日志文件路径
--logappend 
日志输出方式
--port      
启用端口号
--fork      
在后台运行
--auth      
是否需要验证权限登录(用户名和密码)
--bind_ip   
限制访问的ip
--shutdown
关闭数据库
--logpath 日志文件路径
--master 指定为主机器
--slave 指定为从机器
--source 指定主机器的IP地址
--pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。
--logappend 日志文件末尾添加
--port 启用端口号
--fork 在后台运行
--only 指定只复制哪一个数据库
--slavedelay 指从复制检测的时间间隔
--auth 是否需要验证权限登录(用户名和密码)

-h [ --help ]             show this usage information
--version                 show version information
-f [ --config ] arg       configuration file specifying additional options
--port arg                specify port number
--bind_ip arg             local ip address to bind listener - all local ips
bound by default
-v [ --verbose ]          be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
--dbpath arg (=/data/db/) directory for datafiles    指定数据存放目录
--quiet                   quieter output   静默模式
--logpath arg             file to send all output to instead of stdout   指定日志存放目录
--logappend               appnd to logpath instead of over-writing 指定日志是以追加还是以覆盖的方式写入日志文件
--fork                    fork server process   以创建子进程的方式运行
--cpu                     periodically show cpu and iowait utilization 周期性的显示cpu和io的使用情况
--noauth                  run without security 无认证模式运行
--auth                    run with security 认证模式运行
--objcheck                inspect client data for validity on receipt 检查客户端输入数据的有效性检查
--quota                   enable db quota management   开始数据库配额的管理
--quotaFiles arg          number of files allower per db, requires --quota 规定每个数据库允许的文件数
--appsrvpath arg          root directory for the babble app server
--nocursors               diagnostic/debugging option 调试诊断选项
--nohints                 ignore query hints 忽略查询命中率
--nohttpinterface         disable http interface 关闭http接口,默认是28017
--noscripting             disable scripting engine 关闭脚本引擎
--noprealloc              disable data file preallocation 关闭数据库文件大小预分配
--smallfiles              use a smaller default file size 使用较小的默认文件大小
--nssize arg (=16)        .ns file size (in MB) for new databases 新数据库ns文件的默认大小
--diaglog arg             0=off 1=W 2=R 3=both 7=W+some reads 提供的方式,是只读,只写,还是读写都行,还是主要写+部分的读模式
--sysinfo                 print some diagnostic system information 打印系统诊断信息
--upgrade                 upgrade db if needed 如果需要就更新数据库
--repair                  run repair on all dbs 修复所有的数据库
--notablescan             do not allow table scans 不运行表扫描
--syncdelay arg (=60)     seconds between disk syncs (0 for never) 系统同步刷新磁盘的时间,默认是60s

Replication options:
--master              master mode 主复制模式
--slave               slave mode 从复制模式
--source arg          when slave: specify master as <server:port> 当为从时,指定主的地址和端口
--only arg            when slave: specify a single database to replicate 当为从时,指定需要从主复制的单一库
--pairwith arg        address of server to pair with
--arbiter arg         address of arbiter server 仲裁服务器,在主主中和pair中用到
--autoresync          automatically resync if slave data is stale 自动同步从的数据
--oplogSize arg       size limit (in MB) for op log 指定操作日志的大小
--opIdMem arg         size limit (in bytes) for in memory storage of op ids指定存储操作日志的内存大小

Sharding options:
--configsvr           declare this is a config db of a cluster 指定shard中的配置服务器
--shardsvr            declare this is a shard db of a cluster 指定shard服务器
登入数据库
mongo
使用配置文件方式管理数据库
cd /usr/local/mongodb/27017/conf

vim mongodb.conf

dbpath=/usr/local/mongodb/27017/data
logpath=/usr/local/mongodb/27017/log/mongodb.log
port=27017
logappend=1
使用配置文件的启动和关闭
启动:mongod -f mongodb.conf
关闭:mongod -f mongodb.conf  --shutdown
使用配置文件后台运行
mongod -f mongodb.conf &
[b]3.X 版本官方推荐使用YAML格式配置文件[/b]
vim  mongodb.yaml

systemLog:
destination: file
path: "/usr/local/mongodb/27017/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/usr/local/mongodb/27017/data"
net:
port: 27017
启动:mongod -f mongodb.yaml
后台:mongod -f mongodb.yaml &  
关闭:mongod -f mongodb.yaml  --shutdown
在数据库中关闭数据库
mongo
use admin
db.shutdownServer()
注:

mongod进程收到SIGINT信号或者SIGTERM信号,会做一些处理

> 关闭所有打开的连接

> 将内存数据强制刷新到磁盘

> 当前的操作执行完毕

> 安全停止

切忌kill -9

数据库直接关闭,数据丢失,数据文件损失,修复数据库(成本高,有风险)
使用kill命令关闭进程

$ kill -2 PID
  原理:-2表示向mongod进程发送SIGINT信号。
或
$ kill -4 PID
  原理:-4表示向mognod进程发送SIGTERM信号。
使用脚本管理服务
vim /etc/init.d/mongod
#!/bin/bash
#
#MongoDB服务管理
#################################

MONGODIR=/usr/local/mongodb/27017/
MONGOD=$MONGODIR/bin/mongod
MONGOCONF=$MONGODIR/conf/mongodb.conf
InfoFile=/tmp/start.mongo

. /etc/init.d/functions

status(){
PID=`awk 'NR==2{print $NF}' $InfoFile`
Run_Num=`ps -p $PID|wc -l`
if [ $Run_Num -eq 2 ]; then
echo "MongoDB is running"
else
echo "MongoDB is shutdown"
return 3
fi
}

start() {
status &>/dev/null
if [ $? -ne 3 ];then
action "启动MongoDB,服务运行中..."  /bin/false
exit 2
fi
sudo su - mongodb -c "$MONGOD -f $MONGOCONF" >$InfoFile 2>/dev/null
if [ $? -eq 0 ];then
action "启动MongoDB"  /bin/true
else
action "启动MongoDB"  /bin/false
fi
}

stop() {
sudo su - mongodb -c "$MONGOD -f $MONGOCONF --shutdown"  &>/dev/null
if [ $? -eq 0 ];then
action "停止MongoDB"  /bin/true
else
action "停止MongoDB"  /bin/false
fi
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 1
esac

MongDB基础操作

查询操作

连接数据库
[root@master ~]# mongo 192.168.174.200:27017/admin
MongoDB shell version v3.4.13
connecting to: mongodb://192.168.174.200:27017/admin
MongoDB server version: 3.4.13
Server has startup warnings:
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten]
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten]
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten]
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten]
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-04-09T01:23:25.364+0800 I CONTROL  [initandlisten]
> db
admin
查看数据库版本
> db.version()
3.4.13
>
切换数据库
> use test;
switched to db test
> db
test
显示当前数据库
> db
test
> db.getName();
test
查看所有数据库
> show dbs;
admin  0.000GB
local  0.000GB
> show databases;
admin  0.000GB
local  0.000GB
查看当前数据库机器的连接地址
> db.getMongo()
connection to 192.168.174.200:27017

管理操作

创建数据库
> use mydb;
switched to db mydb
说明创建数据库:

当use的时候,系统就会自动创建一个数据库。

如果use之后没有创建任何集合。系统就会删除这个数据库。
> show dbs;
admin  0.000GB
local  0.000GB
mydb   0.000GB
> use mydbs;
switched to db mydbs
> db.dropDatabase()
{ "ok" : 1 }

删除数据库
> use mydbs;
switched to db mydbs
> db.dropDatabase()
{ "ok" : 1 }
说明删除数据库:
  如果没有选择任何数据库,会删除默认的test数据库创建集合方法一:> db.createCollection('a')
{ "ok" : 1 }
> db.createCollection('b')
{ "ok" : 1 }查看集合> show collections
a
b
> show getCollectionNames()
2018-04-09T16:41:33.145+0800 E QUERY [thread1] Error: don't know how to show [getCollectionNames()] :
shellHelper.show@src/mongo/shell/utils.js:919:11
shellHelper@src/mongo/shell/utils.js:672:15
@(shellhelp2):1:1
> db.getCollectionNames();
[ "a", "b" ]
> 方法二:说明:插入一个文档的时候,一个集合就会自动创建。
> db.c.insert({name:'test1','age':123})
WriteResult({ "nInserted" : 1 })
> db.c.insert({address:'haerbin'})
WriteResult({ "nInserted" : 1 })
查看集合内容> db.c.find()
{ "_id" : ObjectId("5acb28b94a893f4e9544610e"), "name" : "test1", "age" : 123 }
{ "_id" : ObjectId("5acb29444a893f4e9544610f"), "address" : "haerbin" }
> 重命名集合> db.c.renameCollection("d")
{ "ok" : 1 }
> show collections;
a
b
d
> 删除集合> db.a.drop();
true
> show collections;
b
d
> 批量插入500行数据> for(i=0;i<10000;i++){ db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()}); }
WriteResult({ "nInserted" : 1 })
> db.log.find();注:默认每页显示20条记录,当显示不下的的情况下,可以用it迭代命令查询下一页数据。
> DBQuery.shellBatchSize=50; # 每页显示50条记录
50
> db.log.findOne() # 查看第1条记录
> db.log.count() # 查询总的记录数
> db.log.find({uid:100}); # 查询UUID为100的数据

MongoBD中用户管理

用户权限说明
权限说明
Read                
允许用户读取指定数据库
readWrite           
允许用户读写指定数据库
dbAdmin             
允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin           
允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin        
只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase     
只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase
只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase
只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase  
只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root                
只在admin数据库中可用。超级账号,超级权限
更多关于用户权限的说明参照:https://docs.mongodb.com/manual/core/security-built-in-roles/创建用户语法{
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}语法说明user字段:用户的名字;

pwd字段:用户的密码;

cusomData字段:为任意内容,例如可以为用户全名介绍;

roles字段:指定用户的角色,可以用一个空数组给新用户设定空角色;

roles 字段:可以指定内置角色和用户定义的角色。创建管理员用户进入管理数据库use admin创建管理员用户,root权限db.createUser(
{
user: "root",
pwd: "root",
roles: [ { role: "root", db: "admin" } ]
}
) 注意创建管理员角色用户的时候,必须到admin下创建。
删除的时候也要到相应的库下操作。查看创建完用户的collections > show tables;
system.users # 用户存放位置
system.version查看创建的管理员用户
> show users
{
"_id" : "admin.root",
"user" : "root",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
>
验证用户是否可用> db.auth("root","root")
1 # 返回 1 即为成功创建完用户后在配置文件中开启用户验证cat >>/usr/local/mongodb/27017/conf/mongodb.yaml<<-'EOF'
security:
authorization: enabled
EOF

SQL与MongoDB语言对比

SQL语言与CRUD语言对照 
SQL Schema StatementsMongoDB Schema Statements
CREATE TABLE users (
id MEDIUMINT NOT NULL
AUTO_INCREMENT,
user_id Varchar(30),
age Number,
status char(1),
PRIMARY KEY (id)
)
Implicitly created on first insert() operation. The primary
key _idis automatically added if _id field is not specified.
db.users.insert( {
user_id: "abc123",
age: 55,
status: "A"
} )
However, you can also explicitly create a collection:
db.createCollection("users")
ALTER TABLE users
ADD join_date DATETIME
在Collection 级没有数据结构概念。然而在 document级,可以通过$set在
update操作添加列到文档中。
db.users.update(
{ },
{ $set: { join_date: new Date() } },
{ multi: true }
)
ALTER TABLE users
DROP COLUMN join_date
在Collection 级没有数据结构概念。然而在 document级,可以通过$unset
在update操作从文档中删除列。
db.users.update(
{ },
{ $unset: { join_date: "" } },
{ multi: true }
)
CREATE INDEX idx_user_id_asc
ON users(user_id)
db.users.createIndex( { user_id: 1 } )
CREATE INDEX
idx_user_id_asc_age_desc
ON users(user_id, age DESC)
db.users.createIndex( { user_id: 1, age: -1 } )
DROP TABLE users
db.users.drop()
插入/删除/更新 语句对比
SQL  Statements
MongoDB  Statements
INSERT INTO
users(user_id,
age
status)
VALUES ("bcd001",
45,
"A")
db.users.insert(
{ user_id: "bcd001", age:
45, status: "A" }
)
DELETE FROM users
WHERE status = "D"
db.users.remove( { status: "D" } )
DELETE FROM users
db.users.remove({})
UPDATE users
SET status = "C"
WHERE age > 25
db.users.update(
{ age: { $gt: 25 } },
{ $set: { status: "C" } },
{ multi: true }
)
UPDATE users
SET age = age + 3
WHERE status = "A"
db.users.update(
{ status: "A" } ,
{ $inc: { age: 3 } },
{ multi: true }
)
查询类操作对比 
SQL SELECT Statements
MongoDB find() Statements
SELECT *
FROM users
db.users.find()
SELECT id,
user_id,
status
FROM users
db.users.find(
{ },
{ user_id: 1, status: 1, _id: 0 }
)
SELECT user_id, status
FROM users
db.users.find(
{ },
{ user_id: 1, status: 1 }
)
SELECT *
FROM users
WHERE status = "A"
db.users.find(
{ status: "A" }
)
SELECT user_id, status
FROM users
WHERE status = "A"
db.users.find(
{ status: "A" },
{ user_id: 1, status: 1, _id: 0 }
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: