上一篇我们已经安装配置好了mongoDB,并且我们也进入了mongo命令行
相当于我们已经连接上了数据库并可以进行操作了,先试着输入一句简单的语句
show dbs 查看所有数据库
我们可以看到这已经存在了这3个数据库
到了这里,是不是有点懵,为啥这么容易?我明明网上搜出来又是创建data文件夹log文件夹,又是创建config文件,又是安装windows服务,又是输入什么mongod --path XXX之类的指令启动服务,又是各种各样的参数啥的,还有端口什么的。看的头晕眼花了都,但为啥我刚安装好就已经可以操作了?而且确实查询到了数据库,甚至密码都不用输?还有这3个是啥东西,为什么我刚安装好就有了这三个数据库?
我刚开始就是这样的,一无所知,如果是之前的我,估计也就无所谓这些了,只要能用会用就行,可是这次我想钻一下牛角尖,把所有疑问都解决清楚。所以下面会是一段自问自答,但是我也只是个小菜鸟而已,担心可能会有些地方想的不对或完全想错了,大家如果看到哪里不对欢迎指正
1.为什么不用任何操作直接就能连接数据库?
因为数据库的服务器已经自动配置启动了一个默认的服务器,你可以当它是给我们懒人的福利,不用自己一步一步的操作,而是帮我们创建了默认的服务器。如果我们只是想自己本地搞些小东西直接使用,可以节省很多时间。但显然,我们在工作使用中涉及到重要数据时,是不会使用默认服务器的,理由不用多说,安全性太低了,所有人都知道mongodb的默认端口号是27017,而且我们没有设置授权的话,甚至不用密码就能连上。就好像我们的保险柜没有上密码就放在了人人都知道的地方一样。
2.端口是什么?数据库都有端口吗?
在网络基础的学习中,我知道了端口的意思,在这里我们可以当作它是一扇门,跟外界交流的大门。假设每个程序都是一个房子,有的程序不需要跟外界交互,他们就不需要门,也不需要端口。而有的程序需要跟外界交互,进行网络上的数据传输,这时他们就开了一个名为端口的门,端口号就是门牌号。
毕竟进行数据的传输,就必须把数据包送到正确的位置上才行,如果没有IP或端口,不就成了没有收货地址的快递么。IP+端口,构成了我们接受数据的地址,IP找到我们的主机,而端口,找到对应的程序。有时候不是在网络上,而是本机上就有两个程序要交互也是一样,他们会使用本地的“localhost+端口号”找到对应的程序进行传输。
数据库作为存放数据的仓库,理所应当应该有个端口,毕竟它存在的意义几乎就是存放提取数据。就算我们不在网络上,只是在本地的java里操作了数据库,那同样也是本机程序与程序之间的数据传输,也是要端口才能找到的。如果我们仅仅是需要把数据放在主机上,需要的时候再亲手打开那个文件查看取出数据,那还不如写个TXT来的方便实在。
3.如何启动数据库服务器?
首先我们看看数据库bin目录下的目录结构
下面有张表可以参考一下,其实我们主要记住4个就行了,mongo是我们平时使用的操作数据库的程序,mongod是启动数据库服务器的程序,mongoexport和mongoimport就是数据的导出导入程序。
也就是说,我们启动数据库服务器是靠mongod.exe这个程序的,在设定了环境变量后,我们可以在cmd里任意位置,直接输入mongod来启动服务器。但是自然,想启动服务器不是简单一个mongod就能搞定的,其中有很多参数需要我们设置,即便是默认启动了的mongodb服务器,也在我们看不到的地方加上了一些参数。
4.怎么创建启动一个新的数据库服务器?
上个问题我们已经知道了mongod.exe是数据库服务器的启动程序,mongo.exe是数据库客户端的操作程序。现在更深入的了解一下mongod是怎么启动服务器的。
首先我们需要知道一些参数,在启动的时候附带上去的参数,其他的大家可以百度或参考一下这个链接,我只说几个重点的https://www.cnblogs.com/wyt007/p/8627805.html
–dbpath:指定数据目录的位置,既然是数据库,就必须要指定好在哪里存放数据,才有可能启动然后操作。
–port:端口,前面我们已经说明了端口的重要性,自然在启动的时候就要手动给数据库服务器安排一个端口,当然不指定的话,默认是27017
要启动一个服务器,最基础的参数就是这两个了,只要有了它们,我们就可以随时启动一个新的数据库服务器,就像下图一样。
之前刚弄到这里的时候,我是这样想的:怎么这么久还没启动完?
基础一塌糊涂的我,之前一直以为数据库的启动就像把门打开,然后想关的时候再走过去把门关上。可是现在我知道了,启动数据库更像是“打开门后用手抵住门”。也就是说我们启动了服务后,它会一直这样运行下去,输出日志文件到命令行中,我们关掉这个cmd或ctrl+c终止进程时,数据库服务也就关闭了,就像我们松开了手一样。
看起来感觉挺麻烦的是不是,其实这只是一种前台启动服务器的方式,根据附带参数的不同,我们可以得到我们想要的各种启动方式,包括隐藏到后台服务啊,将日志导出到文件而不是显示在命令行啊,导入配置文件代替长长一大串的参数啊之类的。
5.默认的数据库服务器是怎么创建的?
通过默认数据库,让我们了解一下整个数据库服务器的启动流程,算是一个小例子。
首先我们看看默认的数据库服务器是用了什么指令开启的,找到服务里的mongodb服务器
右键查看其属性,可以看到它用了什么指令和参数
复制出来如下:
D:\lzh\MongDB 4.0.5\bin\mongod.exe" --config "D:\lzh\MongDB 4.0.5\bin\mongod.cfg" --service
前面是执行路径,在mongodb的安装目录下执行mongod.exe,我们前面已经知道了,它是数据库的启动文件。
然后是–config,接配置文件的路径,通过它我们不必输入很长的参数,只需要修改配置文件即可。
最后是–service,其实这个参数我一直没有弄清楚它到底是负责什么的,mongodb的文档里也没有这个参数,特别的是:如果我直接在命令行运行带–service的这个语句,是无法启动服务器的,删了–service后就可以启动了,而这时就变成服务里点启动会失败。所以我们就不深究它了,只当做它是在服务窗口里启动的必要参数就行了,要是谁知道是什么意思的话,欢迎在评论里告知。
然后我们再看config配置文件,文件主要内容如下
storage:
dbPath: D:\lzh\MongDB 4.0.5\data
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: D:\lzh\MongDB 4.0.5\log\mongod.log
net:
port: 27017
bindIp: 127.0.0.1
我们大概可以猜到他们分别是配置了什么,如前所说,存放数据的地址和端口是必须的,不过这里还有一些额外的配置。
storage.dbPath:设置数据存储文件目录
journal.enabled:开启和关闭journal,journal是mongodb用于数据故障恢复和持久化数据的一个功能
systemLog.destination:指定类型。如果指定为文件,必须同时指定systemLog.path
systemLog.logAppend:开启和关闭logAppend,它的作用是当你重启mongodb服务时,将新的日志追加到原来日志的后面,如果是false关闭着的,将创建一个新的日志文件
systemLog.path:指定日志文件的目录
net.port:设置mongodb的监听TCP端口
net.bindIp:设置mongodb服务器监听ip地址,默认是127.0.0.1
看了这些配置,我们也知道了默认服务器是怎么启动的了,但可能心里还有一个疑问,就是黑框框呢?我们启动了服务,配置里显然也没有隐藏黑框框的参数指令,那么命令行是怎么隐藏的?
是因为在我们安装好mongodb后,它已经在后台执行过一个启动指令了,而这个指令就加上了安装到windows服务里的参数,安装到服务里后就不会显示黑框了,我们启动和关闭只需要在服务列表里操作就行了,你也可以理解为:服务把黑框命令行藏起来了。
我们在看服务属性里的可执行文件路径时没有看到这个参数,是因为它只需要安装一次而已,我们启动服务的时候不需要再安装一次,所以就没有加上那些参数,下个问题里我会演示如何把启动安装到服务。
6.如何把启动数据库服务器安装到windows服务里?
我们在使用数据库的时候,自然也不希望每次开机后,启动服务器都要输长长一大串参数,并且还有个碍眼的黑框一直摆在那,不小心关掉了还会导致服务器关闭又得重新启动。
这个时候我们就应该把启动安装到windows服务列表里,一键开关,我现在简单的把流程演示一遍。
首先创建存放数据的文件夹,为了跟log日志区分开来,最好在里面再额外创建一个文件夹用来存放数据库数据
然后用管理员权限打开cmd命令行,输入以下指令,加粗代表是必要的,未加粗代表是可选择添加的参数
mongod --dbpath D:\data\db --logpath D:\data\log --logappend –port 10025 --directoryperdb –install --serviceName “Mongo2” --serviceDisplayName "Mongo2"
现在分析一下
mongod --dbpath D:\data\db --logpath D:\data\log --logappend --port 10025 --directoryperdb --install --serviceName “Mongo2” --serviceDisplayName “Mongo2”
--dbpath D:\data\db:作为存放数据的地址,是必要的
--logpath D:\data\log:指定存放日志文件的地址,由于我们安装了服务,黑框“隐藏”了,所以也是必要的
--logappend:上个问题里已经讲过了它的作用,不是必要的
--port 10025:指定端口,前面也说过了它的重要性,也是必要的
--directoryperdb:它可以把每个数据库保存在一个单独的目录,也就是优化了我们查看目录结构,不是必要的
--install:安装为Windows服务并退出,这就是我们安装为服务的核心语句了,是必要的
--serviceName "Mongo2":设定服务的名称,由于我们是额外安装服务,自然不能使用默认名,所以是必要的
--serviceDisplayName "Mongo2":设定服务的展示名称,由于我们是额外安装服务,自然不能使用默认名,所以是必要的
最后两个名称可能有点疑问,我们可以打开默认服务的属性看一下服务名称和展示名称的区别
话说回来,我们输入那一行指令后,服务就算创建成功了,服务列表里也可以看到了,很简单吧,现在我们只需要在列表里就可以启动或关闭服务了。
7.为什么我们不需要账户密码就可以连接数据库?
前面我们已经知道了如何启动数据库服务器了,而账户密码也是它的一个身份验证功能,使用方法是在启动时加上参数–auth启用验证,然后在我们连接上数据库后,可以通过设置创建用户,设置密码,等到下次登录连接时,就需要密码才能连接了。
8.可以在同一个地址启动多个数据库服务器吗?
我们可以在同一个地址安装多个windows服务,但是同一时间只能启动一个服务,这是由于数据目录下mongod.lock文件,它相当于一个锁,当我们启动第一个服务时,它就会锁上。
有时候,我们会对数据库感到有点迷惑,到底什么是区分不同数据库服务器的关键?是端口吗?每个端口代表一个服务器?还是服务?又或是data目录?
在我看来,我们存放数据的地方,也就是data,才是一个数据库的关键。端口是临时的,每次更换都没有问题。而服务,只是个快捷方式罢了。
这里我举个例子好了,文笔不好见谅
我们盖了个很大很大的房子(data),首先这个房子必须有门给我们对外交换东西(端口)。然后我们在里面放了很多东西(数据),这个房子很大我们也有钱任性,所以走到哪我们都可以开个门进去(不同端口),不一定非要从正门进。只是一次只能开那一扇门,我们在房子里时,别人就不能打开任何门(锁),除非他们也从我们开的门进来(连接数据库),或等我们出去门都关上了后(关闭服务器),他们才可以重新打开一扇门(启动服务器)。有一天我们突然不想让别人肆无忌惮的进房子了,于是我们这次在开门进去时,请了个锁匠(–auth设置验证),然后在里面设置了密码锁(创建admin用户),现在其他人不管是进房子还是想从我们进来的那个门进来,都要输入账户和密码了。可是有些亲戚也想进来,我们又不能不让他们进,但直接给了主密码又怕他们做手脚,而且有些房间也不想让他们进。
*启动总结
至此,我们大致能理解的mongodb是如何启动的了,也学习了如何按需求增减参数启动数据库服务器,接下来
参考链接:
https://blog.csdn.net/dgqjs/article/details/79424526
https://blog.csdn.net/haishuitian1/article/details/42619043
https://www.jb51.net/article/87914.htm
https://docs.mongodb.com/manual/reference/program/mongod.exe/
https://www.cnblogs.com/renjing/p/mongo-service-install.html
https://blog.csdn.net/baidu_31992575/article/details/79675957