Jak skopiować bazy danych MongoDB za pomocą PHP, teraz, gdy copydb jest przestarzały

10

W MongoDB wersja 4.2 copydbi jego copyDatabaseopakowanie zostały wycofane. Podręcznik MongoDB sugeruje, że powinniśmy teraz używać mongodumpi mongorestore. Ale dzwoniłem do polecenia kopiowania z PHP za pomocą sterownika PHP MongoDB, a polecenia zrzutu i przywracania to polecenia, które muszą być uruchamiane z wiersza poleceń i nie mają żadnego odpowiednika w PHP. Jak mogę teraz skopiować bazę danych za pomocą PHP?

Carlos Granados
źródło
1
Nawet jeśli możliwe jest uruchomienie mongodump / mongorestore z PHP z funkcjami typu shell_exec, trudno jest pobrać całą bazę danych do klienta, a następnie przesłać ją z powrotem.
Alex Blex,
Chyba nie rozumiem twojego przepływu pracy. Czy chcesz po prostu utworzyć kopię zapasową / przywracanie bazy danych na komputerze, czy chcesz udostępnić / pobrać ją za pośrednictwem strony internetowej / usługi (przez php)?
mrgremlin,
Chcę skopiować bazę danych do celów testowych. Mamy bazę danych ze wszystkimi naszymi początkowymi ustawieniami do testowania i chcę ją skopiować do testowej bazy danych przed uruchomieniem testów. Zwykle było to inicjowane zdalnie przez żądanie obsługiwane przez PHP
Carlos Granados
1
Aby wyjaśnić, dlaczego niektóre wewnętrzne rozwiązania byłyby świetne: w systemach takich jak Debian lub Alpine (we wcześniejszych wersjach, które nadal dostarczały MongoDB), trzeba było zainstalować inny pakiet dla dodatkowych narzędzi powłoki. Mogą one nie być obecne we wszystkich systemach z uruchomioną konfiguracją MongoDB
Nico Haase,

Odpowiedzi:

3

Jak już wspomniałeś, możesz używać „mongodump” i „mongorestore”. W PHP możesz używać shell_exec do uruchamiania poleceń. Na przykład:

$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);

Uwaga: nsFrom i ns Aby zmienić nazwę przestrzeni nazw, jeśli jej potrzebujesz. Zobacz więcej szczegółów tutaj .

Jeśli chcesz skopiować zrzut na inny host, spróbuj połączyć parametry --host z sklepu mongorestore. W takim przypadku twoje polecenie przywracania wyglądałoby następująco:

$restoreCommand = "mongorestore --host=mongodb1.example.net --port=27017 --username=user --password=$PSWD --authenticationDatabase=admin --archive='/tmp/mongodump-dev-db' --db=test";
shell_exec($restoreCommand);
Rajat Arora
źródło
1
Jest to możliwe, ale znacznie komplikuje konfigurację aplikacji z zewnętrznymi zależnościami CLI, będzie wymagać zarezerwowania znacznej przestrzeni SDD na wszystkich serwerach aplikacji, aby zrzucić bazę danych (wiele razy w przypadku równoczesnych żądań), poniesie koszty transferu danych i może być dość powolny. Innymi słowy - jest to jednorazowe ręczne zadanie, ale nie w przypadku systemów produkcyjnych.
Alex Blex,
Zgadzam się z Alexem Blexem. To „rozwiązanie” jest tylko o 100% bardziej złożone niż poprzednia alternatywa
Carlos Granados