Cara tercepat (paling tidak jumlah langkah) untuk mengimpor basis data jauh secara lokal menggunakan WP-CLI

13

Saya ingin mengotomatiskan tugas mengimpor basis data jauh menggunakan WP-CLI .

Proses saat ini adalah ke sshserver, dan menjalankan exportfile ke menggunakan WP-CLI , menyalin file ke direktori lokal melalui scpatau rsync, dan kemudian importfile melalui WP-CLI. Saya ingin memanfaatkan @aliasdan menghapus langkah sebanyak mungkin di sini.

Sementara saya ingin berpikir sesuatu seperti ini adalah mungkin:

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

Dengan ukuran DB> 5GB yang tidak terkompresi, ini sepertinya opsi yang lebih layak:

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

Sayangnya saya mungkin mengenai batasan terminal atau struktur panggilan ini harus dibersihkan karena jendela saya sepertinya menggantung.

Apakah ada solusi lain di mana saya dapat menghapus scpdari proses ini? Apakah ada perintah lain yang bisa saya manfaatkan di sini? Saya telah menghapus banyak situs dari contoh di sini, tetapi itu juga sesuatu yang perlu dipertimbangkan yang bisa menjadi bagian dari alias.

Idealnya, saya berharap untuk hal seperti ini di masa depan:

wp @local db import @remote


Contoh pengaturan saat ini menggunakan @aliasdengan kotak Vagrant Dasar .

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

Pembaruan

Berbasis pada @davemac sepertinya proses ini dapat dengan mudah disederhanakan

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

Sekarang saya hanya perlu mempertimbangkan tabel MU-Site dan 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();")

Menggunakan search-replace- terima kasih @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 - mengekspor situs jarak jauh ke impor lokal tanpa file:

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 -


Serupa

jgraup
sumber
Anda bisa menulis skrip bash yang dipanggil melalui cron job ke file scp / rsync ke server jauh. Kemudian pada server jauh Anda bisa memiliki skrip bash lain yang berjalan melalui cron job yang mengawasi folder untuk file cadangan dan begitu file itu ada, ia akan mengimpornya ke DB jauh. Ini mirip dengan bagaimana saya menjaga server "hot siaga" dalam sinkronisasi.
kuningan
Bagi saya pribadi, saya tidak ingin melakukan ini dalam pekerjaan cron karena ini menambah ketergantungan lain pada campuran dan itu lebih untuk hanya mencoba membuat lokal sinkron dengan remote ketika saya sedang mengerjakannya. "Remote" menjadi salah satu dari banyak alias - sama dengan lokal. Alasan lain untuk mengurangi pemanggilan fungsi adalah karena saya cenderung menyukai one-line / copy / paste / go! baris kode;)
jgraup
Sudahkah Anda mencoba menulis dump ke file sementara bukan variabel?
David
Itulah bagaimana Anda perlu melakukannya sekarang yang membutuhkan fungsi di luar WP-CLI untuk menangani transfer file --- dan lebih banyak otentikasi per lokasi.
jgraup
@jgraup Sudahkah pertanyaan ini diselesaikan?
Ethan Jinks O'Sullivan

Jawaban:

6

Karena WP-CLI 0.24.0 Anda sekarang dapat menggunakan alias yang memungkinkan Anda untuk mengimpor basis data jauh dengan cukup mudah.

Dengan menggunakan alias, Anda dapat menjalankan perintah WP-CLI terhadap instalasi WP-CLI lainnya. Instalasi itu bisa berupa mesin jarak jauh.

Dengan mengingat hal ini saya telah meretas alias bash yang menyatukan beberapa perintah WP-CLI untuk menarik basis data WP jauh ke situs lokal. Dalam hal ini, saya memiliki file wp-cli.yml lokal tempat saya telah menetapkan @prod sebagai alias ke situs produksi saya (yang menggunakan 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!"
}

Sebuah pullprodperintah dalam situs WP saat ini akan melakukan apa yang Anda butuhkan, bersama karena Anda memiliki alias mengatur (yang bisa otomatis juga).

Ini berfungsi, tetapi tugas saya selanjutnya adalah memperbaiki cara saya mendapatkan variabel $ production_url, karena saat ini saya menariknya dari file lokal.

davemac
sumber
Ini bagus. Jujur saya benar-benar hanya mencari wp @alias db export - > $localfilename.sql. Ini menjadi sedikit lebih rumit untuk MU-Sites, tetapi jika Anda menginginkan URL prod, cobaproduction_url=$(wp @prod eval "echo site_url();"); echo "The URL is $production_url";
jgraup
Apa yang sebenarnya wp db reset --yesdilakukan? Ah ... membersihkan semua tabel sehingga file baru memiliki db bersih. Reset DB
jgraup
1
Terima kasih untuk itu, saya mengambil teknik URL prod Anda dan memodifikasinya sedikit untuk menghapus http: // dari URL produksi (karena ini membuat pencarian dan penggantian yang lebih komprehensif)
davemac
1
Perhatikan juga yang wp search-replacejuga mendukung --exportarg sehingga Anda dapat mengekspor dan mencari / mengganti semuanya sekaligus: wp-cli.org/commands/search-replace
Weston Ruter