Изменение каталога хранилища данных MongoDB

184

До сих пор я не указывал каталог данных MongoDB, и у меня был только один основной раздел размером 30 ГБ.

Мне просто не хватило места и добавил новый жесткий диск. Как я могу передать свои данные (которые, очевидно, в /var/lib/mongodb/) и настроить MongoDB так, чтобы все работало с нового диска, не влияя на мою существующую установку?

Марк Гилл
источник
Вы также должны убедиться, что ваши разрешения для новой точки монтирования имеют r + x: sudo chmod o+rx /mediaнапример, если ваша точка монтирования media. R + x должен быть доступен для «других» групп и пользователей с первой точки монтирования.
словами

Ответы:

219

Короткий ответ: --dbpathпараметр в MongoDB позволит вам контролировать, из какого каталога 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 считывает это при запуске. Вы можете внести свои изменения здесь.

Брендан В. Макадамс
источник
9
На моем Debian Box это mongodb.conf, а не mongod.conf
UpTheCreek
12
Я обновил в /etc/mongodb.confсоответствии с этим решением. Затем, после запуска mongod, я увидел, что /data/dbбыло использовано. Почему обновление mongodb.conf не повлияло на то, где mongod хранил базу данных? (Обратите внимание, что использование --dbpathаргумента сработало.
Кевин Мередит,
На моей коробке Fedora это /etc/mongodb.confи обновление, которое прекрасно работает для меня.
смокинг
4
Новый каталог данных должен быть chownпредоставлен пользователю mongod для сценариев запуска службы.
Пит Гарафано
как я делаю chown?
Чови
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
DmitrySandalov
источник
3
Я думаю, что это должен быть ответ. Я всегда нахожу символические ссылки очень хорошим решением, и я продвигаю любое решение, которое использует их
вместо
Вероятно, нет необходимости в usermod. Вам не хватает + 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команду, если вы запускаете команду mv из lib, у вас больше нет mongodb to lnto
Andy
1
Я пробовал ваше решение, но при перезапуске приложения оно выдает следующую ошибку - 2019-11-18T18: 58: 45.215 + 1100 I ХРАНЕНИЕ [initandlisten] исключение в initAndListen: 28596 Невозможно определить состояние файла блокировки в каталоге данных / var / lib / mongo: boost :: filesystem :: status: В доступе отказано: "/var/lib/mongo/mongod.lock", завершение
Арун Чаухан
33

Следующая команда будет работать для вас, если вы хотите изменить путь по умолчанию. Просто введите это в каталоге bin mongodb.

mongod --dbpath=yourdirectory\data\db

Если вы хотите переместить существующие данные, просто скопируйте все папки из существующего каталога data \ db в новый каталог, прежде чем выполнять команду.

А также остановите существующие службы mongodb, которые работают.

Йогеш Санчихар
источник
1
Это работает и в Linux. Я создал каталог с именем "data" рядом со скриптом mondod и запустил его так: ./mongod --dbpath = data
cagdasalagoz
29

Создайте файл mongod.cfg в папке MongoDB, если у вас его нет. В моем случае: 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**

Мы указываем Монго, что это конфигурационный файл и его лог-путь.

Затем, когда вы запускаете сервис mongodb, он работает.

Вот полное руководство по установке mongoDB в Windows: http://ivanbtrujillo.herokuapp.com/2014/07/24/install-mongodb-as-a-service-windows/

Надеюсь, поможет,

ivanbtrujillo
источник
1
MongoDB 2.6 и новее используют файлы конфигурации YAML. Старый формат все еще поддерживается для обратной совместимости, но вы можете использовать новый. Подробности здесь .
Гроностай
Переменная dbpath также существует для Linux. Посмотрите в /etc/mongod.conf.
xpros
23

Скопируйте содержимое /var/lib/mongodbв /data/db. Файлы , которые должны искать должны иметь имена , как your_db_name.nsи your_dbname.nгде nэто число , начиная с 0. Если вы не видите такие файлы в /var/lib/mongodb, искать их в файловой системе.

После копирования используйте --dbpath=/data/dbпри запуске MongoDB с помощью mongodкоманды.

lobster1234
источник
Есть ли способ, чтобы это происходило каждый раз при перезагрузке сервера?
user4951
1
@JimThio вы можете добавить этот ключ в скрипт оболочки, который запускает mongodb. Обычно это /etc/init.d/mongod или /etc/init.d/mongodb.
lobster1234
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, потому что могут быть службы, которые пишут / читают из него, что изменит содержимое вашей базы данных.

drinchev
источник
1
Хотя старый ответ, он работал частично для меня. Вы также должны убедиться, что пользователь mongodb владеет новым каталогом и символом, чтобы он работал. chown mongodb:mongodb -R /mnt/database/mongodb
Данаил Габенски,
3
В пункте 5 введите команду, похожую на cp -rp / var / lib / mongodb / / mnt / database /. Это сохранит право владения и разрешения папки.
Кетан Гуматкар
Я пробовал ваше решение, но при перезапуске приложения оно выдает следующую ошибку - 2019-11-18T18: 58: 45.215 + 1100 I ХРАНЕНИЕ [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, поэтому скрипт config находится в/etc/init/mongodb.conf

Я только что прошел через это, надеюсь, гуглеры посчитают это полезным :)

Роберто
источник
1

Для меня пользователь был mongodвместоmongodb

sudo chown mongod:mongod /newlocation

Вы можете просмотреть журналы ошибок, если служба не работает:

/var/log/mongodb/mongod.log

IP
источник
0

В 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"}
FGiorlando
источник
Что делать, если вы хотите поместить базу данных в свой домашний каталог вместо root?
ДжессиБойд