更改 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.nsyour_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 /&lt;home&gt; 上的“其他”用户的 +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 数据存储目录的主要内容,如果未能解决你的问题,请参考以下文章

mongodb数据库的存储问题

MongoDB应用场景及选型(海量数据存储选型)

mongodb 有数据文件 怎么恢复数据库

MySQL更改数据库数据存储目录

MySQL更改数据库数据存储目录

MySQL更改数据库数据存储目录