Самый быстрый способ (наименьшее количество шагов) для локального импорта удаленной базы данных с помощью WP-CLI

13

Я хотел бы автоматизировать задачу импорта удаленной базы данных с помощью WP-CLI .

Текущий процесс выполняется sshна сервере и запускается exportв файл с использованием WP-CLI , копирует файл в локальный каталог через scpили rsync, а затем importв файл через WP-CLI. Я хотел бы использовать @aliasи удалить как можно больше шагов здесь.

Хотя хотелось бы подумать, что-то вроде этого возможно

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

При несжатом размере БД> 5 ГБ это выглядит более приемлемым вариантом:

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

К сожалению, я могу выйти за пределы терминала, или структура этого вызова должна быть очищена, потому что мое окно просто кажется зависшим.

Есть ли другое решение, где я могу удалить scpиз этого процесса? Есть ли другие команды, которые я мог бы использовать здесь? Я удалил мультисайт из примеров здесь, но это также то, что нужно учитывать, что может быть частью псевдонима.

В идеале я бы надеялся на что-то подобное в будущем:

wp @local db import @remote


Текущий пример настройки использования @aliasс 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

Обновления

Основываясь на @davemac, похоже, этот процесс можно легко упростить до

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

Теперь мне просто нужно принять во внимание таблицы MU-Site и 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();")

Использование search-replace- спасибо @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 - экспортировать удаленный сайт для локального импорта без файлов:

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 -


похож

jgraup
источник
Вы можете написать bash-скрипт, который вызывается с помощью задания cron для файла scp / rsync на удаленном сервере. Затем на удаленном сервере у вас может быть другой bash-скрипт, который запускается через задание cron, которое просматривает папку для файла резервной копии, и, как только файл появится, он импортирует его в удаленную БД. Это похоже на то, как я синхронизирую сервер с «горячим резервированием».
медь
Лично для меня, я бы не хотел делать это в работе cron, потому что это добавляет еще одну зависимость в микс, и это больше для того, чтобы просто пытаться синхронизироваться локально с удаленным, когда я работаю над этим. «Удаленный» является одним из многих псевдонимов - то же самое с локальными. Еще одна причина уменьшить количество вызовов функций заключается в том, что мне нравится одна строка / копировать / вставить / перейти! строки кода;)
jgraup
Вы пытались записать дамп во временный файл вместо переменной?
Дэвид
Это то, что вам нужно сделать сейчас, когда требуются функции вне WP-CLI для обработки передачи файлов - и больше аутентификации для каждого местоположения.
jgraup
@jgraup Этот вопрос был решен?
Итан Джинкс О'Салливан

Ответы:

6

Начиная с WP-CLI 0.24.0 вы можете теперь использовать псевдонимы, которые позволяют довольно легко импортировать удаленную базу данных.

Используя псевдонимы, вы можете запускать команды WP-CLI для другой установки WP-CLI. Эта установка может быть удаленной машиной.

Имея это в виду, я взломал псевдоним bash, который объединяет несколько команд WP-CLI, чтобы вытащить удаленную базу данных WP на локальный сайт. В этом случае у меня есть локальный файл wp-cli.yml, в котором я установил @prod в качестве псевдонима моего рабочего сайта (который использует псевдоним 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!"
}

pullprodКоманда в текущем сайте WP будет делать то , что вам требуется, а также у вас есть псевдоним , установленный вверх (которые могут быть автоматизированы, а).

Это работает, но моя следующая задача - улучшить способ получения переменной $ production_url, поскольку в настоящее время я извлекаю ее из локального файла.

davemac
источник
Это здорово. Честно говоря, я действительно искал wp @alias db export - > $localfilename.sql. Для MU-сайтов это становится немного сложнее, но если вы хотите получить URL-адрес продукта, попробуйтеproduction_url=$(wp @prod eval "echo site_url();"); echo "The URL is $production_url";
jgraup
Что именно делает wp db reset --yes? Ах ... очищает все таблицы, чтобы новые файлы имели чистую базу данных. Сброс БД
jgraup
1
Спасибо за это, я взял ваш метод URL-адреса и немного изменил его, чтобы удалить http: // из
рабочего
1
Также обратите внимание, что wp search-replaceтакже поддерживается --exportarg, поэтому вы можете экспортировать и искать / заменять все сразу: wp-cli.org/commands/search-replace
Weston Ruter