Comment copier des bases de données MongoDB en utilisant PHP maintenant que copydb est obsolète

10

Dans MongoDB version 4.2 copydbet son copyDatabasewrapper sont obsolètes. Le manuel MongoDB suggère que nous devrions maintenant utiliser mongodumpet mongorestore. Mais j'appelais la commande de copie de PHP en utilisant le pilote PHP MongoDB et les commandes de vidage et de restauration sont des commandes qui doivent être exécutées à partir de la ligne de commande et n'ont pas d'équivalent PHP. Comment puis-je maintenant copier une base de données en PHP?

Carlos Granados
la source
1
Même s'il est possible d'exécuter mongodump / mongorestore à partir de PHP avec des fonctions de type shell_exec, il n'est guère possible de télécharger la base de données entière sur le client, puis de la télécharger à nouveau.
Alex Blex
Je suppose que je ne comprends pas votre flux de travail. Voulez-vous simplement créer une sauvegarde / restauration db sur la machine ou souhaitez-vous fournir une mise à jour / téléchargement de la même via un site Web / service (via php)?
mrgremlin
Je souhaite copier une base de données à des fins de test. Nous avons une base de données avec toute notre configuration initiale pour les tests et je veux la copier dans la base de données de test avant d'exécuter les tests. Cela a généralement été initié à distance via une demande traitée par PHP
Carlos Granados
1
Juste pour clarifier pourquoi une solution interne serait formidable: sur des systèmes comme Debian ou Alpine (dans les anciennes versions qui livraient toujours MongoDB), vous deviez installer un autre paquet pour des outils shell supplémentaires. Ceux-ci peuvent ne pas être présents sur tous les systèmes qui ont une configuration MongoDB en cours d'exécution
Nico Haase

Réponses:

3

Vous pouvez également utiliser "mongodump" et "mongorestore" comme vous l'avez mentionné. En PHP, vous pouvez utiliser shell_exec pour exécuter les commandes. Par exemple:

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

Veuillez noter que nsFrom et nsTo doivent renommer l'espace de noms si vous en avez besoin. Voir plus de détails ici .

Si vous souhaitez copier le vidage sur un autre hôte, essayez de combiner les paramètres --host de mongorestore. Donc, dans ce cas, votre commande de restauration serait:

$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
la source
1
C'est possible mais cela complique considérablement la configuration de l'application avec des dépendances CLI externes, il faudra réserver un espace SDD important sur tous les serveurs d'applications pour vider la base de données (plusieurs fois en cas de demandes simultanées), cela entraînera des coûts de transfert de données et peut être assez lent. En d'autres termes - c'est correct comme travail manuel ponctuel mais pas pour les systèmes de production.
Alex Blex
D'accord avec Alex Blex. Cette "solution" est juste 100% plus complexe que l'alternative précédente
Carlos Granados