La forma más rápida (la menor cantidad de pasos) para importar localmente una base de datos remota usando WP-CLI

10

Me gustaría automatizar la tarea de importar una base de datos remota mediante WP-CLI .

El proceso actual es ssh en el servidor y ejecuta un export para archivar utilizando WP-CLI , copie el archivo a un directorio local a través de scp o rsync , y luego import el archivo a través del WP -CLI. Me gustaría utilizar un @alias y eliminar tantos pasos como sea posible aquí.

Aunque me gustaría pensar que algo como esto es posible:

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

Con un tamaño de base de datos > 5GB sin comprimir, esta parece una opción más viable:

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

Desafortunadamente, puedo estar llegando a los límites de la terminal o la estructura de esta llamada debería limpiarse porque parece que mi ventana simplemente se cuelga.

¿Hay otra solución donde pueda eliminar scp de este proceso? ¿Hay otros comandos que podría utilizar aquí? He eliminado el sitio múltiple de los ejemplos aquí, pero eso también es algo a considerar que podría ser parte del alias.

Idealmente, espero algo como esto en el futuro:

  

wp @local db import @remote

Ejemplo de configuración actual del uso de @alias con cuadro de Vagrant básico .

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

Actualizaciones

Se basa en @davemac , parece que este proceso podría simplificarse fácilmente a

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

Ahora solo debo tener en cuenta el sitio tables y 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();")

Usando search-replace - gracias @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: exporta un sitio remoto a una importación local sin archivos:

  

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

pregunta jgraup 13.08.2016 - 22:27

1 respuesta

5

Desde WP-CLI 0.24.0 ahora puede use aliases que le permiten importar una base de datos remota bastante fácilmente.

Al usar alias, puede ejecutar los comandos de WP-CLI en otra instalación de WP-CLI. Esa instalación podría ser una máquina remota.

Con esto en mente, he pirateado un alias de bash que une varios comandos WP-CLI para atraer una base de datos WP remota a un sitio local. En este caso, tengo un archivo wp-cli.yml local donde establecí @prod como un alias para mi sitio de producción (que usa 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!"
}

Un comando pullprod en el sitio WP actual hará lo que necesite, junto con la configuración del alias (que también podría ser automatizado).

Funciona, pero mi próxima tarea es mejorar la forma en que obtengo la variable $ production_url, ya que actualmente la estoy extrayendo de un archivo local.

    
respondido por el davemac 16.08.2016 - 10:49

Lea otras preguntas en las etiquetas