Mongodb基础

来自linux中国网wiki
跳到导航 跳到搜索

install

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/

yum or apt

sudo apt-get install gnupg
 wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -

echo "deb https://mirrors.tuna.tsinghua.edu.cn/mongodb/apt/debian buster/mongodb-org/5.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list

#Reload local package database.
sudo apt-get update
sudo apt-get install -y mongodb-org

systemctl restart  mongod


MongoDB国内apt yum镜像使用帮助

yum mongodb 4.2

官方文档真的讲得非常 好

https://docs.mongodb.com/v4.2/tutorial/install-mongodb-on-red-hat/

mkdir -p /data/db_data/mongodb

chown -R mongod.mongod /data/db_data/mongodb/


dbPath: /data/var/lib/mongo

mkdir -p  /data/var/lib/mongo
chown -R  mongod.mongod /data/var/lib/mongo

systemctl start  mongod.service 

php mongo

yum install  php74-php-pecl-mongodb #remi

Docker mongo

install in Docker

bin

wget  -c   https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.0.tgz
在国内 可能有点慢 可以放国个下载再拉回来 什么的 

mv mongodb-linux-x86_64-3.2.0/  /data/apps/mongodb
echo 'export PATH=$PATH:/data/apps/mongodb/bin/' >> /etc/profile

or 

cat >> /etc/profile <<EOF
export PATH=$PATH:/data/apps/mongodb/bin
EOF

source /etc/profile 

测试安装

portX 可选的指定端口,如果不填,默认为27017

新建一个目录data存放mongodb数据:
mkdir /data/apps/mongodb/data/

用以下其中一个命令启动mongod:
mongod --dbpath /data/apps/mongodb/data/
mongod --dbpath /data/apps/mongodb/data --auth 
mongod --dbpath /data/apps/mongodb/data     --config /etc/mongodb.conf    --auth

这时mongod已经启动,重新打开一个终端, 键入mongo进入交互程序:
$> mongo
> show dbs
...数据库列表



3. 导入初始数据
leanote初始数据存放在 leanote/mongodb_backup/leanote_install_data中。

root@mypi3b:/data/apps# ls leanote/mongodb_backup/leanote_install_data/
albums.bson		     has_share_notes.bson		    share_notebooks.bson
albums.metadata.json	     has_share_notes.metadata.json	    share_notebooks.metadata.json

 cat   leanote/mongodb_backup/leanote_install_data/albums.metadata.json 
{"indexes":[{"v":1,"key":{"_id":1},"name":"_id_","ns":"leanote_bin_test.albums"},{"v":1,"key":{"UserId":1},"name":"UserId_1","ns":"leanote_bin_test.albums","background":true}]}
 
打开终端, 输入以下命令导入数据。
$> mongorestore -h localhost -d leanote --dir leanote/mongodb_backup/leanote_install_data/


$> mongo
> show dbs # 查看数据库
leanote	0.203125GB
local	0.078125GB
> use leanote # 切换到leanote
switched to db leanote
> show collections # 查看表
files
has_share_notes
note_content_histories
note_contents

MongoDB安全认证 请双击

常用命令

MongoDB - 连接

MongoDB常用命令



查找 

 db.collection.find()
 换成你的库
 
> db.mydb.find()
{ "_id" : ObjectId("619792b73d53993339a009fe"), "name" : "linuxsa" }

> db.mydb.find().pretty()
{ "_id" : ObjectId("619740cf0fe2e9867c3bb115"), "name" : "linuxsa" }
> 



evan@myxps:~/downloads/mongosh-1.0.7-linux-x64/bin$ ./mongosh  --host 192.168.10.120  --port 27018
Current Mongosh Log ID:	614beac584f560bae1d83f92
Connecting to:		mongodb://192.168.10.120:27018/?directConnection=true


创建库 

use chat_im
#可以看到,我们刚创建的数据库 chat_im 并不在数据库的列表中, 要显示它,我们需要向 mongo 数据库插入一些数据。
db.chat_im.insert({"name":"evantest"})




> use runoob
switched to db runoob
> show collections
runoob
> db.runoob.find()
{ "_id" : ObjectId("617668fa664b838e6ce51bfd"), "name" : "菜鸟教程" }
> 






> show dbs #显示数据库列表 
> show collections #显示当前数据库中的集合(类似关系数据库中的表)
> show users #显示用户
> use <db name> #切换当前数据库,如果数据库不存在则创建数据库。 
> db.help() #显示数据库操作命令,里面有很多的命令 
> db.foo.help() #显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令 
> db.foo.find() #对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据) 
> db.foo.find( { a : 1 } ) #对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1
> db.dropDatabase() #删除当前使用数据库
> db.cloneDatabase("127.0.0.1") #将指定机器上的数据库的数据克隆到当前数据库
> db.copyDatabase("mydb", "temp", "127.0.0.1") #将本机的mydb的数据复制到temp数据库中
> db.repairDatabase() #修复当前数据库
> db.getName() #查看当前使用的数据库,也可以直接用db
> db.stats() #显示当前db状态
> db.version() #当前db版本
> db.getMongo() #查看当前db的链接机器地址
> db.serverStatus() #查看数据库服务器的状态


use djs_kuafu_4; 建库

db.addUser("name","passwd");授权

MongoDB 删除数据库的语法格式如下:
use 数据库名;
db.dropDatabase()
删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。
实例
以下实例我们删除了数据库 runoob。
首先,查看所有数据库:
> show dbsuse 



mongodb 常用命令
查看所有数据库
show dbs
查看当前选择的库
db
查看库下的所有集合
show tables
show collections
删除库(这种方式删除数据目录还会有数据文件夹的)
use dbname
db.dropDatabase()
用这个方式可以清理文件下的内容,然后删掉目录即可
use s1
db.dropDatabase()
db.repairDatabase()
删除集合
db.mytable.drop()

count - 查询记录条数
此操作符用于统计记录的条数。如下面的代码所示:

    db.users.find().count();


添加用户
use dbname
db.addUser('admin','123456')
更改密码
db.addUser("admin","a123456")
删除用户
db.system.users.remove({admin:"a123456"})
或者
db.removeUser('admin')
用户授权db.createUser({user:"su",pwd:"fenggu123$%^",roles:[ { role:"root", db:"admin" } ] });
db.auth('admin','a123456') ???????
查看用户列表
db.system.users.find()
查看所有用户
show users
关闭服务
> use admin
switched to db admin

db.shutdownServer();

mongod  --shutdown  --dbpath /database/mongodb/data/

查询集合 这里的集合users 相当于表
db.users.find()
> db.users.find()
{ "CreatedTime" : ISODate("2014-05-06T11:04:10.658Z"), "Email" : "[email protected]", "LeftIsMin" : false, "Logo" : "", "NoteListWidth" : 266, "NotebookWidth" : 160, "Pwd" : "$2a$10$OWcC141iTHwY/H48zaIpoe09j0jyNLgaHTB/HUuC2GFQNX3LGZtoG", "Theme"


条件查询
db.users.find({age:33})
多个条件查询
db.users.find({age:33}),({a:1,b:1})
查看负载
mongostat -h127.0.0.1:28018
-ufengguadmin -pfenggu123$%^ --authenticationDatabase=admin
备份所有
mongodump -h127.0.0.1:28018 -ufengguadmin '-pfenggu123$%^' -o /data/mongodb_backup/ --
authenticationDatabase=admin
恢复
mongorestore -h127.0.0.1:28018 -ufengguadmin -pfenggu123$%^ --db=s1 --
dir=/data/mongodb_backup/mongod_bak_now/2016_06_27/s1/ --authenticationDatabase=admin

MongoDB 创建数据库


MongoDB 创建数据库的语法格式如下:

    use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。


可以看到,我们刚创建的数据库 mydb 并不在数据库的列表中, 要显示它,我们需要向 mongo 数据库插入一些数据。

 use mydb
switched to db mydb

 > db.mydb.insert({"name":"linuxsa"})
    WriteResult({ "nInserted" : 1 })  


> show dbs
leanote	0.125GB
local	0.03125GB
mydb	0.0625GB


MongoDB 创建数据库

删除数据库

选中你要删除的,不然默认是test
> use c_image_service
switched to db c_image_service

查看你当前的库名 
> db 
c_image_service

#删除掉当前的库
db.dropDatabase()

https://www.runoob.com/mongodb/mongodb-dropdatabase.html

清空

> show dbs;
admin                 0.000GB
config                0.000GB
core_file_system      0.003GB
crm_customer_service  0.029GB
local                 0.000GB
> use crm_customer_service
switched to db crm_customer_service

> db.crm_cs_im_message.remove({})
WriteResult({ "nRemoved" : 107867 })

count - 查询记录条数

MongoDB 删除数据库

use runoob
db.dropDatabase()

备份还原

MongoDB官方提供了两套数据导入导出工具,

一般来说,进行整库导出导入时使用mongodump和mongorestore,这一对组合操作的数据是BSON格式,进行大量dump和restore时效率较高。 进行单个集合导出导入时使用mongoexport和mongoimport,这一对组合操作的数据是JSON格式,可读性较高。


云数据库 MongoDB > 最佳实践 > 导出导入

jan 132022

#here 2022
mongodump --host=127.0.0.1 --port=27017 --username=root --password="R3456" --out=./mongodump-2022

mongodump --host=172.16.0.26   --username=mongouser  --password="aaaaa"  --out=./mongodump-20220310pm

#her 
  mongorestore --host=172.16.0.34 --port=27017 --username=mongouser --password="123" --authenticationDatabase=admin mongodump-2022#数据目录 

备份库


备份指定库 april 2011

mongodump --host=ip --authenticationDatabase=admin  --username=mong  --password="36" --db=crm_  --out=./mongodump-crme-april



备份成功的测试 
mongodump --host=127.0.0.1 --port=27017 --username=root --password="DEVDddd^1" --out=./mongodump-2021

备份一个库  没密码的话 
mongodump -h 127.0.0.1 -d file_system -o  file_systemdate

还原库

还原有成功的测试 

mongorestore  ./image_service  #备份出来是有两个相同目录哦 可能要 cd 进入一个层目录 April 13 2022

#这样要求密码  ,看下能不能 不要的 
 mongorestore --host=127.0.0.1 --port=27017 --username=root --password="DEVDdevops^1ddd2ER3456666676" --authenticationDatabase=admin  mongodump-2021/



 #成功here  restore  NOv22
  mongorestore --host=127.0.0.1 --port=27017 --username=root --password="DEVDdevopsR3dddddd456" --authenticationDatabase=admin core_file_systemdate


 mongorestore --host 10.66.187.127:27017 -u mongouser -p thepasswordA1 --authenticationDatabase=admin --dir=/data/im

注意 记得 备份的是两种目录的
 eg   im/im/xxx.json
 
 
 
 


备份表

导出表叫 wechat
mongoexport --host=im.mongodb.server  --collection=wechat  --authenticationDatabase=admin --username=mong --password=mypasswd  --db crm --out wechat.json

sudo mongoexport -u userName -p passwd -d mongotest -c users -o /home/python/Desktop/mongoDB/users.json --type json

备份字段 导出字段

导出 mydb库中的wechat表中的 origin_id字段

--fields 是需要返回的字段  mongoexport  --help 可得到各种参数 

 mongoexport --host=172.16.1.27 --collection=wechat  --authenticationDatabase=admin --username=evan  --password=123345  --db mydb -f origin_id  --out  origin_id.json

带条件导出数据

我的条件写错了  少了个 and   api 库  callrecord 表中的  _id,origin_call_record_id 字段  条件是and 里面那个 
 mongoexport --host=192.16.1.27 --authenticationDatabase=admin   --username=evan --password=evanpasswd -d api  -c callrecord  --type=csv -f _id,origin_call_record_id -q '{"$and": [{"create_at": {"$gte": 1546272}}, {"ak_create_at": {"$lte": 1577808}}]}' \
    --out ./report.csv

mongodb 导出 带条件_mongodb导出指定条件数据

还原表

mongoimport


-- host :要导入的数据库 ip
--port :要导入的实例节点端口号
--username :数据库用户名
--password :数据库用户密码
--collection :要导入的表名
--db :要导入的表所在数据库名
--file :要导入的源文件路径(默认为当前文件夹)

mongoimport  --collection ai_session_conversa --db ai_xbot --file ai_session_conversa.json


mongodb备份之导出和导入某个表

mongodb进行整库备份与恢复,以及对单表的备份恢复,单表支持json格式和csv(excel)格式

监控

利用Zabbix监控MongoDB

1.mongostat

  是mongdb自带的状态检测工具,

    inserts/s 每秒插入次数
    query/s 每秒查询次数
    update/s 每秒更新次数
    delete/s 每秒删除次数
    getmore/s 每秒执行getmore次数
    command/s 每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令
    flushs/s 每秒执行fsync将数据写入硬盘的次数。
    mapped/s 所有的被mmap的数据量,单位是MB,
    vsize 虚拟内存使用量,单位MB
    res 物理内存使用量,单位MB
    faults/s   page faults
    locked % 被锁的时间百分比
    idx miss % 索引不命中所占百分比,提醒检查索引
    q t|r|w 当Mongodb接收到太多的命令而数据库被锁住无法执行完成,它会将命令加入队列。这一栏显示了总共、读、写3个队列的长度,都为0的话表示mongo毫无压力。高并发时,一般队列值会升高。
    conn 当前连接数
    time 时间戳
mongostat
insert query update delete getmore command dirty used flushes vsize  res qrw arw net_in net_out conn                time
   *0    *0     *0     *0       0     2|0  0.0% 0.7%       0 1.13G 121M 0|0 1|0   158b   71.3k   18 Nov  4 14:21:06.091
   *0    *0     *0     *0       0     1|0  0.0% 0.7%       0 1.13G 121M 0|0 1|0   157b   70.8k   18 Nov  4 14:21:07.093
   *0    *0     *0     *0       0     2|0  0.0% 0.7%       0 1.13G 121M 0|0 1|0   158b   71.1k   18 Nov  4 14:21:08.090
   *0    *0     *0     *0       0     1|0  0.0% 0.7%       0 1.13G 121M 0|0 1|0   157b   70.8k   18 Nov  4 14:21:09.093
   *0    *0

7启动脚本

https://github.com/mongodb/mongo/blob/master/rpm/mongod.service


[root@k8sn1 ~]# cat /etc/mongod.conf 
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
# path: /var/log/mongodb/mongod.log
path: /data/logs/mongod.log
# Where and how to store data.
storage:
dbPath: /data/apps/mongodb/data/
# dbPath: /var/lib/mongo 
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.

#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:

[root@k8sn1 ~]# cat /var/run/mongodb/mongod.pid
2376
[root@k8sn1 ~]# ll /var/run/mongodb/mongod.pid
-rw-r--r-- 1 mongod mongod 5 6月 16 15:24 /var/run/mongodb/mongod.pid

[root@k8sn1 ~]# cat /usr/lib/systemd/system/mongod.service 
[Unit]
Description=MongoDB Database Server
After=network.target
Documentation=https://docs.mongodb.org/manual
[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 for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target


#sysv from 
. /lib/lsb/init-functions
CONFIGFILE="/etc/mongod.conf"
PROGRAM="/usr/bin/mongod"
MONGOPID="/var/run/mongodb/mongod.pid"
LOCK="/data/apps/mongodb/mongo/mongod.lock"

test -x $PROGRAM || exit 0
case "$1" in
start)
ulimit -f unlimited
ulimit -t unlimited
ulimit -v unlimited
ulimit -n 64000
ulimit -m unlimited
log_begin_msg "Starting MongoDB server"
$PROGRAM -f $CONFIGFILE
log_end_msg 0
;;
stop)
log_begin_msg "Stopping MongoDB server"
# if [ -f $LOCK ]; then
# rm $LOCK
# fi
if [ ! -z "$MONGOPID" ]; then
kill $MONGOPID
fi
log_end_msg 0
;;
status)
;;
*)
log_success_msg "Usage: /etc/init.d/mongodb {start|stop|status}"
exit 1
esac
 
#!/bin/sh
# chkconfig: - 64 36
# description:mongod
case $1 in
start)
/usr/local/mongodb/bin/mongod --maxConns 20000 --config /usr/local/mongodb/mongodb.conf
;;
stop)
/usr/local/mongodb/bin/mongo 127.0.0.1:27017/admin --eval "db.shutdownServer()"
;;
status)
/usr/local/mongodb/bin/mongo 127.0.0.1:27017/admin --eval "db.stats()"
;;
esac

关闭

  1. 没有启动脚本 或者启动脚本不成功时 请用kill -2 ,kill -9 不好 还可以关闭不了呢 Oct 23 2021
 ps -ef | grep mongod
root      3894  6353  1 20:04 ?        00:00:04 /usr/bin/mongod -f /etc/mongod.conf
root      9366 30672  0 20:09 pts/12   00:00:00 grep --color=auto mongod
[root@beta- etc]# kill -2  3894 6353
[root@beta- etc]# ps -ef | grep mongod
root      9828 30672  0 20:09 pts/12   00:00:00 grep --color=auto mongod

启动/关闭mongodb

关闭 试过 有人说数据会清空 ,但是我试过 表还在的 

> use admin
switched to db admin
> db.shutdownServer()
Sat Oct 23 12:39:18.531 DBClientCursor::init call() failed
server should be down...
Sat Oct 23 12:39:18.543 trying reconnect to 127.0.0.1:27017
Sat Oct 23 12:39:18.544 reconnect 127.0.0.1:27017 failed couldn't connect to server 127.0.0.1:27017






mongod --fork --dbpath=/data/db --logpath=/data/db/mongod.log --rest --journal
--fork:以守护进程的方式运行MongoDB,关闭shell后不会停止,但要指定logpath
--dbpath:指定数据库目录,必须手动创建
--logpath:指定日志文件路径,注意是文件不是目录,不需要手动创建
--rest:启用MongoDb web 界面,web端口(默认28017)=db端口(默认27017)+1000
--journal:启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
可能出现的错误:
ERROR: child process failed, exited with error number 1
原因1:上次mongodb未正常关闭
解决方法是删除mongod.lock,该文件将mongodb锁上防止用户操作
# find / -name mongod.lock
/usr/local/mongodb/mongod.lock
# rm -f /usr/local/mongodb/mongod.lock

原因2:启动时logpath指定的日志文件没有创建,且有同名文件夹,所有程序创建不了
原因3:加了--journal,去掉试试,这个不太确定



在mongodb的启动时,在数据目录下,会生成一个mongod.lock文件。如果在正常退出时,会清除这个mongod.lock文件,若要是异常退出,在下次启动的时候,会禁止启动,从而保留一份干净的一份副本数据。有人可能会想到删除这个文件,建议请不要这么做。如果这么做,我们也不知道数据文件是否会损坏,如果mongod.lock文件阻止mongod的启动,请对数据文件进行修复,而不是简单的删除该文件


配置文件

mongodb配置文件mongo.conf binIP详解

mongodb配置文件的binIP详解

    binIP关乎到访问连接的限制

******************************************************************************************************

   net:
  port: 27017
  #bindIp: 192.168.0.136   #如果修改成本机Ip,那除了本机外的机器都可以连接(就是自己连不了、哈哈、蛋疼)
  #bindIp: 0.0.0.0               #改成0,那么大家都可以访问(共赢)
  #bindIp: 127.0.0.1           #改成127,那就只能自己练了(独吞)

MongoDB bindIp 与 bindIpAll

MongoDB在一次查询中获取多少条记录

每次显示20条只不过是mongo shell为了提高用户界面可读性而每次限止20条。在应用程序使用驱动进行交互的时候不会有这个问题。

你也可以修改这个20的数值。在shell下面输入:

DBQuery.shellBatchSize = 50

就会显示50条一次

docker-compose安装mongodb

docker-compose 安装mongo

docker-compose安装mongodb说明

docker-compose安装mongodb

docker-compose构建mongodb容器实例

参考

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

Linux部署MongoDB

linux 安装mongodb

www.runoob.com Linux平台安装MongoDB

https://www.mongodb.org.cn/

mongodb基本操作

MongoDb 快速入门教程

mongoDB基础入门一

https://www.mongodb.org.cn/tutorial/59.html

Linux 安装并使用 MongoDB



mongodb快速入门

win mongodb官网下载不了, MongoDB下载、安装、配置、使用,如何下载MongoDB数据库,MongoDB入门


NOSQL -- Mongodb的简单操作与使用(win10)

phpetc

Installing the MongoDB PHP Driver with PECL

MongoDB driver for PHP