ฉันจะติดตามความคืบหน้าของการนำเข้าไฟล์. sql ขนาดใหญ่ได้อย่างไร


204

ฉันกำลังนำเข้า 7 GB foobar.sqlเพื่อกู้คืนตารางในฐานข้อมูลท้องถิ่น

$ mysql -h localhost -u root 'my_data' < foobar.sql

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.12 Distrib 5.0.96, for apple-darwin9.8.0 (i386) using readline 5.1

ฉันจะติดตามความคืบหน้าได้อย่างไร


1
คำตอบสำหรับคำถามนี้แสดงให้เห็นว่านี่เป็นข้อบกพร่องที่ชัดเจนของไคลเอนต์ mysql
William Entriken

คำตอบ:


267

หากคุณเพิ่งนำเข้าจากไฟล์ดัมพ์จาก CLI บน * nix เช่น

mysql -uxxx -pxxx dbname < /sqlfile.sql

จากนั้นให้ติดตั้งไพพ์วิวเวอร์บนระบบปฏิบัติการของคุณก่อนแล้วลองดังนี้:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

ซึ่งจะแสดงแถบความคืบหน้าขณะที่โปรแกรมทำงาน

มันมีประโยชน์มากและคุณสามารถใช้มันเพื่อรับการประเมินความคืบหน้าของ mysqldump

pv จะดัมพ์sqlfile.sqlและส่งไปยัง mysql (เนื่องจากตัวดำเนินการไพพ์) ในขณะที่กำลังทิ้งมันจะแสดงความคืบหน้า สิ่งที่ยอดเยี่ยมคือ mysql ใช้ข้อมูลอย่างรวดเร็วเท่าที่จะสามารถทำได้ดังนั้น pv จึงสามารถแสดงความคืบหน้าของการนำเข้าได้ ฉันไม่มีหลักฐานใด ๆ แต่ดูเหมือนว่า ฉันเดาว่ามีการใช้บัฟเฟอร์บางส่วน แต่ในบางจุดฉันคิดว่าmysqlจะไม่อ่านข้อมูลใด ๆ อีกเมื่อมันยังยุ่งอยู่กับการประมวลผล

ภาพหน้าจอของ Pipe Viewer


1
ฉันเดาว่า mysql อาจมีบัฟเฟอร์ซึ่งข้อมูลบางอย่างสามารถไพพ์ได้โดยไม่ต้อง "ถูกประมวลผล" อย่างสมบูรณ์ (เช่นหากเกิดข้อผิดพลาด pv อาจมีการรายงานเกินจริงเล็กน้อยว่าเกิดอะไรขึ้น) แต่โดยทั่วไปนี่เป็นวิธีการทำงานของท่อ เป็นเหตุผลเดียวกันที่คุณสามารถทำได้sudo hd /dev/sda1 | lessและไม่มีพาร์ติชันระบบทั้งหมดในหน่วยความจำ
snapfractalpop

2
@snapfractalpop pvจะไม่แม่นยำเกินไปในหลาย ๆ กรณีเพราะบางส่วนของ SQL จะใช้เวลาในการประมวลผลมากกว่าที่อื่น ๆ บรรทัดที่มีการแทรกแบบง่ายจะทำงานเร็วกว่าที่สร้างในดัชนีบนตารางที่มีหลายแถวอยู่แล้วตัวอย่างเช่น แต่ AA คร่าวๆของความคืบหน้าการส่งออกควรจะเป็นประโยชน์เว้นแต่บัฟเฟอร์อ่านที่ใช้โดยmysqlมีขนาดใหญ่โดยเฉพาะอย่างยิ่ง (สำหรับการป้อนข้อมูล 7GB บัฟเฟอร์จะต้องมีขนาดใหญ่มากที่จะทำให้pv's ผลผลิตไม่เป็นประโยชน์ที่ทุกคน.
เดวิด Spillett

1
@DavidSpillett แน่นอน ความคิดเห็นของคุณสะท้อนความรู้สึกของฉัน โดยทั่วไป pv เป็นน้ำมันดิบ แต่มีประสิทธิภาพ สิ่งที่ฉันชอบมากที่สุดเกี่ยวกับเรื่องนี้เป็นเรื่องทั่วไป นั่นคือความงามของท่อยูนิกซ์ (ขอบคุณ McIlroy)
snapfractalpop

1
@rob นี่คือเพื่อนที่ยอดเยี่ยมคุณช่วยยกตัวอย่างด้วยได้mysqldumpไหม?
Josue Alexander Ibarra

ทางออกที่ดีมาก! หากรหัสผ่านเป็นคู่มือผู้ใช้ pv ไม่รอให้รหัสแสดงความก้าวหน้าแม้ว่า
Pierre de LESPINAY

26

หากคุณได้เริ่มการนำเข้าแล้วคุณสามารถดำเนินการคำสั่งนี้ในหน้าต่างอื่นเพื่อดูขนาดปัจจุบันของฐานข้อมูลของคุณ สิ่งนี้จะมีประโยชน์หากคุณทราบขนาดทั้งหมดของไฟล์. sql ที่คุณกำลังนำเข้า

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

มอบเครดิตให้กับ: http://forums.mysql.com/read.php?108,201578,201578


การอ้างอิง MySQL 8.0ระบุต่อไปนี้เกี่ยวกับความถูกต้อง:

DATA_LENGTH

สำหรับ MyISAM DATA_LENGTH คือความยาวของไฟล์ข้อมูลหน่วยเป็นไบต์

สำหรับ InnoDB DATA_LENGTH เป็นจำนวนหน่วยความจำโดยประมาณที่จัดสรรสำหรับดัชนีคลัสเตอร์เป็นไบต์ โดยเฉพาะอย่างยิ่งมันเป็นขนาดดัชนีคลัสเตอร์ในหน้าคูณด้วยขนาดหน้า InnoDB

 

INDEX_LENGTH

สำหรับ MyISAM, INDEX_LENGTH คือความยาวของไฟล์ดัชนีหน่วยเป็นไบต์

สำหรับ InnoDB INDEX_LENGTH เป็นจำนวนหน่วยความจำโดยประมาณที่จัดสรรสำหรับดัชนีที่ไม่ได้ทำคลัสเตอร์เป็นไบต์ โดยเฉพาะมันคือผลรวมของขนาดดัชนีที่ไม่ใช่แบบคลัสเตอร์ในหน้าเว็บคูณด้วยขนาดหน้า InnoDB


ตารางของฉันอยู่ที่ 12 GiB ตามคำสั่งจากคำตอบนี้และยังคงนำเข้า ไฟล์ sqldump ของฉันมีเพียง 5 GiB ฉันจะสนใจคำอธิบายสำหรับความคลาดเคลื่อนนี้
lucidbrot

17

เมื่อคุณรัน mysqldump ของฐานข้อมูลเดียวตารางทั้งหมดจะถูกดัมพ์ตามลำดับตัวอักษร

โดยปกติการโหลด mysqldump ลงในฐานข้อมูลก็จะเรียงตามตัวอักษร

คุณสามารถทำรายการ SHOW ได้ และค้นหาการเชื่อมต่อฐานข้อมูลที่เรียกใช้ mysqldump เมื่อการถ่ายโอนข้อมูลถูกโหลดใหม่การเชื่อมต่อฐานข้อมูลจะหายไป

หากคุณต้องการทราบว่าตารางใดอยู่ใน dumpfile ให้เรียกใช้สิ่งนี้กับ foobar.sql

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

อัพเดท 2012-05-02 13:53 EDT

ขออภัยที่ไม่พบว่ามีเพียงหนึ่งตาราง

หากตารางคือ MyISAM วิธีเดียวในการตรวจสอบคือจากมุมมองของระบบปฏิบัติการ เหตุผล? ตารางถูกล็อกการเขียนตลอดการโหลดซ้ำ คุณมองหาอะไร ขนาดของไฟล์.MYDและ .MYIแน่นอนคุณต้องเปรียบเทียบขนาดของตารางก่อนหน้านี้กับเซิร์ฟเวอร์ DB อื่นที่คุณนำเข้า

หากตารางนั้นเป็น InnoDB และคุณเปิดใช้งานinnodb_file_per_tableวิธีเดียวที่จะตรวจสอบได้คือจากมุมมองของระบบปฏิบัติการ เหตุผล? ตารางถูกล็อกการเขียนตลอดการโหลดซ้ำ คุณมองหาอะไร ขนาดของ.ibdไฟล์ แน่นอนคุณต้องเปรียบเทียบขนาดของตารางก่อนหน้านี้กับเซิร์ฟเวอร์ DB อื่นที่คุณนำเข้า

หากตารางนั้นเป็น InnoDB และคุณปิดใช้งานinnodb_file_per_tableไม่แม้แต่มุมมองของระบบปฏิบัติการก็สามารถช่วยได้

อัพเดท 2012-05-02 13:56 EDT

ฉันพูดถึงเรื่องนี้เมื่อปีที่แล้ว: ฉันจะได้รับ% คืบหน้าสำหรับ "type db.sql | mysql" ได้อย่างไร

อัพเดท 2012-05-02 14:09 EDT

ตั้งแต่มาตรฐาน mysqldump เขียนล็อคตารางเช่นนี้

LOCK TABLES `a` WRITE;
/*!40000 ALTER TABLE `a` DISABLE KEYS */;
INSERT INTO `a` VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE `a` ENABLE KEYS */;
UNLOCK TABLES;

จากนั้นไม่มีทางที่จะได้รับความคืบหน้าจากกับ mysql จนกว่าจะปล่อยตารางล็อค

หากคุณสามารถรับLOCK TABLESและUNLOCK TABLESแสดงความคิดเห็นออกจาก dumpfile ...

  • หากตารางคือ MyISAM SELECT COUNT (*) จะทำงาน
  • หากตารางคือ InnoDB เลือก COUNT (*) อาจทำให้ช้า / หยุดโหลดจนกว่าการนับจะเสร็จสิ้น

ที่ได้ผล ขอบคุณ จากประสบการณ์หนึ่งคำถามสุดท้ายคือคุณรู้หรือไม่ว่าเวลาการนำเข้านั้นเป็นเส้นตรงตามขนาด.MYDและ.MYIขนาดไฟล์หรือไม่
qazwsx

1
โหลดตารางเป็นเชิงเส้น การสร้างดัชนีใหม่เป็นแบบเส้นตรง ปีที่ผ่านมามันก็ไม่ได้เป็นฉัน ventured นี้เป็นคำถามไปยัง MySQL ( lists.mysql.com/mysql/202489 ) และฉันกล่าวว่าใน DBA StackExchange ( dba.stackexchange.com/a/2697/877 )
RolandoMySQLDBA

8

ทุก 2 วินาทีคุณจะเห็นกระบวนการทำงาน

watch 'echo "show processlist;" | mysql -uuser -ppassword';

หากคุณต้องการให้ความถี่น้อยลงให้เพิ่ม-n xตำแหน่งxเป็นจำนวนวินาที 5 วินาทีจะเป็น:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';

คุณสามารถโพสต์ตัวอย่างผลลัพธ์ได้หรือไม่ นอกจากนี้ยังแสดงขั้นตอนหรือแสดงถึงความคืบหน้าของการนำเข้าซึ่งเป็นสิ่งที่ฉันขอจริงๆหรือไม่
qazwsx

นี่เป็นรหัสที่มีประโยชน์ Thankyou
NarayaN

6

หากคุณเพียงแค่ต้องการตรวจสอบว่ามันจนตรอกคุณสามารถสอบถาม

show processlist; 

และดูสิ่งที่กำลังดำเนินการ


5

เป็นวิธีแก้ปัญหาสำหรับคนที่ไม่สามารถรับ pv ไปทำงานหรือผู้ที่ pv บอกคำโกหก คุณสามารถมอนิเตอร์ขนาดของไฟล์ ibdata1 ใน / var / lib / mysql ซึ่งมีข้อมูล นี่จะเป็นขนาดเท่ากัน (หรือราว ๆ นั้น) ของขนาดไฟล์ในเซิร์ฟเวอร์ต้นทางของคุณ

หากมีหลายตารางคุณสามารถดูตารางเหล่านั้นได้ทีละรายการใน / var / lib / mysql / <ชื่อฐานข้อมูล>

ฉันได้ใช้ข้อเท็จจริงนี้เมื่อไม่นานมานี้เมื่อฐานข้อมูลระยะยาวสร้างล็อกไฟล์ประมาณ 20G ในช่วงสามหรือสี่ปี ฉันสังเกตเห็นว่าการถ่ายโอนนั้นใช้เวลานานและใช้เทคนิคนี้เพื่อติดตามความคืบหน้า

ฉันคิดว่ามันไม่น่าเป็นไปได้สูงที่วันนั้นจะเริ่มขึ้นเมื่อฐานข้อมูลไม่เกี่ยวข้องกับไฟล์ที่อื่น ในขณะเดียวกันคุณสามารถตรวจสอบไฟล์เพื่อดูว่าการถ่ายโอนกำลังดำเนินไปอย่างไร วิธีที่ฉันแนะนำนั้นเป็นสิ่งที่คุณสามารถทำได้ในรูปแบบเดียวหรืออีกรูปแบบหนึ่งตั้งแต่เขียนฐานข้อมูล sql แรก ฉันไม่เคยตั้งใจจะแนะนำว่ามันเป็นเทคนิค "ทางการ" ใด ๆ ที่นักจัดรายการด้วยตนเองสามารถถอยกลับมาได้ มันถือว่าระดับความสามารถทั่วไปกับคอมพิวเตอร์โดยทั่วไปและยูนิกซ์โดยเฉพาะ


2

หากฐานข้อมูลของคุณเงียบสงบ (เช่นไม่มีผู้ใช้อื่นที่ใช้งานอยู่) และคุณต้องการที่จะเห็นกิจกรรมการอ่าน / เขียนทำไมไม่ทำสิ่งที่ชอบ:

mysqladmin -h<host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

คุณจะเห็นจำนวนการอ่าน / เขียน / แทรก / รอ / อัปเดต

หากคุณกำลังแทรกตัวอย่างคุณจะเห็นสิ่งที่ชอบ:

Innodb_rows_inserted                          | 28958 

โดยที่ 28958 คือจำนวนแถวที่แทรกสำหรับช่วงเวลาของคุณ (10 วินาทีในกรณีของฉัน)


1

สำหรับใครบางคนที่กำลังมองหาตัวอย่างผู้ดูไปป์โดยใช้mysqldumpคุณเพียงแค่ทำสิ่งนี้:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

การ-Wตั้งค่าสถานะเพียงบอก pv เพื่อรอไบต์แรกที่จะมาก่อนที่จะแสดงความคืบหน้า (หลังจากพรอมต์)



0

ตกลงอีกรอบ แต่นั่นอาจเป็นตัวเลือกที่แย่ที่สุดและไม่ถูกต้อง

ที่กล่าวมานี่เป็นวิธีแก้ปัญหาสำหรับ Windows:

เปิดตัวจัดการงานที่กด

CTRL + SHIFT + ESC

คัดลอกความเร็วค่าดิสก์ "mysqld.exe"

e.g. 11mb/s

วางลงในเครื่องคิดเลขแบบนี้: https://techinternets.com/copy_calc?do

ประเมิน ETA กรณีของฉันคือ:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

ผล:

Beg -> 11:19
ETA -> 11:31
End -> 11:39

-1

ฉันประหลาดใจมากที่ไม่มีใครเพิ่งโพสต์ 'mysql -v' เป็นตัวเลือก หากติดค้างเอาท์พุทจะหยุด


3
"การตรวจสอบความคืบหน้า" โดยทั่วไปหมายถึงการพยายามประเมินว่ากระบวนการนั้นก้าวหน้าไปมากเพียงใดหรือเมื่อใดจะเสร็จสิ้นซึ่งmysql -vจะไม่เกิดขึ้น นอกจากนี้ยังพ่น 7 GB ของข้อมูลไปยังสถานีจะมีนัยสำคัญชะลอตัวลงเรียกคืน
mustaccio

ฉันเห็นขอบคุณสำหรับคำอธิบาย นั่นเป็นความจริงเอาต์พุตของ 7 GB จะไม่ดีสำหรับการส่งออกไปยังเทอร์มินัล ฉันเดาฉันใช้ -v เป็นเพียงสำหรับกรณีทดสอบท้องถิ่นขนาดเล็กที่ฐานข้อมูลของฉันเพิ่งจะติด
dtc

2
คำแนะนำนี้ช่วยให้ฉันระบุปัญหาได้ แต่อาจใช้ไม่ได้กับไฟล์ขนาดใหญ่ (เหมืองมีขนาดเล็ก)
Casey Perkins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.