Cách nhanh nhất (số lượng bước ít nhất) để nhập cục bộ cơ sở dữ liệu từ xa bằng WP-CLI


12

Tôi muốn tự động hóa nhiệm vụ nhập cơ sở dữ liệu từ xa bằng WP-CLI .

Quá trình hiện tại là đến sshmáy chủ và chạy exporttệp bằng WP-CLI , sao chép tệp vào thư mục cục bộ thông qua scphoặc rsyncsau đó importtệp qua WP-CLI. Tôi muốn sử dụng một @aliasvà loại bỏ càng nhiều bước càng tốt ở đây.

Trong khi tôi muốn nghĩ một cái gì đó như thế này là có thể:

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

Với kích thước DB> 5GB không nén, đây có vẻ là một lựa chọn khả thi hơn:

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

Thật không may, tôi có thể gặp phải các giới hạn của thiết bị đầu cuối hoặc cấu trúc của cuộc gọi này sẽ bị xóa vì cửa sổ của tôi dường như bị treo.

Có một giải pháp khác mà tôi có thể loại bỏ scpkhỏi quá trình này? Có bất kỳ lệnh nào khác tôi có thể sử dụng ở đây? Tôi đã xóa nhiều trang web khỏi các ví dụ ở đây nhưng đó cũng là điều cần xem xét có thể là một phần của bí danh.

Lý tưởng nhất, tôi sẽ hy vọng cho một cái gì đó như thế này trong tương lai:

wp @local db import @remote


Thiết lập ví dụ hiện tại về việc sử dụng @aliasvới hộp Vagrant cơ bản .

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

Cập nhật

Căn cứ vào @davemac có vẻ như quá trình này có thể dễ dàng được đơn giản hóa để

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

Bây giờ tôi chỉ cần tính đến các bảng của MU-Site và 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();")

Sử dụng search-replace- cảm ơn @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 - xuất một trang web từ xa sang nhập cục bộ mà không cần tệp:

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 -


Tương tự


Bạn có thể viết một tập lệnh bash được gọi thông qua cron job để tập tin scp / rsync đến máy chủ từ xa. Sau đó, trên máy chủ từ xa, bạn có thể có một tập lệnh bash khác chạy qua cron job để xem thư mục cho tệp sao lưu và một khi có tệp đó, nó sẽ nhập nó vào DB từ xa. Điều này tương tự như cách tôi giữ máy chủ "chờ nóng" đồng bộ.
đồng thau

Đối với cá nhân tôi, tôi sẽ không muốn làm điều này trong một công việc định kỳ vì nó thêm một sự phụ thuộc khác vào hỗn hợp và nó chỉ đơn giản hơn là cố gắng để đồng bộ cục bộ với điều khiển từ xa khi tôi làm việc với nó. "Remote" là một trong nhiều bí danh - giống với local. Một lý do khác để giảm các cuộc gọi chức năng là vì tôi có xu hướng thích một dòng / sao chép / dán / đi! dòng mã;)
jgraup

Bạn đã thử ghi kết xuất vào một tệp tạm thời thay vì một biến chưa?
David

Đó là cách bạn cần thực hiện ngay bây giờ, yêu cầu các chức năng bên ngoài WP-CLI để xử lý việc truyền tệp --- và xác thực nhiều hơn cho mỗi vị trí.
jgraup

@jgraup Câu hỏi này đã được giải quyết chưa?
Ethan Jinks O'Sullivan

Câu trả lời:


6

WP-CLI 0.24.0, giờ đây bạn có thể sử dụng các bí danh cho phép bạn nhập cơ sở dữ liệu từ xa khá dễ dàng.

Bằng cách sử dụng các bí danh, bạn có thể chạy các lệnh WP-CLI đối với cài đặt WP-CLI khác. Cài đặt đó có thể là một máy từ xa.

Với suy nghĩ này, tôi đã hack cùng một bí danh bash kết hợp nhiều lệnh WP-CLI để kéo cơ sở dữ liệu WP từ xa vào một trang web cục bộ. Trong trường hợp này, tôi có tệp wp-cli.yml cục bộ nơi tôi đã đặt @prod làm bí danh cho trang web sản xuất của mình (sử dụng bí danh 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!"
}

Một pullprod lệnh trong trang WP hiện tại sẽ thực hiện những gì bạn yêu cầu, cùng với đó là bạn đã thiết lập bí danh (cũng có thể được tự động hóa).

Nó hoạt động, nhưng nhiệm vụ tiếp theo của tôi là cải thiện cách tôi có được biến $ produc_url, vì hiện tại tôi đang lấy nó từ một tệp cục bộ.


Điều đó thật tuyệt. Thành thật mà nói tôi thực sự chỉ đang tìm kiếm wp @alias db export - > $localfilename.sql. Nó phức tạp hơn một chút đối với MU-Site, nhưng nếu bạn muốn có một URL prod, hãy thửproduction_url=$(wp @prod eval "echo site_url();"); echo "The URL is $production_url";
jgraup

Chính xác thì wp db reset --yeslàm gì? À ... xóa tất cả các bảng để các tệp mới có db sạch. Đặt lại DB
jgraup 16/8/2016

1
Cảm ơn vì điều đó, tôi đã sử dụng kỹ thuật URL prod của bạn và sửa đổi một chút để xóa http: // khỏi URL sản xuất (vì điều này giúp tìm kiếm và thay thế toàn diện hơn)
davemac 17/8/2016

1
Cũng lưu ý rằng wp search-replacecũng hỗ trợ một đối số --exportđể bạn có thể xuất và tìm kiếm / thay thế tất cả cùng một lúc: wp-cli.org/commands/search-replace
Weston Ruter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.