Mongodb基础
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
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安全认证 请双击
常用命令
查找
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 - 查看正在执行的操作
查看正在执行的操作 db.currentOp() 查看系统执行的操作 db.currentOp(True) kill正在执行的操作 db.killOp(<operation id>)
删除数据库
选中你要删除的,不然默认是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 })
MongoDB 删除数据库
use runoob db.dropDatabase()
备份还原
MongoDB官方提供了两套数据导入导出工具,
一般来说,进行整库导出导入时使用mongodump和mongorestore,这一对组合操作的数据是BSON格式,进行大量dump和restore时效率较高。 进行单个集合导出导入时使用mongoexport和mongoimport,这一对组合操作的数据是JSON格式,可读性较高。
https://www.mongodb.com/docs/database-tools/mongodump/#mongodb-binary-bin.mongodump
https://www.mongodb.com/docs/v4.4/core/backups/
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 备份成功的测试 2022 sudo mongodump --host=172.16.9.9 --authenticationDatabase=admin --username=mongo --password="123456" --db=im --out=./mongodump-im.nov18 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
还原库
还原有成功的测试 2022 mongorestore ./image_service #备份出来是有两个相同目录哦 如下 s messages/messages/message.bson 如果 rsync 多了个目录 可能要 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
有个问题 参数不能太多 原来是数据有问题 不是mongo的事
error parsing command line options: too many positional arguments:
mongodb 导出 带条件_mongodb导出指定条件数据 https://blog.csdn.net/Henry_Wu001/article/details/122939697
还原表
mongoimport -- host :要导入的数据库 ip --port :要导入的实例节点端口号 --username :数据库用户名 --password :数据库用户密码 --collection :要导入的表名 --db :要导入的表所在数据库名 --file :要导入的源文件路径(默认为当前文件夹) mongoimport --collection ai_session_conversa --db ai_xbot --file ai_session_conversa.json
mongodb进行整库备份与恢复,以及对单表的备份恢复,单表支持json格式和csv(excel)格式
MongoDb查询表内容
db.表名.find({}) 表示查询所有记录
db.表名.find({uid:"12"}) 表示查询uid="12"的记录
db.表名.find({uid:"12"},{"uid":1,"uname":1,"_id":0}) 表示查询表中uid="12"的所有记录,返回字段为uid,uname两个字段"_id"不返回
db.表名.find({$or:[{"name":"sulin"},{"age":{"$gt":10}}]})
db.test.find({$where:function(){return this.age>10}})
监控
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
关闭
- 没有启动脚本 或者启动脚本不成功时 请用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,那就只能自己练了(独吞)
内存
如果机器上多个mongod混部,或者mongod跟其他的一些进程一起部署,则需要根据分给mongod的内存配额来配置 cacheSizeGB,按配额的60%左右配置即可。
4.改配置
mongod config
MongoDB的内存限制参数配置:
3.X: /etc/mongod.conf
4.X: /etc/mongod.conf.orig
#居然格式如下 小胖 1G 一般最小要求也是1G
# Where and how to store data.
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# engine:
# wiredTiger:
wiredTiger:
engineConfig:
cacheSizeGB: 1
MongoDB内存配置 --wiredTigerCacheSizeGB
MongoDB在一次查询中获取多少条记录
每次显示20条只不过是mongo shell为了提高用户界面可读性而每次限止20条。在应用程序使用驱动进行交互的时候不会有这个问题。
你也可以修改这个20的数值。在shell下面输入:
DBQuery.shellBatchSize = 50
就会显示50条一次
docker-compose安装mongodb
reference
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
www.runoob.com Linux平台安装MongoDB
https://www.mongodb.org.cn/tutorial/59.html
win mongodb官网下载不了, MongoDB下载、安装、配置、使用,如何下载MongoDB数据库,MongoDB入门
NOSQL -- Mongodb的简单操作与使用(win10)