วิธีที่เร็วที่สุด (ขั้นต่ำจำนวนน้อยที่สุด) เพื่อนำเข้าฐานข้อมูลระยะไกลภายในเครื่องโดยใช้ WP-CLI


13

ฉันต้องการที่จะทำงานโดยอัตโนมัติของการนำเข้าฐานข้อมูลระยะไกลโดยใช้ที่WP-CLI

กระบวนการปัจจุบันคือไปsshยังเซิร์ฟเวอร์และเรียกใช้exportไฟล์ไปยังโดยใช้WP-CLIคัดลอกไฟล์ไปยังไดเรกทอรีท้องถิ่นผ่านscpหรือrsyncจากนั้นimportไฟล์ผ่าน WP-CLI ฉันต้องการใช้@aliasและลบขั้นตอนให้มากที่สุดที่นี่

ในขณะที่ฉันต้องการคิดว่าบางสิ่งเช่นนี้เป็นไปได้:

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

ด้วยขนาดฐานข้อมูล> 5GB ที่ไม่บีบอัดดูเหมือนว่าจะเป็นตัวเลือกที่ทำงานได้มากกว่า:

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ที่มีพื้นฐานจรจัดกล่อง

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

ตอนนี้ฉันต้องคำนึงถึงตารางและ site_urlของ 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();")

ใช้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 -


ที่คล้ายกัน


คุณสามารถเขียนสคริปต์ทุบตีที่ถูกเรียกผ่านงาน cron ไปยังไฟล์ scp / rsync ไปยังเซิร์ฟเวอร์ระยะไกล จากนั้นบนเซิร์ฟเวอร์ระยะไกลคุณสามารถมีสคริปต์ทุบตีอีกตัวที่ทำงานผ่านงาน cron ที่เฝ้าดูโฟลเดอร์สำหรับไฟล์สำรองและเมื่อไฟล์อยู่ที่นั่นมันจะนำเข้าสู่ฐานข้อมูลระยะไกล นี่คล้ายกับวิธีที่ฉันทำให้เซิร์ฟเวอร์ "hot แตน" ซิงค์
ทองเหลือง

สำหรับฉันเป็นการส่วนตัวฉันไม่ต้องการทำสิ่งนี้ในงาน cron เพราะมันเป็นการเพิ่มการพึ่งพาการผสมผสานอีกครั้งและมันก็ยิ่งมากขึ้นสำหรับการพยายามที่จะเชื่อมโยงท้องถิ่นเข้ากับระยะไกลเมื่อฉันทำงานกับมัน "Remote" เป็นหนึ่งในนามแฝงจำนวนมาก - เหมือนกันกับ Local อีกเหตุผลที่ลดฟังก์ชั่นการโทรก็เพราะฉันชอบ One-line / copy / paste / go! บรรทัดของโค้ด;)
jgraup

คุณพยายามเขียนดัมพ์ลงในไฟล์ชั่วคราวแทนที่จะเป็นตัวแปรหรือไม่?
เดวิด

นี่คือวิธีที่คุณต้องทำในตอนนี้ซึ่งต้องใช้ฟังก์ชั่นภายนอก WP-CLI เพื่อจัดการการถ่ายโอนไฟล์ --- และการตรวจสอบความถูกต้องเพิ่มเติมต่อสถานที่
jgraup

@jgraup คำถามนี้ได้รับการแก้ไขแล้วหรือยัง?
Ethan Jinks O'Sullivan

คำตอบ:


6

ตั้งแต่WP-CLI 0.24.0ตอนนี้คุณสามารถใช้นามแฝงซึ่งช่วยให้คุณสามารถนำเข้าฐานข้อมูลระยะไกลได้อย่างง่ายดาย

โดยใช้นามแฝงคุณสามารถเรียกใช้คำสั่ง WP-CLI กับการติดตั้ง WP-CLI อื่น การติดตั้งนั้นอาจเป็นเครื่องระยะไกล

เมื่อคำนึงถึงเรื่องนี้ฉันได้แฮ็กนามแฝงทุบตีซึ่งเชื่อมโยงคำสั่ง 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-Sites แต่ถ้าคุณต้องการ prod URL ให้ลองproduction_url=$(wp @prod eval "echo site_url();"); echo "The URL is $production_url";
jgraup

ไม่ว่าสิ่งที่wp db reset --yesทำอย่างไร อ่า ... ล้างตารางทั้งหมดเพื่อให้ไฟล์ใหม่มีฐานข้อมูลที่สะอาด รีเซ็ต DB
jgraup

1
ขอขอบคุณสำหรับการที่ผมเอาเทคนิค URL แยงของคุณและแก้ไขมันเล็ก ๆ น้อย ๆ ที่จะเอาที่ http: // จาก URL ผลิต (ตามหมวดนี้สำหรับการค้นหาที่ครอบคลุมมากขึ้นและแทนที่)
davemac

1
โปรดทราบว่าwp search-replaceยังสนับสนุน--exportARG เพื่อให้คุณสามารถส่งออกและค้นหา / แทนที่ทั้งหมดได้ในครั้งเดียว: wp-cli.org/commands/search-replace
Weston Ruter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.