更改MongoDB数据存储目录


183

到目前为止,我尚未指定MongoDB数据目录,并且只有一个30 GB的主分区。

我刚花光了空间并添加了新硬盘。如何传输数据(显然在中/var/lib/mongodb/)并配置MongoDB,以使所有内容都在新磁盘上运行而不影响现有安装?


您还应该确保对新挂载点的权限为r + x:sudo chmod o+rx /media例如,如果您的挂载点为media。从第一个安装点开始,r + x必须对“其他”组和用户可用。
wordforthewise

Answers:


219

简短的答案是,--dbpathMongoDB 中的参数将允许您控制MongoDB从哪个目录读取和写入数据。

mongod --dbpath / usr / local / mongodb-data

将启动mongodb并将文件放在中/usr/local/mongodb-data

根据您的发行版和MongoDB安装,您还可以配置mongod.conf文件以自动执行此操作:

# Store data in /usr/local/var/mongodb instead of the default /data/db
dbpath = /usr/local/var/mongodb

官方的10gen Linux软件包(Ubuntu / DebianCentOS / Fedora)附带了一个基本配置文件,该文件位于中/etc/mongodb.conf,并且MongoDB服务在启动时会读取此文件。您可以在这里进行更改。


9
在我的Debian机器上,它是mongodb.conf,而不是mongod.conf
UpTheCreek 2012年

12
/etc/mongodb.conf根据此解决方案进行了更新。然后,启动后mongod,我看到它/data/db已被使用。为什么更新mongodb.conf不会影响mongod将数据库存储在何处?(请注意,使用--dbpath论证工作。
凯文·梅雷迪思

在我的Fedora盒子上/etc/mongodb.conf,更新对我来说很好。
tuxdna 2014年

4
chown服务启动脚本需要将新的数据目录传递给mongod用户。
Pete Garafano 2014年

我应该怎么做?
chovy

102

在2分钟的停机时间内解决了该问题:)
只需移动文件夹,添加符号链接,然后调整权限即可。

sudo service mongod stop
sudo mv mongodb /new/disk/mongodb/
sudo ln -s /new/disk/mongodb/ /var/lib/mongodb
sudo chown mongodb:mongodb /new/disk/mongodb/
sudo service mongod start

# test if mongodb user can access new location:
sudo -u mongodb -s cd /new/disk/mongodb/
# resolve other permissions issues if necessary
sudo usermod -a -G <newdisk_grp> mongodb

3
我认为这应该是答案。我总能找到符号链接是一个很好的解决方案,我提倡的任何解决方案使用它们在配置改变等。
家伙mograbi

可能不需要usermod。您在dbpath的树上缺少对“其他”用户的+ x可执行权限chmod -R o+x /<home>。参见: stackoverflow.com/a/38193187/205049
oori

我遵循这些说明(在另一张磁盘中使用dbpath),我仍在获取Permission denied: "/var/lib/mongodb"这是/home/../mongodb/mongodb/的样子: drwxrwxr-x 3 mongodb mongodb 4096 oct 13 09:32 ../ drwxr-xr-x 2 mongodb nogroup 4096 oct 13 09:29 journal/ -rw------x 1 mongodb nogroup 67108864 sep 23 14:44 local.0* -rw------x 1 mongodb nogroup 16777216 sep 23 14:44 local.ns* -rwxr-xr-x 1 mongodb mongodb 0 oct 13 09:29 mongod.lock*
Machinerium

1
需要弄清运行mv命令时您在哪个文件夹中,如果您从lib内部运行mv命令,则不再需要mongodb ln
Andy

1
我已经尝试了您的解决方案,但是当我重新启动应用程序时,它出现以下错误-2019-11-18T18:58:45.215 + 1100我在initAndListen中存储了[initandlisten]异常:28596无法确定数据目录/中的锁定文件状态var / lib / mongo:boost :: filesystem :: status:权限被拒绝:“ / var / lib / mongo /
mongod.lock

32

如果您想更改默认路径,以下命令将为您工作。只需在mongodb的bin目录中键入此内容即可。

mongod --dbpath=yourdirectory\data\db

如果您也要移动现有数据,则只需在执行命令之前将所有文件夹从现有data \ db目录复制到新目录即可。

并停止正在运行的现有mongodb服务。


1
这也适用于Linux。我在mondod脚本旁边创建了一个名为“ data”的目录,并按以下方式运行它:./mongod --dbpath = data
cagdasalagoz

29

如果没有,请在MongoDB文件夹中创建一个名为mongod.cfg的文件。就我而言:C:\ Users \ ivanbtrujillo \ MongoDB

然后,使用记事本编辑mongod.cfg,并添加以下内容(我们的自定义dbpath):

dbpath=C:\Users\ivanbtrujillo\MongoDB\data\db

在此文件中,您还应该指定日志路径。我的mongod.cfg文件是:

logpath=C:\Users\ivanbtrujillo\MongoDB\log\mongo.log
dbpath=C:\Users\ivanbtrujillo\MongoDB\data\db

如果将mongoDB用作Windows服务,则必须更改此密钥并指定mongod.cfg文件。

要将mongodb安装为Windows服务,请运行以下命令:

**"C:\Users\ivanbtrujillo\MongoDB\bin\mongod.exe" --config "C:\Users\ivanbtrujillo\MongoDB\mongod.cfg" install**

打开regedit.exe并转到以下路径:

HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\services\MongoDB

MongoDB服务不起作用,我们必须编辑ImagePath项,删除其内容并放入以下内容:

**"C:\Users\ivanbtrujillo\MongoDB\bin\mongod.exe" --config "C:\Users\ivanbtrujillo\MongoDB\mongod.cfg" 
--logpath="C:\Users\ivanbtrujillo\MongoDB\log\mongo.log" service**

我们指示mongo它的配置文件及其日志路径。

然后,当您启动mongodb服务时,它将起作用。

这是在Windows中安装mongoDB的完整教程: http

希望能帮助到你,


1
MongoDB 2.6及更高版本使用YAML配置文件。为了向后兼容,仍支持旧格式,但是您可能要使用新格式。详细信息在这里
gronostaj

dbpath变量也适用于Linux。在/etc/mongod.conf中查看。
xpros

23

将的内容复制/var/lib/mongodb/data/db。您要查找的文件应具有类似的名称 your_db_name.nsyour_dbname.n其中n一个以0开头的数字。如果在下看不到此类文件/var/lib/mongodb,请在文件系统上搜索它们。

复制完成后,--dbpath=/data/db在通过mongod命令启动MongoDB时使用。


有没有办法让每次服务器重新启动都发生这种情况?
user4951 2012年

1
@JimThio,您可以将此开关添加到启动mongodb的shell脚本中。通常是/etc/init.d/mongod或/etc/init.d/mongodb。
lobster1234 2012年

19

这是我所做的,希望对其他人有所帮助:

脚步:

  1. 停止使用mongodb的服务
  2. 停止mongod-我的操作方式是使用rc文件/etc/rc.d/rc.mongod stop,如果您使用其他内容(例如systemd),则应检查文档以了解如何执行此操作
  3. 在新硬盘上创建一个新目录 -mkdir /mnt/database
  4. 确保mongodb具有从该目录读取/写入的权限(通常是chown mongodb:mongodb -R /mnt/database/mongodb)-感谢@DanailGabenski。
  5. 将mongodb的数据文件夹复制到新位置 -cp -R /var/lib/mongodb/ /mnt/database/
  6. 删除旧的数据库文件夹 -rm -rf /var/lib/mongodb/
  7. 创建到新数据库文件夹的符号链接 -ln -s /mnt/database/mongodb /var/lib/mongodb
  8. 开始的mongod -/etc/rc.d/rc.mongod start
  9. 检查您的mongod 的日志并进行一些完整性检查(尝试mongo连接到数据库以查看一切是否正常)
  10. 启动您在第1点中停止的服务

无需告诉您在执行此操作时应特别小心,尤其rm -rf是在这样做时,但我认为这是最好的方法。

在mongod运行时,您永远不要尝试复制数据库dir,因为可能会有一些服务会对其进行读写操作,这会改变数据库的内容。


1
尽管答案很旧,但确实对我有用。您还需要确保mongodb用户拥有新目录和symlik才能正常工作。chown mongodb:mongodb -R /mnt/database/mongodb
Danail Gabenski

3
在第5点,使命令看起来像cp -rp / var / lib / mongodb / / mnt / database /。这将使文件夹的所有权和权限保持不变。
Ketan Ghumatkar '18

我已经尝试了您的解决方案,但是当我重新启动应用程序时,它出现以下错误-2019-11-18T18:58:45.215 + 1100我在initAndListen中存储了[initandlisten]异常:28596无法确定数据目录/中的锁定文件状态var / lib / mongo:boost :: filesystem :: status:权限被拒绝:“ / var / lib / mongo /
mongod.lock

10

如果通过apt-getUbuntu 12.04 安装,请不要忘记安装chown -R mongodb:nogroup /path/to/new/directory。另外,在以下位置更改配置/etc/mongodb.conf

提醒一下,该mongodb-10gen软件包现在是通过upstart启动的,因此配置脚本位于/etc/init/mongodb.conf

我刚刚经历了这一点,希望谷歌人觉得它有用:)


1

对我来说,用户mongod不是mongodb

sudo chown mongod:mongod /newlocation

如果服务失败,您可以查看错误日志:

/var/log/mongodb/mongod.log


0

在debian / ubuntu中,您需要编辑/etc/init.d/mongodb脚本。确实,此文件应该从/etc/mongodb.conf中拉取设置,但似乎没有拉取默认目录(可能是一个错误)

这有点hack,但是将它们添加到脚本中可以使其正确启动:

加:

DBDIR=/database/mongodb

更改:

DAEMON_OPTS=${DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --config $CONF run"}

至:

DAEMON_OPTS=${DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --dbpath $DBDIR --config $CONF run"}

如果要将数据库放在主目录而不是根目录中怎么办?
JesseBoyd '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.