Как копировать базы данных MongoDB с помощью PHP теперь, когда copydb устарела

10

В MongoDB версия 4.2 copydbи ее copyDatabaseоболочка устарели. Руководство MongoDB предполагает, что теперь мы должны использовать mongodumpи mongorestore. Но я вызывал команду копирования из PHP с помощью драйвера PHP MongoDB, а команды dump и restore - это команды, которые нужно запускать из командной строки и не имеют никакого эквивалента PHP. Как я могу теперь скопировать базу данных с помощью PHP?

Карлос Гранадос
источник
1
Даже если есть возможность запустить mongodump / mongorestore из PHP с функциями вида shell_exec, вряд ли возможно загрузить всю базу данных на клиент, а затем загрузить ее обратно.
Алекс Блекс
Я думаю, я не понимаю ваш рабочий процесс. Вы просто хотите создать резервную копию / восстановление базы данных на машине или вы хотите обеспечить ее загрузку / загрузку через веб-сайт / службу (через php)?
Мргремлин
Я хочу скопировать базу данных для тестирования. У нас есть база данных со всей нашей первоначальной настройкой для тестирования, и я хочу скопировать ее в тестовую базу данных до запуска тестов. Обычно это инициировалось удаленно через запрос, обрабатываемый PHP
Карлос Гранадос
1
Просто чтобы прояснить, почему какое-то внутреннее решение было бы замечательно: в таких системах, как Debian или Alpine (в предыдущих версиях, которые все еще поставляли MongoDB), вам пришлось установить другой пакет для дополнительных инструментов оболочки. Они могут присутствовать не во всех системах с работающей установкой MongoDB
Nico Haase,

Ответы:

3

Вы также можете использовать "mongodump" и "mongorestore", как вы упомянули. В PHP вы можете использовать shell_exec для запуска команд. Например:

$backUpCommand = "mongodump --archive='/tmp/mongodump-dev-db' --db=dev";
shell_exec($backUpCommand);

$restoreCommand = "mongorestore --archive='/tmp/mongodump-dev-db' --db=test --nsFrom='test.*' --nsTo='examples.*'";
shell_exec($restoreCommand);

Обратите внимание, что nsFrom и nsTo должны переименовать пространство имен, если вам это нужно. Подробнее смотрите здесь .

Если вы хотите скопировать дамп на другой хост, попробуйте объединить --host params of mongorestore. Итак, в этом случае ваша команда восстановления будет выглядеть так:

$restoreCommand = "mongorestore --host=mongodb1.example.net --port=27017 --username=user --password=$PSWD --authenticationDatabase=admin --archive='/tmp/mongodump-dev-db' --db=test";
shell_exec($restoreCommand);
Раджат Арора
источник
1
Это возможно, но это значительно усложняет настройку приложения с внешними зависимостями CLI, для резервирования базы данных потребуется резервировать значительное пространство SDD на всех серверах приложений (несколько раз в случае одновременных запросов), это повлечет за собой затраты на передачу данных и может быть весьма медленный. Другими словами - это нормально, как разовая ручная работа, но не для производственных систем.
Алекс Блекс
Согласитесь с Алексом Блексом. Это «решение» на 100% сложнее, чем предыдущая альтернатива
Карлос Гранадос