Schnellster Weg (geringste Anzahl von Schritten) zum lokalen Importieren einer entfernten Datenbank mithilfe von WP-CLI

12

Ich möchte die Aufgabe des Importierens einer entfernten Datenbank mithilfe der WP-CLI automatisieren .

Der aktuelle Prozess besteht darin, sshauf den Server zu gehen und eine exportto-Datei mit WP-CLI auszuführen , die Datei über scpoder in ein lokales Verzeichnis zu kopieren rsyncund dann importdie Datei über die WP-CLI. Ich möchte @aliashier so viele Schritte wie möglich verwenden und entfernen.

Während ich gerne denken würde, dass so etwas möglich ist:

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

Bei einer unkomprimierten DB-Größe> 5 GB scheint dies eine praktikablere Option zu sein:

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

Leider stoße ich möglicherweise an die Grenzen des Terminals oder die Struktur dieses Anrufs sollte bereinigt werden, da mein Fenster nur zu hängen scheint.

Gibt es eine andere Lösung, die ich scpaus diesem Prozess entfernen kann? Gibt es andere Befehle, die ich hier verwenden könnte? Ich habe Multi-Site aus den Beispielen hier entfernt, aber das ist auch etwas zu beachten, das Teil des Alias ​​sein könnte.

Idealerweise würde ich in Zukunft auf so etwas hoffen:

wp @local db import @remote


Aktuelles Beispiel für die Verwendung @aliasmit der Basic Vagrant-Box .

~/.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

Aktualisierung

Basierend auf @davemac sieht es so aus, als könnte dieser Prozess leicht vereinfacht werden

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

Jetzt muss ich nur noch die Tabellen und site_url von MU-Site berücksichtigen

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();")

Verwenden search-replace- danke @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 - Exportieren Sie eine Remote-Site zum lokalen Import ohne Dateien:

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 -


Ähnlich

jgraup
quelle
Sie könnten ein Bash-Skript schreiben, das über einen Cron-Job aufgerufen wird, um die Datei scp / rsync auf den Remote-Server zu übertragen. Dann könnten Sie auf dem Remote-Server ein anderes Bash-Skript haben, das über einen Cron-Job ausgeführt wird und den Ordner auf die Sicherungsdatei überwacht. Sobald die Datei vorhanden ist, wird sie in die Remote-Datenbank importiert. Dies ähnelt der Synchronisierung eines "Hot Standby" -Servers.
Messing
Für mich persönlich würde ich dies nicht in einem Cron-Job tun wollen, da dies dem Mix eine weitere Abhängigkeit hinzufügt und eher dazu dient, nur zu versuchen, lokal mit Remote synchron zu werden, wenn ich daran arbeite. "Remote" ist einer von vielen Aliasnamen - genau wie local. Ein weiterer Grund, die Funktionsaufrufe zu reduzieren, ist, dass ich einzeilig / kopieren / einfügen / gehen mag! Codezeilen;)
jgraup
Haben Sie versucht, den Speicherauszug in eine temporäre Datei anstelle einer Variablen zu schreiben?
David
So müssen Sie es jetzt tun, was Funktionen außerhalb von WP-CLI erfordert, um die Dateiübertragung abzuwickeln - und mehr Authentifizierung pro Speicherort.
Jgraup
@jgraup Wurde diese Frage gelöst?
Ethan Jinks O'Sullivan

Antworten:

6

Seit WP-CLI 0.24.0 können Sie jetzt Aliase verwenden denen Sie ganz einfach eine entfernte Datenbank importieren können.

Mithilfe von Aliasen können Sie WP-CLI-Befehle für eine andere WP-CLI-Installation ausführen. Diese Installation könnte eine Remote-Maschine sein.

In diesem Sinne habe ich einen Bash-Alias ​​gehackt, der mehrere WP-CLI-Befehle miteinander verbindet, um eine entfernte WP-Datenbank auf eine lokale Site zu ziehen. In diesem Fall habe ich eine lokale Datei wp-cli.yml, in der ich @prod als Alias ​​für meine Produktionssite festgelegt habe (die einen SSH-Alias ​​verwendet).

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!"
}

EIN pullprod Befehl auf der aktuellen WP-Site erledigt genau das, was Sie benötigen, und Sie haben den Alias ​​eingerichtet (der auch automatisiert werden kann).

Es funktioniert, aber meine nächste Aufgabe besteht darin, zu verbessern, wie ich die Variable $ product_url erhalte, da ich sie derzeit aus einer lokalen Datei ziehe.

Davemac
quelle
Das ist toll. Ehrlich gesagt habe ich wirklich nur nach dem gesucht wp @alias db export - > $localfilename.sql. Es wird ein wenig komplizierter für MU-Sites, aber wenn Sie eine Produkt-URL wollen, versuchen Sieproduction_url=$(wp @prod eval "echo site_url();"); echo "The URL is $production_url";
jgraup
Was genau macht wp db reset --yesdas? Ah ... löscht alle Tabellen, damit die neuen Dateien eine saubere Datenbank haben. DB Reset
jgraup
1
Vielen Dank dafür, ich habe Ihre Produkt-URL-Technik übernommen und ein wenig geändert, um das http: // aus der Produktions-URL zu entfernen (da dies ein umfassenderes Suchen und Ersetzen ermöglicht)
davemac
1
Beachten Sie auch, dass wp search-replaceauch ein Argument unterstützt wird, --exportso dass Sie alles auf einmal exportieren und suchen / ersetzen können: wp-cli.org/commands/search-replace
Weston Ruter