Подборка команд для обслуживания MongoDB. Команды вида db.… и rs.… выполняются в консоли mongo или mongosh, команды mongodump и mongorestore — в обычной командной строке. Комментарии в консоли MongoDB пишутся через //.
Пользователи и роли
Создать администратора с полными правами:
use admin
db.createUser(
{ user: "username",
pwd: "password",
roles: [ { role: "root", db: "admin" } ] })
Изменить роли пользователя, например оставить только чтение одной базы:
db.updateUser( "username",
{
roles : [
{ role : "read", db : "database" }
]
}
)
Посмотреть пользователей и сменить пароль:
show users // выполняется на основном узле
db.changeUserPassword("accountUser", "НовыйПароль")
Репликация
Насколько реплики отстают от основного узла:
rs.printSecondaryReplicationInfo()
Сделать узел предпочтительным основным: поднять ему приоритет. После применения узел с наибольшим приоритетом станет основным на ближайших выборах:
cfg = rs.conf() // текущая конфигурация
cfg.members[0].priority = 2 // приоритет узла с индексом 0
rs.reconfig(cfg) // применить
Подключения
Список клиентов, подключённых к серверу:
db.currentOp(true).inprog.forEach(function(d){if (d.client)printjson(d.client)})
Число подключений с каждого IP-адреса и общий итог. Удобно, когда нужно найти приложение, которое открывает слишком много соединений:
db.currentOp(true).inprog.reduce((accumulator, connection) => { ipaddress = connection.client ? connection.client.split(":")[0] : "unknown"; accumulator[ipaddress] = (accumulator[ipaddress] || 0) + 1; accumulator["TOTAL_CONNECTION_COUNT"]++; return accumulator; }, { TOTAL_CONNECTION_COUNT: 0 })
Бэкап и восстановление
Бэкап набора реплик с вторичного узла в один архивный файл. Ключ --oplog сохраняет изменения, сделанные во время копирования, поэтому бэкап получается согласованным. Вывод утилиты записывается в файл журнала:
mongodump --uri="mongodb://username:password@host1:27017,host2:27017,host3:27017/?replicaSet=rs_name&readPreference=secondary" --oplog --archive="/backup/mongo.archive" > /backup/mongodump.log 2>&1
Восстановление одной базы из такого архива на другой сервер:
mongorestore --username username mongodb://host_target:27017 --archive="/backup/mongo.archive" --nsInclude="Database.*"
Медленные запросы и журнал
Посмотреть настройки профилирования и записывать в журнал сервера запросы дольше 2,5 секунды, не включая сам профилировщик:
db.getProfilingStatus()
db.setProfilingLevel(0, 2500)
Начать новый файл журнала сервера, например перед разбором проблемы:
db.adminCommand( { logRotate : 1 } )
Остановка сервера и повреждённая база
Корректно остановить сервер, команда выполняется в базе admin:
use admin
db.shutdownServer()
Если база повреждена, служба при запуске может долго восстанавливать данные, а systemd обрывает её по тайм-ауту. Отключите тайм-аут запуска (systemctl edit mongod), и у базы будет время восстановиться, иногда на это уходит несколько часов:
[Service]
TimeoutSec=0
Удалить все документы из коллекции
Команда удаляет все документы коллекции без возможности отмены, сама коллекция и индексы остаются. Подробнее — в документации MongoDB:
use sample_mflix
db.collection_name.deleteMany({})