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)