一、 情况准备
MongoDB 系列文章
- Linux CentOS7 情况下安装 MongoDB
- Windows 情况下安装 MongoDB
二、安装包下载
官网下载地点:https://www.mongodb.com/try/download/community
创建目次
- mkdir /usr/local/soft/mongo
- cd /usr/local/soft/mongo
复制代码 复制下载地点,然后直接在 Linux 服务器上使用 wget 下载。
- ## 实验,centos7.9 系统,安装mongodb7.x版本,不成功,非法指定,应该是缺少指令集
- sudo wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.11.tgz
- ## 换成 mongodb4.x 版本
- sudo wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.29.tgz
复制代码
- sudo wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.29.tgz
复制代码
三、 软件安装和启动
3.1 将下载好的安装包上传到 Linux 服务器某个目次下,并使用以下命令解压压缩包。
- tar -zxvf mongodb-linux-x86_64-rhel70-4.4.29.tgz
复制代码 3.2 将解压后的目次移动到 /usr/local 目次下,并改名为 mongodb 。
- mv tar -zxvf mongodb-linux-x86_64-rhel70-4.4.29 mongodb-4.0
- sudo chown ltkj:ltkj -R /usr/local/soft/mongo
复制代码 3.3 进入 mongo 目次,并创建文件夹 data,在 data 文件夹下再创建 db 文件夹(用于存放数据库数据)和 log文件夹(存放 mongo 日志)。然后为其设置可读写权限。
- # 进入目录
- cd /usr/local/soft/mongo/
- # 创建三个文件夹
- sudo mkdir -p /data/db/mongo/
- sudo mkdir -p /data/db/mongo/data
- sudo mkdir -p /data/db/mongo/log
- # 设置可读写权限
- sudo chmod 755 -R /data/db/mongo/
- # sudo chmod 666 -R /data/db/mongo/
- sudo chown ltkj:ltkj -R /data/db/mongo/
复制代码 3.4 在 mongodb-7.0 目次下新建设置文件 mongodb.conf(可选,但建议设置),打开文件输入以下内容。
- cd /usr/local/soft/mongo/mongodb-7.0
- mkdir conf
- cd conf
- vim mongodb.conf
复制代码- # 数据库数据存放目录
- dbpath=/data/db/mongo/data
- # 日志文件存放目录
- logpath=/data/db/mongo/log/mongodb.log
- # 使用追加的方式写日志
- logappend=true
- # 端口
- port=27017
- # 是否认证
- auth=true
- # 以守护进程方式在后台运行
- fork=true
- #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
- #即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复。
- journal=true
- storageEngine=wiredTiger #存储引擎,有mmapv1、wiretiger、mongorocks
- # 远程连接要指定ip,否则无法连接;0.0.0.0代表不限制ip访问
- bind_ip=0.0.0.0
复制代码 3.5 设置情况变量,使用 sudo vim /etc/profile 命令打开系统文件
按下字母 I 键,开始编辑,
在 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL 一行的上面添加如下内容:
- export MONGODB_HOME=/usr/local/soft/mongo/mongodb-4.0
- export PATH=$PATH:$MONGODB_HOME/bin
复制代码 保存,最后使用 source /etc/profile 命令重启系统设置。
3.6 完成以上步调即可启动 Mongo 服务。
- # -f 等同于--config
- [root@localhost mongodb-4.0]# ./bin/mongod -f /usr/local/soft/mongo/mongodb-4.0/conf/mongodb.conf
- about to fork child process, waiting until server is ready for connections.
- forked process: 12649
- ERROR: child process failed, exited with 1
- To see additional information in this output, start without the "--fork" option.
- [root@localhost mongodb-4.0]#
复制代码
启动报错:
mongodb出现启动失败 child process failed, exited with 1 To see additional information in this output
解决方式
造成这个报错的原因是 “MongoDB” 服务没有正常的关闭,非法关闭的时候,有一个 lock 文件 没有干掉,以是在第二次启动的时候检查到有 lock 文件的存在,就报这个错误了。
解决这个标题的方法,其实也很简朴:
- 检查创建的mongod.conf文件中两个path指向路径跟创建路径名是否一致。
- 检察服务有没有正常的关闭,存在xxx.lock 文件 没有干掉,进入db文件夹中找到举行删除 。
进入到数据存储路径,将该 “xxx.lock 文件” mongod.lock删除掉就好。
/data/db/mongo/ 是你的mongodb路径
- rm -rf /data/db/mongo/mongod.lock
复制代码 然后重启:执行命令
3.7 验证
使用安装目次下 bin 目次的 mongo 客户端命令连接和访问 MongoDB,默认会链接到 test 数据库。
- [root@localhost mongodb-4.0]# ./bin/mongo
- MongoDB shell version v4.4.29
- connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
- Implicit session: session { "id" : UUID("b514f571-0852-4794-a8f1-034b5ac652e0") }
- MongoDB server version: 4.4.29
- Welcome to the MongoDB shell.
- For interactive help, type "help".
- For more comprehensive documentation, see
- https://docs.mongodb.com/
- Questions? Try the MongoDB Developer Community Forums
- https://community.mongodb.com
- > db
- test
- >
复制代码
四、 其他设置
1 开放端口
CentOS 7 版本对防火墙举行了增强,不再使用原来的 iptables,而是启用 firewall 。默认情况下,不开放任何端口。以是假如需要对外开辟 MongoDB 服务,那么需要开放 MongoDB 的端口 。
- # 开放27017端口
- [root@chenpi mongodb]# firewall-cmd --zone=public --add-port=27017/tcp --permanent
- success
- # 让配置生效
- [root@chenpi mongodb]# firewall-cmd --reload
- success
- # 查看开放的端口,验证是否成功
- [root@chenpi mongodb]# firewall-cmd --zone=public --list-ports
- 6380/tcp 27017/tcp
- [root@chenpi mongodb]#
复制代码 2 检查服务状态
- # 查看 mongodb 进程状态
- [root@chenpi mongodb]# ps aux | grep mongo
- root 1566 1.6 6.4 1099452 64240 ? Sl 15:39 0:11 mongod -f /usr/local/mongodb/mongodb.conf
- root 1693 0.0 0.0 112812 972 pts/0 R+ 15:49 0:00 grep --color=auto mongo
- # 检查端口是否启动
- [root@chenpi mongodb]# netstat -lanp | grep 27017
- tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 1566/mongod
- tcp 0 0 172.22.17.128:27017 172.22.16.99:7424 ESTABLISHED 1566/mongod
- tcp 0 0 172.22.17.128:27017 172.22.16.99:7425 ESTABLISHED 1566/mongod
- unix 2 [ ACC ] STREAM LISTENING 22369 1566/mongod /tmp/mongodb-27017.sock
- [root@chenpi mongodb]#
复制代码 假如 netstat 命令没有找到,先举行安装。
3.在浏览器中输入网址:http://localhost:27017/ 。假如服务启动成功会看到以下一段话:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
4 开机自启动
使用 vim /usr/lib/systemd/system/mongodb.service 命令新建开机启动设置文件,输入以下内容保存。
- [Unit]
- Description=mongodb
- After=network.target remote-fs.target nss-lookup.target
- [Service]
- Type=forking
- ExecStart=/usr/local/soft/mongo/mongodb-4.0/bin/mongod -f /usr/local/soft/mongo/mongodb-4.0/conf/mongodb.conf
- ExecReload=/bin/kill -s HUP $MAINPID
- ExecStop=/usr/local/soft/mongo/mongodb-4.0/bin/mongod -f /usr/local/soft/mongo/mongodb-4.0/conf/mongodb.conf --shutdown
- PrivateTmp=true
- [Install]
- WantedBy=multi-user.target
复制代码 然后依次执行以下4个命令,使之见效。

- # 启动 mongodb
- [root@chenpi mongodb]# systemctl start mongodb.service
- # 查看服务状态
- [root@localhost mongodb-4.0]# systemctl start mongodb.service
- [root@localhost mongodb-4.0]# systemctl status mongodb.service
- ● mongodb.service - mongodb
- Loaded: loaded (/usr/lib/systemd/system/mongodb.service; disabled; vendor preset: disabled)
- Active: active (running) since 二 2024-06-25 15:26:19 CST; 3s ago
- Process: 15838 ExecStart=/usr/local/soft/mongo/mongodb-4.0/bin/mongod -f /usr/local/soft/mongo/mongodb-4.0/conf/mongodb.conf (code=exited, status=0/SUCCESS)
- Main PID: 15841 (mongod)
- CGroup: /system.slice/mongodb.service
- └─15841 /usr/local/soft/mongo/mongodb-4.0/bin/mongod -f /usr/local/soft/mongo/mongodb-4.0/conf/mongodb.conf
- 6月 25 15:26:18 localhost.localdomain systemd[1]: Starting mongodb...
- 6月 25 15:26:18 localhost.localdomain mongod[15838]: about to fork child process, waiting until server is ready for connections.
- 6月 25 15:26:18 localhost.localdomain mongod[15838]: forked process: 15841
- 6月 25 15:26:19 localhost.localdomain mongod[15838]: child process started successfully, parent exiting
- 6月 25 15:26:19 localhost.localdomain systemd[1]: Started mongodb.
- [root@localhost mongodb-4.0]#
- # 开机自启动
- [root@localhost mongodb-4.0]# systemctl enable mongodb.service
- Created symlink from /etc/systemd/system/multi-user.target.wants/mongodb.service to /usr/lib/systemd/system/mongodb.service.
- # 修改 mongodb.service文件时,重新加载文件
- [root@localhost mongodb-4.0]# systemctl daemon-reload
- [root@localhost mongodb-4.0]#
复制代码 5 启动重启停止服务
- systemctl start mongodb.service
- systemctl restart mongodb.service
- systemctl stop mongodb.service
复制代码 五、用户脚色和密码
启动 MongoDB 服务默认是没有账号密码的,即连接上即可举行各种操作。
但是我们在启动设置文件中,指定了 auth=true,即开启了认证,以是链接后需要认证才能执行操作。默认情况下,MongoDB 是没有管理员账户的,以是我们需要在 admin 数据库中使用 db.createUser() 命令添加管理员帐号或其他脚色。
————————————————
1 内置脚色
- 数据库用户脚色:read、readWrite
- 数据库管理脚色:dbAdmin、dbOwner、userAdmin
- 集群管理脚色:clusterAdmin、clusterManager、clusterMonitor、hostManager
- 备份规复脚色:backup、restore
- 全部数据库脚色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户脚色:root
- 内部脚色:__system
2 创建管理员账号
切换到 admin 数据库,使用以下命令创建管理账号,拥有操作全部数据库权限。
- [root@localhost mongodb-4.0]# ./bin/mongo
- > use admin
- switched to db admin
- > db.createUser({user:"admin",pwd:"123456",roles:[{"role":"userAdminAnyDatabase","db":"admin"},{"role":"readWrite","db":"admin"}]})
- Successfully added user: {
- "user" : "admin",
- "roles" : [
- {
- "role" : "userAdminAnyDatabase",
- "db" : "admin"
- }
- ]
- }
- >
- # 删除用户命令
- > db.dropUser("admin")
- true
- > db.system.users.find()
- >
- # 再次创建用户命令
- > db.createUser({user:"admin",pwd:"123456.com",roles:[{"role":"userAdminAnyDatabase","db":"admin"},{"role":"readWrite","db":"admin"}]})
- Successfully added user: {
- "user" : "admin",
- "roles" : [
- {
- "role" : "userAdminAnyDatabase",
- "db" : "admin"
- },
- {
- "role" : "readWrite",
- "db" : "admin"
- }
- ]
- }
- > db.system.users.find()
- { "_id" : "admin.admin", "userId" : UUID("2f74d519-6bc4-43b5-81dc-e1dd61e21777"), "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "RXbwVgHt+NKzesrTK0205g==", "storedKey" : "ZsmA7midK19FCRv5moEe+Bp9YX8=", "serverKey" : "8v9/ulQexUUOr9LsfrIukv8/LGI=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "GEhiS6f1N74zUTgcdXw6xOVyNn0H9W/FuTuDAQ==", "storedKey" : "uwotV7/jwYg80+dbHueG72euOh8nGiKEr3K54L1MAJI=", "serverKey" : "H7SCYnKjy/AFWImbQpekLpQqBXC3Fb69WNEAQsY0Pho=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" }, { "role" : "readWrite", "db" : "admin" } ] }
复制代码 3 验证
使用 mongo 命令连接上之后,假如不举行 db.auth(“用户名”,“密码”) 举行用户验证的话,是执行不了任务命令的,只有通过认证才可以。注意,每一个用户都需要在创建这个用户的认证库下举行认证。
- > use admin
- switched to db admin
- > db.auth("admin","123456")
- 1
- > show tables
- system.users
- system.version
- >
- ————————————————
复制代码 3-2 添加root用户
- db.createUser({
- user: 'root',
- pwd: 'lt.com',
- roles: [ { role: 'root', db: 'admin' } ]
- })
- db.grantRolesToUser(
- "root",
- [
- { role: "readWrite", db: "asset" },
- { role: "dbAdmin", db: "asset" }
- ]
- )
- db.grantRolesToUser(
- "root",
- [
- { role: "readWrite", db: "personnel" },
- { role: "dbAdmin", db: "personnel" }
- ]
- )
复制代码 4 演示对单个数据库创建用户和密码
寻常开辟中,一般新项目会创建新的数据库,而且创建一个新的数据库用户仅对此数据库举行读写。
创建数据库:
mongodb没有创建数据库的命令,假如要创建一个名称为personnel的数据库,需要先运行use personnel,之后插入数据,就可以创建school数据库。假如没有添加内容是不会创建的。
以下演示创建 ltkjtest 用户,密码为123456,并设置对 personnel 数据库读写的权限。注意,创建新用户前,先使用 admin 用户登录,因为我们刚才为 admin 用户设置了 userAdminAnyDatabase 权限。
- # 先使用有创建用户权限的用户登录
- > use admin
- switched to db admin
- > db.auth("admin","123456")
- 1
- # 新用户的认证库
- > show tables ;
- system.users
- system.version
- > use personnel
- switched to db personnel
- > show dbs;
- admin 0.000GB
- config 0.000GB
- local 0.000GB
- > db
- personnel
- > db.createCollection("sys_oper_log")
- { "ok" : 1 }
- > show dbs;
- admin 0.000GB
- config 0.000GB
- local 0.000GB
- personnel 0.000GB
- > show collections;
- sys_oper_log
- # 创建chenpi用户,密码123465,对nobody数据库有读写权限
- > db.createUser({user:'ltkjtest',pwd:'ltkj.test',roles:[{role:'readWrite',db:'personnel'}]})
- Successfully added user: {
- "user" : "ltkjtest",
- "roles" : [
- {
- "role" : "readWrite",
- "db" : "personnel"
- }
- ]
- }
复制代码 再创建一个asset 库
- > use admin
- switched to db admin
- > db.auth("root","lt.com");
- Error: Authentication failed.
- 0
- > db.auth("admin","lt.com");
- 1
- > use asset
- switched to db asset
- > db.createCollection("sys_oper_log");
- { "ok" : 1 }
- > db.sys_oper_log.insert({name:'test_111',sex:'1'})
- WriteResult({ "nInserted" : 1 })
- > db.createUser({
- ... user: "ltkjtest",
- ... pwd: "lt.test",
- ... roles: [
- ... { role: "readWrite", db: "asset" }
- ... ]
- ... });
- Successfully added user: {
- "user" : "ltkjtest",
- "roles" : [
- {
- "role" : "readWrite",
- "db" : "asset"
- }
- ]
- }
- >
- > db.grantRolesToUser("ltkjtest",
- ... [
- ... { role: "readWrite", db: "asset" },
- ... { role: "dbAdmin", db: "asset" }
- ... ]
- ... );
- >
- >
-
- # ======================= 修改用户密码 =======================
- use admin; // 切换到admin数据库
- // 修改用户密码 MongoDB 4.x版本
- db.changeUserPassword("username", "newPassword");
- // 修改用户密码 MongoDB 4.x版本
- db.runCommand({
- update: "system.users",
- updates: [{
- q: { user: "username", db: "dbname" },
- u: { $set: { pwd: "newPasswordHash" } } // 使用计算后的新密码哈希替换"newPasswordHash"
- }],
- writeConcern: { w: "majority" }
- });
- # ======================= 修改用户密码 =======================
- ```
- 常用命令:
复制代码 show dbs:显示数据库列表。
db:显示当前数据库,默认是test
show collections:显示当前数据库中表的聚集。
show users:显示全部用户
use dbName:切换当前数据库
db.help():显示数据库操作命令
db.createCollection(‘sys_oper_log’) # 创建聚集(表):
db.collectionName.help():显示聚集操作命令
- #### 创建数据库:
- mongodb没有创建数据库的命令,如果要创建一个名称为school的数据库,需要先运行use school,之后插入数据,就可以创建school数据库。如果没有添加内容是不会创建的。
- 
- 创建库后,必须得创建集合,否则库是不会创建的
- 
- (查不到)
- #### 创建集合(表):db.createCollection('teacher')
- 
- 再 show dbs; 有库了
- 
- #### 向school数据库里插入数据
复制代码 db.teacher.insert({name:‘zhangsan’,sex:‘male’})
db.teacher.insert({name:‘lisi’,sex:‘female’})
- 
- 查找所有记录db.teacher.find()
- 
- #### (_id是自动生成的)
- #### 查找性别为male的记录db.teacher.find({sex:'male'})
- 
- #### 查询指定列的数据
- ~~~
- db.teacher.find({},{name:1})
- db.teacher.find({},{name:1,_id:0}) _id列不返回
- ~~~
- 
- #### and查询:db.teacher.find({sex:'male',name:'lisi'})
- 
- (无记录)
- #### or查询:
- db.teacher.find({$or:[{sex:'male'},{name:'lisi'}]})
- 
- #### 格式化输出:db.teacher.find().pretty()
- 
- #### 修改数据
- db.teacher.update({name:'lisi'},{$set:{sex:'male'}},false,true)
- 语句作用:把姓名为lisi的记录的性别改为male。
- - 第3个参数作用:true:记录不存在就插入。
- - false:不插入新记录。默认false。
- - 第4个参数作用:false:只改满足条件的第一条;
- - true:更改满足条件的所有记录。默认false。
- 
- #### 删除数据:db.teacher.remove({name:'lisi'})
- 
- #### 删表:db.teacher.drop()
- 
- #### 删库:db.dropDatabase()
- 
- 退出shell:exit
- 在Linux操作系统下关闭服务 mongod -f mongodb.conf -shutdown
- ## 5 可视化工具连接
- 推荐使用可视化工具:Studio 3T For MongoDB,使用不同用户名和密码进行登录的时候,其可操作的数据库范围是不同的(角色设置原因)。
- #### 注意,当连接的数据库启动没有设置用户认证时,不用填写用户名和密码。
- 直接解压缩安装即可
- #### 因为studio3T是要破解的,目前我查到的破解都是延长他的试用期而已,所以我用的也是这个办法
- 操作步骤
- 一、 自己在桌面上创建批处理文件 并且命名为 : studio3t.bat
- 在里面输入
- ```
- @echo off
- ECHO 重置Studio 3T的使用日期......
- FOR /f "tokens=1,2,* " %%i IN ('reg query "HKEY_CURRENT_USER\Software\JavaSoft\Prefs\3t\mongochef\enterprise" ^| find /V "installation" ^| find /V "HKEY"') DO ECHO yes | reg add "HKEY_CURRENT_USER\Software\JavaSoft\Prefs\3t\mongochef\enterprise" /v %%i /t REG_SZ /d ""
- ECHO 重置完成, 按任意键退出......
- pause>nul
- exit
- ```
- 注意:保存的时候要注意保存为utf-8
- 二、然后将该文件 studio3t.bat 剪贴到这个路径:
- 测试连接图片
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |