รับตัวบ่งชี้ความคืบหน้าเมื่อนำเข้าฐานข้อมูล MySQL


21

ฉันมักจะนำเข้าฐานข้อมูล MySQL และอาจใช้เวลาสักครู่ ไม่มีตัวบ่งชี้ความคืบหน้าใด ๆ สามารถแสดงได้อย่างใดอย่างหนึ่ง? อาจมีการนำเข้าระเบียน, นำเข้า MB หรือนำเข้าตาราง ... สิ่งใดจะดีไปกว่าการรอ ใครมีความคิด?

ฉันใช้คำสั่งนี้:

mysql -uuser -p -hhost database < largefile.sql

ไฟล์อยู่ระหว่าง 40-300 MB และโฮสต์อยู่ในเครือข่ายท้องถิ่น



@sr_ ฉันคิดว่าpvเป็นสิ่งที่ผู้ถามต้องการค้นหา ฉันเพิ่งติดตั้งบน CentOS ผ่านทาง rpmforge หากกำหนดขนาด -พารามิเตอร์มันจะแสดง ETA ด้วย
นิลส์

pvทำเคล็ดลับแน่นอน! หากใครสามารถตอบคำถามนี้ได้ฉันก็ยอมรับได้!
Reinstate Monica

คำตอบ:


31

มีเครื่องมือที่ดีที่เรียกว่า pv

# On Ubuntu/Debian system
$ sudo apt-get install pv

# On Redhat/CentOS
$ sudo yum install pv

จากนั้นเช่นคุณสามารถใช้มันเช่นนี้

$ zcat dbpackfile.sql.gz | pv -cN zcat | mysql -uuser -ppass dbname

โปรดตรวจสอบ UPDATE 2 สำหรับรุ่นล่าสุดของฉัน

ps: ตรวจสอบบล็อกนี้http://blog.larsstrand.org/2011/12/tip-pipe-viewer.html

อัปเดต: ดูเหมือนว่าลิงก์ด้านบนเสีย แต่ฉันพบบทความเดียวกันที่นี่http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html

อัปเดต 2: ทางออกที่ดียิ่งขึ้นด้วย FULL คืบหน้าบาร์ คุณต้องใช้ 2 บิลด์ในpvตัวเลือก หนึ่งคือ--progressการระบุแถบความคืบหน้าและที่สองคือ--sizeการบอกpvขนาดไฟล์โดยรวม

pv --progress --size UNPACKED-FILE-SIZE-IN-BYTES

.. ปัญหาอยู่ที่.gzขนาดไฟล์ดั้งเดิม คุณจำเป็นต้องได้รับข้อมูลขนาดไฟล์ดั้งเดิมที่ยังไม่ได้เปิดออกโดยไม่ได้ทำการแกะตัวเองมิฉะนั้นคุณจะเสียเวลาอันมีค่าในการแกะไฟล์นี้สองครั้ง (เป็นครั้งแรกpvและครั้งที่สองสำหรับzcat) แต่โชคดีที่คุณมีgzip -lตัวเลือกที่มีข้อมูลที่ไม่บีบอัดเกี่ยวกับไฟล์ gziped ของเรา โชคไม่ดีที่คุณมีมันในรูปแบบตารางดังนั้นคุณต้องแยกก่อนจึงจะสามารถใช้งานได้ ทั้งหมดเข้าด้วยกันสามารถเห็นได้ด้านล่าง:

gzip -l /path/to/our/database.sql.gz | sed -n 2p | awk '{print $2}'

Uff .. ดังนั้นสิ่งสุดท้ายที่คุณต้องทำคือเพียงรวมเข้าด้วยกัน

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` | mysql -uuser -ppass dbname

ในการทำให้มันดีกว่านี้คุณสามารถเพิ่มโปรแกรม NAME แบบนี้ได้

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass dbname

ผลสุดท้าย:

Importing.. : [===========================================>] 100%

ปรับปรุง 3: สำหรับการใช้งานอย่างรวดเร็วสร้างฟังก์ชั่นที่กำหนดเอง

mysql_import() {
  zcat $2 | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass $1
}

การใช้งาน:

mysql_import dbname /path/to/our/database.sql.gz

หากคุณไม่รู้ว่าจะใส่ไว้ตรงไหนให้อ่านคำตอบนี้: /unix//a/106606/20056

คุณสามารถเพิ่มฟังก์ชั่นในนามแฝง ดังนั้นคุณสามารถใช้~/.bash_aliasesไฟล์เช่น


นี่มันเจ๋งมาก.
dave

1
ซับหนึ่งที่มีผลลัพธ์ที่ดีกว่าอาจเป็นเช่นนี้:pv --progress --name 'DB Import in progress' -tea /path/to/our/database.sql.gz | zcat | mysql -h db_host -u db_user -pdb_password db_name
Denis Pitzalis


7

ฉันมักจะนำเข้าฐานข้อมูลจาก MySql เชลล์ มันไม่ได้แสดงตัวบ่งชี้ความคืบหน้า แต่มันจะทำการเลื่อนการดำเนินการ (อย่างรวดเร็ว) เพื่อให้ฉันรู้ว่ามันทำงานได้ดี

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.