Найшвидший спосіб (найменша кількість кроків) локального імпорту віддаленої бази даних за допомогою 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з базовим кодом 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

Оновлення

На основі @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 -


Similiar


Ви можете написати скрипт bash, який викликається через роботу cron для scp / rsync-файла на віддалений сервер. Тоді на віддаленому сервері у вас може бути інший скрипт bash, який працює через cron завдання, який відстежує папку для резервного файлу, і коли файл буде там, він імпортує його у віддалений БД. Це схоже на те, як я синхронізую сервер "гарячої очікування".
латунь

Особисто для мене я не хотів би робити це в роботі з кроном, оскільки це додає ще одну залежність до суміші, і це більше для просто спроби отримати локальну синхронізацію з віддаленим, коли я працюю над цим. "Віддалений" є одним із багатьох псевдонімів - те саме з локальним. Ще однією причиною зменшення функціональних викликів є те, що мені подобається однорядне / копіювання / вставка / перехід! рядки коду;)
jgraup

Ви намагалися записати дамп у тимчасовий файл замість змінної?
Девід

Ось як це потрібно зробити зараз, для чого потрібні функції поза WP-CLI для обробки передачі файлів --- і більше автентифікації на місце.
jgraup

@jgraup Чи вирішено це питання?
Ethan Jinks O'Sullivan

Відповіді:


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, оскільки в даний час я витягую її з локального файлу.


Це чудово. Чесно кажучи, я справді просто шукав це wp @alias db export - > $localfilename.sql. Це стає дещо складніше для MU-сайтів, але якщо ви хочете URL-адрес prod, спробуйтеproduction_url=$(wp @prod eval "echo site_url();"); echo "The URL is $production_url";
jgraup

Що саме робить wp db reset --yes? Ах ... очищає всі таблиці, щоб нові файли мали чистий db. Скидання БД
jgraup

1
Дякую за це, я взяв вашу техніку URL-адреси prod і трохи змінив її, щоб видалити http: // з виробничої URL-адреси (оскільки це робить для більш всебічного пошуку та заміни)
davemac

1
Зауважте також, що wp search-replaceтакож підтримується --exportаргумент, щоб ви могли експортувати та шукати / замінювати все одразу: wp-cli.org/commands/search-replace
Weston Ruter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.