A maneira mais rápida (menor quantidade de etapas) de importar localmente um banco de dados remoto usando WP-CLI

13

Gostaria de automatizar a tarefa de importar um banco de dados remoto usando o WP-CLI .

O processo atual é para ssho servidor e execute um exportarquivo usando o WP-CLI , copie o arquivo para um diretório local via scpor rsynce, em seguida, importo arquivo através do WP-CLI. Gostaria de utilizar @aliase remover o maior número possível de etapas aqui.

Enquanto eu gostaria de pensar que algo assim é possível:

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

Com um tamanho de banco de dados> 5 GB descompactado, essa parece ser uma opção mais viável:

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

Infelizmente, posso estar atingindo os limites do terminal ou a estrutura dessa chamada deve ser limpa, porque minha janela parece travar.

Existe outra solução onde eu possa remover scpesse processo? Existem outros comandos que eu poderia utilizar aqui? Eu removi vários sites dos exemplos aqui, mas isso também é algo a considerar, que pode fazer parte do alias.

Idealmente, eu esperaria algo assim no futuro:

wp @local db import @remote


Exemplo de configuração atual do uso @aliascom a caixa 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

Atualizações

Com base no @davemac , parece que esse processo pode ser facilmente simplificado para

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

Agora só preciso levar em consideração as tabelas e site_url do MU-Site

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- obrigado @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 - exporte um site remoto para importação local sem arquivos:

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
fonte
Você pode escrever um script bash chamado via tarefa cron para o arquivo scp / rsync no servidor remoto. Em seguida, no servidor remoto, você pode ter outro script bash que é executado via tarefa cron que observa a pasta do arquivo de backup e, uma vez que o arquivo esteja lá, ele será importado para o banco de dados remoto. Isso é semelhante a como eu mantenho um servidor "hot standby" em sincronia.
brass
Para mim, pessoalmente, eu não gostaria de fazer isso em um trabalho cron, porque adiciona outra dependência ao mix e é mais apenas tentar ficar local sincronizado com remoto quando estou trabalhando nele. "Remoto" é um dos muitos aliases - o mesmo que o local. Outro motivo para reduzir as chamadas de função é porque eu gosto de uma linha / copiar / colar / ir! linhas de código;)
jgraup
Você tentou gravar o despejo em um arquivo temporário em vez de em uma variável?
David
É assim que você precisa fazê-lo agora, o que requer funções fora do WP-CLI para lidar com a transferência de arquivos - e mais autenticação por local.
precisa saber é
@jgraup Esta questão foi resolvida?
Ethan Jinks O'Sullivan

Respostas:

6

Desde o WP-CLI 0.24.0, agora você pode usar aliases que permitem importar um banco de dados remoto com bastante facilidade.

Usando aliases, você pode executar comandos WP-CLI em outra instalação do WP-CLI. Essa instalação pode ser uma máquina remota.

Com isso em mente, eu hackeei um alias do bash que conecta vários comandos WP-CLI para puxar um banco de dados WP remoto para um site local. Nesse caso, eu tenho um arquivo wp-cli.yml local em que configurei @prod como um alias para o meu site de produção (que usa um 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!"
}

Um pullprodcomando no site atual do WP fará o que você precisa, juntamente com o alias configurado (que também pode ser automatizado).

Funciona, mas minha próxima tarefa é melhorar a forma como obtenho a variável $ production_url, pois atualmente estou retirando-a de um arquivo local.

davemac
fonte
Isso é ótimo. Honestamente, eu estava realmente apenas procurando o wp @alias db export - > $localfilename.sql. Ele fica um pouco mais complicado para Mu-Sites, mas se você quiser um URL prod, tenteproduction_url=$(wp @prod eval "echo site_url();"); echo "The URL is $production_url";
jgraup
O que exatamente faz wp db reset --yes? Ah ... limpa todas as tabelas para que os novos arquivos tenham um banco de dados limpo.
Re
1
Obrigado por isso, peguei a técnica de URL do seu produto e a modifiquei um pouco para remover o http: // do URL de produção (pois isso facilita a pesquisa e a substituição)
davemac
1
Note também que wp search-replacetambém suporta um --exportarg para que possa exportar e procurar / substituir de uma só vez: wp-cli.org/commands/search-replace
Weston Ruter