Moyen le plus rapide (le moins d'étapes) pour importer localement une base de données distante à l'aide de WP-CLI

13

Je voudrais automatiser la tâche d'importation d'une base de données distante à l'aide de WP-CLI .

Le processus en cours consiste à sshaccéder au serveur et à exécuter un exportfichier à l'aide de WP-CLI , copiez le fichier dans un répertoire local via scpou rsync, puis importle fichier via WP-CLI. Je voudrais utiliser un @aliaset supprimer autant d'étapes que possible ici.

Alors que je voudrais penser que quelque chose comme ça est possible:

echo "$(wp @remote db export -)" | wp @local db import -

Avec une taille de base de données> 5 Go non compressée, cela semble être une option plus viable:

DB_EXPORT=$(echo "$(wp @remote db export -)" | gzip | base64 -w0); echo "$DB_EXPORT" | base64 -d | gunzip | wp @local db import -

Malheureusement, je peux atteindre les limites du terminal ou la structure de cet appel doit être nettoyée car ma fenêtre semble juste se bloquer.

Existe-t-il une autre solution que je peux supprimer scpde ce processus? Y a-t-il d'autres commandes que je pourrais utiliser ici? J'ai supprimé plusieurs sites des exemples ici, mais c'est aussi quelque chose à considérer qui pourrait faire partie de l'alias.

Idéalement, j'espère quelque chose comme ça à l'avenir:

wp @local db import @remote


Exemple de configuration actuelle d'utilisation @aliasavec la boîte Basic Vagrant .

~/.wp-cli/config.yml

@basic:
    ssh: basic.dev/var/www/wordpress/

~/.ssh/config

Host basic.dev
    HostName basic.dev
    User vagrant
    IdentityFile ~/sites/basic.dev/.vagrant/machines/default/virtualbox/private_key

Mises à jour

Sur la base de @davemac, il semble que ce processus pourrait facilement être simplifié pour

wp db import - <<< $(wp db export -);

Maintenant, je dois juste prendre en compte les tables de MU-Site et site_url

wp @basic db export --tables=$(wp @basic db tables --url=http://basic.dev/site/ --format=csv) - | gzip > basic-dev-site.sql.gz

blog_id=$(wp @basic eval --url=http://basic.dev/site/ 'echo get_current_blog_id();');

prefix=$(wp @basic eval --url=http://basic.dev/site/ 'global $wpdb; echo $wpdb->prefix;')

site_url=$(wp @basic eval "echo site_url();")

Utilisation search-replace- merci @WestonRuter

sql=$(wp search-replace $(wp eval "echo site_url();" | cut -d ":" -f2) "//new-site.com" --network --skip-columns=guid --export); printf "%s" "$sql"

WP multisite - exportez un site distant vers une importation locale sans fichiers:

wp @remote db export --tables=$remote_tables - | sed "s#$remote_prefix#$local_prefix#g" | sed "s#$remote_site_domain#$local_site_domain#g" | wp @local db import -


Similiar

jgraup
la source
Vous pouvez écrire un script bash appelé via un travail cron dans le fichier scp / rsync sur le serveur distant. Ensuite, sur un serveur distant, vous pouvez avoir un autre script bash qui s'exécute via un travail cron qui surveille le dossier du fichier de sauvegarde et une fois que le fichier est là, il l'importera dans la base de données distante. Ceci est similaire à la façon dont je synchronise un serveur de «redondance d'UC».
laiton
Pour moi personnellement, je ne voudrais pas faire cela dans un travail cron car cela ajoute une autre dépendance au mixage et c'est plus juste pour essayer de synchroniser le local avec la télécommande quand je travaille dessus. "Remote" étant l'un des nombreux alias - même avec local. Une autre raison de réduire les appels de fonction est que j'ai tendance à aimer une ligne / copier / coller / aller! lignes de code;)
jgraup
Avez-vous essayé d'écrire le vidage dans un fichier temporaire au lieu d'une variable?
David
Voilà comment vous devez le faire maintenant, ce qui nécessite des fonctions en dehors de WP-CLI pour gérer le transfert de fichiers --- et plus d'authentification par emplacement.
jgraup
@jgraup Cette question a-t-elle été résolue?
Ethan Jinks O'Sullivan

Réponses:

6

Depuis WP-CLI 0.24.0, vous pouvez désormais utiliser des alias qui vous permettent d'importer une base de données distante assez facilement.

En utilisant des alias, vous pouvez exécuter des commandes WP-CLI sur une autre installation WP-CLI. Cette installation pourrait être une machine distante.

Dans cet esprit, j'ai piraté un alias bash qui enchaîne plusieurs commandes WP-CLI pour extraire une base de données WP distante dans un site local. Dans ce cas, j'ai un fichier wp-cli.yml local où j'ai défini @prod comme alias sur mon site de production (qui utilise un alias SSH).

pullprod() {
    # make a backup of the current local database
    wp db export _db.sql
    wp db reset --yes
    # get current directory name, used for database and URL
    current=${PWD##*/}
    # connect to remote site and ssh the remote database down to our local directory
    wp @prod db export - > $current.sql
    echo "copying of remote database to $current directory complete."
    wp db import
    # database is now imported so we can delete it
    rm -rf $current.sql
    # get the remote site URL, remove the http:// for our search replace
    production_url=$(wp @prod eval '$full_url=get_site_url();$trimmed_url=str_replace("http://", "", $full_url); echo $trimmed_url;')
    wp search-replace "$production_url" "$current.localhost"
    echo "All done, enjoy!"
}

Une pullprodcommande dans le site WP actuel fera ce dont vous avez besoin, tout comme vous avez configuré l'alias (qui pourrait également être automatisé).

Cela fonctionne, mais ma prochaine tâche consiste à améliorer la façon dont j'obtiens la variable $ production_url, car actuellement je la tire d'un fichier local.

davemac
la source
C'est bien. Honnêtement, je cherchais vraiment le wp @alias db export - > $localfilename.sql. Cela devient un peu plus compliqué pour MU-Sites, mais si vous voulez une URL de prod, essayezproduction_url=$(wp @prod eval "echo site_url();"); echo "The URL is $production_url";
jgraup
Que fait exactement wp db reset --yes? Ah ... efface toutes les tables pour que les nouveaux fichiers aient une base de données propre. DB Reset
jgraup
1
Merci pour cela, j'ai pris votre technique d'URL de prod et l'ai légèrement modifiée pour supprimer le http: // de l'URL de production (car cela permet une recherche et un remplacement plus complets)
davemac
1
Notez également que wp search-replaceprend également en charge un --exportargument afin que vous puissiez exporter et rechercher / remplacer tout à la fois: wp-cli.org/commands/search-replace
Weston Ruter