mongod.conf配置里配置storage.directoryPerDB: true 这样配置会依据数据库创建文件夹
某天mongo突然由于磁盘满了崩了,同事邱说直接删除对应库的文件夹可以,但是我们删除文件夹mongo会报找不到相应文件夹的错误(其实我在前一天删除了mongo的一个车辆对应数据库的文件夹测试了看下,当时短时间内查看了mongo连接工具好像没啥问题,难道是当时没有程序在查这辆车的数据所以没崩吗,后面没细关注了)
于是我们在一条磁盘没满的测试机上移除出某个车辆的库后尝试重启mongo,奔溃了,我们再将对应的文件夹移动回来,启动的话报错Failed to unlink socket file,需要删除一个/tmp/mongodb-17017.sock临时文件
再次启动会报一些文件的Permission denied(不知道为什么在上面的启动mongo过程中又会将用户组变成了/root/root),需要将用户组从/root/root改为/mongod/redis(mongo自动操作的文件赋予的组是/mongod/redis.奇怪)
用chown将所有文件的用户组修改回/mongod/redis,还是会报找不到我们移除出去再移回来的那个文件夹,看来这种删除文件夹来释放磁盘是不可行的方式.可能当时一小会没有问题,后面mongo重新启动或者涉及到代码查询这个库的时候还是会引起奔溃的
将mongo的数据存放目录全部清空,重新创建数据目录文件,修改用户组为/mongod/redis 并chmod 777(不然默认的会报只读文件错误)
此时再重启mongo,成功了.由于删除了所有文件,导致鉴权信息丢失了
然后开始用mongo命令行连接进行授权
./mongo 或者 (centos安装版直接敲 mongo)
//选择鉴权数据库
use admin
//创建root用户,root用户既可以创建用户,也可以对任何数据库操作,权限最高的
db.createUser({user: "sudy",pwd: "sudy@gjwg123456",roles: [{ role: "root", db: "admin" }]})
但是真实环境中不可能老是清空这些业务数据的,感觉可以通过将mongo的数据文件导入一个更大的目录,然后修改mongod.conf将数据目录指向新目录,然后启动mongo去删除数据.
直接删除文件夹不可行应该是由于WiredTiger.wt的文件和实际的数据文件的不匹配造成的,以下是WiredTiger文件的介绍
WiredTiger.wt文件是MongoDB使用WiredTiger存储引擎时使用的数据文件之一。它存储了所有集合的相关数据和索引文件的checkpoint信息。
WiredTiger是一个高性能、可扩展、易用的数据库引擎,适用于各种不同的使用场景。在MongoDB中,WiredTiger作为默认的存储引擎,从3.2版本开始支持。WiredTiger使用不同的文件格式和存储方式,相对于之前的MMAPv1存储引擎,具有更好的性能和扩展性。
WiredTiger.wt文件是WiredTiger存储引擎的核心文件之一。它存储了所有集合的数据和索引信息,以及相关的checkpoint信息。checkpoint是一个关键的数据库操作,它定期对数据库进行快照操作,将数据和索引信息保存到磁盘上,以确保数据的可靠性和恢复能力。
在WiredTiger.wt文件中,每个集合的数据和索引信息都存储在一个单独的文件中,以"collection--.wt"和"index--.wt"的形式分布在数据目录下。而WiredTiger.wt文件则存储了这些数据文件的checkpoint信息,用于在数据库发生故障时进行恢复。
在MongoDB中,WiredTiger.wt文件的生成和管理是由MongoDB的内部机制自动完成的,不需要手动干预。您只需要确保数据目录的可用性和访问权限即可。
总之,WiredTiger.wt文件是MongoDB使用WiredTiger存储引擎时用于存储所有集合的数据和索引信息,以及相关的checkpoint信息的核心文件之一。它是MongoDB正常运行所必需的文件之一,对于数据的可靠性和恢复能力具有重要的作用。