更改 MongoDB 数据存储目录
Posted
技术标签:
【中文标题】更改 MongoDB 数据存储目录【英文标题】:Changing MongoDB data store directory 【发布时间】:2011-08-23 02:24:07 【问题描述】:到目前为止,我还没有指定 MongoDB 数据目录,并且只有一个 30 GB 的主分区。
我刚刚用完了空间并添加了一个新硬盘。如何传输我的数据(显然是在 /var/lib/mongodb/
中)并配置 MongoDB,以便一切都在新磁盘上运行而不影响我现有的安装?
【问题讨论】:
您还应该确保您对新挂载点的权限具有 r+x:sudo chmod o+rx /media
例如,如果您的挂载点是 media
。 r+x 需要从第一个挂载点对“其他”组和用户可用。
【参考方案1】:
将/var/lib/mongodb
的内容复制到/data/db
。您应该查找的文件应具有类似your_db_name.ns
和your_dbname.n
的名称,其中n
是一个以0 开头的数字。如果您在/var/lib/mongodb
下看不到此类文件,请在您的文件系统中搜索它们。
复制完成后,在通过mongod
命令启动 MongoDB 时使用--dbpath=/data/db
。
【讨论】:
有没有办法在每次服务器重启时都发生这种情况? @JimThio 您可以将此开关添加到启动 mongodb 的 shell 脚本中。通常是 /etc/init.d/mongod 或 /etc/init.d/mongodb。【参考方案2】:简短的回答是,MongoDB 中的--dbpath
参数将允许您控制 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/Debian 或 CentOS/Fedora)附带一个基本配置文件,该文件位于 /etc/mongodb.conf
中,MongoDB 服务在启动时会读取此文件。您可以在这里进行更改。
【讨论】:
在我的 debian 机器上是 mongodb.conf,而不是 mongod.conf 我根据这个解决方案更新了/etc/mongodb.conf
。然后,在启动mongod
之后,我看到/data/db
被使用了。为什么更新 mongodb.conf 不会影响 mongod 存储数据库的位置? (请注意,使用 --dbpath
参数有效。
在我的 Fedora 机器上它是 /etc/mongodb.conf
并且更新对我来说效果很好。
新的数据目录需要chown
'd 给 mongod 用户用于服务启动脚本。
我该如何做 chown?【参考方案3】:
如果在 Ubuntu 12.04 中通过apt-get
安装,请不要忘记chown -R mongodb:nogroup /path/to/new/directory
。另外,更改/etc/mongodb.conf
的配置。
提醒一下,mongodb-10gen
包现在是通过 upstart 启动的,所以配置脚本在 /etc/init/mongodb.conf
中
我刚刚经历了这个,希望 googlers 发现它有用:)
【讨论】:
【参考方案4】:在 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
【讨论】:
我认为这应该是答案。我总是发现符号链接是一个非常好的解决方案,并且我提倡使用它们来改变配置等的任何解决方案。 可能不需要usermod。您缺少对 dbpath 的树chmod -R o+x /<home>
上的“其他”用户的 +x 可执行权限。见:***.com/a/38193187/205049
我按照这些说明(在另一个磁盘中使用 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*
需要澄清当你运行mv
命令时你所在的文件夹在哪里,如果你从lib 中运行mv 命令,你不再有mongodb 到ln
到
我已经尝试过您的解决方案,但是当我重新启动应用程序时,它会出现以下错误 - 2019-11-18T18:58:45.215+1100 I STORAGE [initandlisten] initAndListen 中的异常:28596 无法确定状态数据目录 /var/lib/mongo 中的锁定文件: boost::filesystem::status: Permission denied: "/var/lib/mongo/mongod.lock", terminating【参考方案5】:
在 debian/ubuntu 中,您需要编辑 /etc/init.d/mongodb 脚本。 真的,这个文件应该从 /etc/mongodb.conf 中提取设置 但它似乎没有拉出默认目录(可能是一个错误)
这有点小题大做,但是将这些添加到脚本中可以使其正确启动:
添加:
DBDIR=/database/mongodb
改变:
DAEMON_OPTS=$DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --config $CONF run"
到:
DAEMON_OPTS=$DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --dbpath $DBDIR --config $CONF run"
【讨论】:
如果你想把数据库放在你的主目录而不是根目录下怎么办?【参考方案6】:如果没有,请在 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://ivanbtrujillo.herokuapp.com/2014/07/24/installing-mongodb-as-a-service-windows/
希望对你有帮助,
【讨论】:
MongoDB 2.6 及更新版本使用 YAML 配置文件。旧格式仍受支持以实现向后兼容性,但您可能希望使用新格式。详情here. dbpath 变量也适用于 linux。查看/etc/mongod.conf。【参考方案7】:这是我做的,希望对其他人有帮助:
步骤:
-
停止使用 mongodb 的服务
停止 mongod - 我的做法是使用我的 rc 文件
/etc/rc.d/rc.mongod stop
,如果你使用其他东西,比如 systemd,你应该检查你的文档如何做到这一点
在新硬盘上创建一个新目录 - mkdir /mnt/database
确保 mongodb 有权从该目录读取/写入(通常是 chown mongodb:mongodb -R /mnt/database/mongodb
) - 感谢 @DanailGabenski。
将 mongodb 的数据文件夹复制到新位置 - cp -R /var/lib/mongodb/ /mnt/database/
删除旧的数据库文件夹 - rm -rf /var/lib/mongodb/
创建指向新数据库文件夹的符号链接 - ln -s /mnt/database/mongodb /var/lib/mongodb
启动 mongod - /etc/rc.d/rc.mongod start
检查您的 mongod 的日志并进行一些健全性检查(尝试 mongo
连接到您的数据库以查看是否一切正常)
启动您在第 1 点停止的服务
没有必要告诉你这样做时应该小心,尤其是rm -rf
,但我认为这是最好的方法。
你不应该在 mongod 运行时尝试复制数据库目录,因为可能有服务从它写入/读取,这会改变你的数据库的内容。
【讨论】:
虽然是一个旧答案,但它确实对我有部分作用。您还需要确保 mongodb 用户拥有新目录和 symlik 才能使其正常工作。chown mongodb:mongodb -R /mnt/database/mongodb
在第 5 点,使命令看起来像 cp -rp /var/lib/mongodb/ /mnt/database/ 这将保持文件夹的所有权和权限不变。
我已经尝试过您的解决方案,但是当我重新启动应用程序时,它会出现以下错误 - 2019-11-18T18:58:45.215+1100 I STORAGE [initandlisten] initAndListen 中的异常:28596 无法确定状态数据目录 /var/lib/mongo 中的锁定文件: boost::filesystem::status: Permission denied: "/var/lib/mongo/mongod.lock", terminating【参考方案8】:
对我来说,用户是mongod
而不是mongodb
sudo chown mongod:mongod /newlocation
如果服务失败,您可以查看错误日志:
/var/log/mongodb/mongod.log
【讨论】:
【参考方案9】:如果您想更改默认路径,以下命令将适用于您。 在 mongodb 的 bin 目录中输入即可。
mongod --dbpath=yourdirectory\data\db
如果您也想移动现有数据,则只需在执行命令之前将现有 data\db 目录中的所有文件夹复制到新目录即可。
同时停止正在运行的现有 mongodb 服务。
【讨论】:
这也适用于 Linux。我在 mondod 脚本旁边创建了一个名为“data”的目录并像这样运行它:./mongod --dbpath=data【参考方案10】:我发现了一个导致符号链接失败的特殊情况:
我对 mongodb 进行了标准企业安装,但将 /var/lib/mongodb 更改为符号链接,因为我想为我的数据库文件夹使用 XFS 文件系统,为日志文件夹使用第三个文件系统。
$sudo systemctl start mongod(失败并显示没有写入 mongodb.log 的权限).. 但如果我使用相同的配置文件启动它会成功:
.. 作为外部驱动器 (ziggy) 的所有者,我能够启动 $mongod --config /etc/mongodb.conf --fork
我最终发现.. 符号链接指向不同的文件系统,而 mongodb(用户)没有权限浏览符号链接所引用的文件夹。符号链接和符号链接所引用的文件夹都对 mongod 用户具有广泛的权限,所以这没有意义吗?
/var/log/mongodb 已更改(从 std ent 安装)为符号链接,并且我之前检查过:
$ ll /var/log/mongodb lrwxrwxrwx 1 mongodb mongodb 38 Oct 28 21:58 /var/log/mongodb -> /media/ziggy/XFS_DB/mongodb/log/
$ ll -d /media/ziggy/Ext4DataBase/mongodb/log drwxrwxrwx 2 mongodb mongodb 4096 Nov 1 12:05 /media/ashley/XFS_DB/mongodb/log/
.. 但似乎没有任何意义.. 当然,用户 mongodb 对链接、文件夹和文件 mongodb.log 具有 rwx 访问权限 .. 但它无法通过符号链接找到它,因为 BASE 文件夹mongodb搜索不到媒体。
所以..我最终做到了: $ ll /媒体/ziggy/ . . drwx------ 5 ziggy ziggy 4096 Oct 28 21:49 XFS_DB/
发现有问题的缺少 x 权限..
$chmod a+x /media/ziggy/XFS_DB 解决了问题
事后看来似乎很愚蠢,但没有搜索到任何有用的东西。
【讨论】:
检查符号链接和文件的 selinux 标志以上是关于更改 MongoDB 数据存储目录的主要内容,如果未能解决你的问题,请参考以下文章