Статья
MongoDB: перенос dbPath на новый диск
Диск уже размечен — остановить mongod, rsync данных, смонтировать UUID на /var/lib/mongodb, не меняя dbPath в конфиге.
/var/lib забился, mongod ушёл в failed. Новый SSD уже подключил и разметил (подключение SSD) — дальше нужно переложить данные MongoDB так, чтобы dbPath в конфиге остался /var/lib/mongodb. Так проще: не трогаем приложение и часто не лезем в AppArmor/SELinux-пути.
Что произошло
Типичный сетап:
- Ubuntu 22.04 (или рядом);
- MongoDB, часто Replica Set;
- новый диск, например
/dev/sdb1с XFS, пока без постоянного mount наdbPath.
Цель: данные на новом томе, путь для MongoDB тот же.
Как искал
Перед переносом сверил диск и текущий dbPath:
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,MODEL
grep -n "dbPath" /etc/mongod.conf
systemctl status mongod --no-pager
df -h /var/lib/mongodb
Ожидаю что-то вроде dbPath: /var/lib/mongodb и почти полный раздел под /var/lib.
Решение
Ниже диск уже с ФС (/dev/sdb1).
1. Временный mount
mkdir -p /mnt/mongo-new
mount /dev/sdb1 /mnt/mongo-new
df -h /mnt/mongo-new
2. Стоп и копирование
systemctl stop mongod
rsync -aHAX --numeric-ids /var/lib/mongodb/ /mnt/mongo-new/
Хвостовой / у источника важен: копируем содержимое каталога, не сам каталог вторым уровнем.
3. Подмена пути через fstab
Откат оставляю рядом:
umount /mnt/mongo-new
mv /var/lib/mongodb /var/lib/mongodb.old
mkdir -p /var/lib/mongodb
Постоянный mount по UUID на старый путь. Для ext4 замени тип ФС в строке fstab:
UUID=$(blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /var/lib/mongodb xfs defaults,nofail 0 2" >> /etc/fstab
mount -a
findmnt /var/lib/mongodb
df -h /var/lib/mongodb
chown -R mongodb:mongodb /var/lib/mongodb
4. Старт и проверка
systemctl start mongod
systemctl status mongod --no-pager
journalctl -u mongod -n 100 --no-pager
В RS с primary:
rs.status()
Старое дерево удаляю только после стабильной работы:
rm -rf /var/lib/mongodb.old
Rollback
Если что-то пошло не так:
systemctl stop mongod
umount /var/lib/mongodb
sed -i '\|/var/lib/mongodb xfs defaults,nofail|d' /etc/fstab
rm -rf /var/lib/mongodb
mv /var/lib/mongodb.old /var/lib/mongodb
chown -R mongodb:mongodb /var/lib/mongodb
systemctl start mongod
Итог
Схема, к которой возвращаюсь:
- Диск готов (GPT + XFS/ext4)
- Временный mount →
rsync -aHAX mongodb→mongodb.old, пустой mount point- UUID в
fstabна/var/lib/mongodb chown, старт, проверка RS- Удаление
.oldпосле стабилизации
dbPath в конфиге не меняю — меняю только то, что лежит под этим путём.