ผู้ใช้บ่นว่าระบบทำงานช้าเมื่อ mysqldump อยู่ในระหว่างดำเนินการ


9

ฐานข้อมูล MYSQL (ibdata1) มีขนาด 73 GB และถูกกำหนดค่าให้ทำงานเป็นเซิร์ฟเวอร์ฐานข้อมูลเฉพาะบน Windows 2008 O / S สำหรับตาราง INNODB เรากำลังสำรองข้อมูลโดยใช้ mysqldump mysqldump --skip-opt --quick - transaction -create-options --extended-insert --disable-keys --add-drop-table - complete-insert - set-charset - การบีบอัด --log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqNbackup \ LIVE \ db \ Proddb0635.sql

ไฟล์สำรอง Proddb0635.sql ถูกเก็บไว้บนเซิร์ฟเวอร์ที่แยกต่างหากจากเซิร์ฟเวอร์ฐานข้อมูล RAM คือ 12 GB ขนาดบัฟเฟอร์ของ INNODB คือ 6 GB mem.pool เพิ่มเติมคือ 32 MB ขนาดแคชของแบบสอบถามคือ 2 GB ความยาวบัฟเฟอร์สุทธิคือ 16 M สูงสุด ขนาดแพ็คเก็ต 1 GB

รุ่น mysql คือ 5.0.67

เมื่อการสำรองข้อมูลไม่ได้ทำงานผู้ใช้จะพอใจกับประสิทธิภาพ

เมื่อการสำรองข้อมูลกำลังทำงานอัตราการเข้าใช้งานบัฟเฟอร์ของ INNODB นั้นสูงถึง 100% ไม่มีการอ่านหรือรอการอ่านที่ค้างอยู่ innodb รอฟรีคือ 0. การใช้งาน CPU ไม่สูงขั้นต่ำ 9% ถึงสูงสุด 15% อัตราการค้นหาแคชคิวต่ำประมาณ 40% โดยมีหรือไม่มี mysqlbackup กำลังทำงาน ขณะนี้ตัวจัดการงานของ Windows กำลังแสดงให้เห็นว่ามีการใช้ RAM 10GB ฉันควรเพิ่ม Query Cache ด้วย RAM เพียง 2GB หรือไม่ mysqlld-nt ใช้ RAM 9.2 GB และ mysqldump ใช้ RAM 5 MB Alos ตั้งข้อสังเกตว่าขนาดของไฟล์ดัมพ์นั้นเหมือนกันเมื่อมีหรือไม่มีตัวเลือก - บีบอัด

ฉันจะลดขนาดบัฟเฟอร์ของ iNNODB ได้ไหม

ขอบคุณ

คำตอบ:


8

มีปัญหาที่ทราบใน Windows คือเมื่อคุณส่งไฟล์ขนาดใหญ่ไปยังเซิร์ฟเวอร์อื่นหน่วยความจำทั้งหมดจะได้รับการจัดสรรให้กับแคชของระบบแทนกระบวนการของผู้ใช้ คุณสามารถดูในส่วนหน่วยความจำกายภาพ (MB) ของตัวจัดการงานเพื่อดูจำนวนหน่วยความจำที่จัดสรรให้กับแคชของระบบ

สิ่งนี้สามารถแก้ไขได้โดยการสำรองข้อมูลไปยังโลคัลดิสก์จากนั้นให้รีโมตเครื่องดึงไฟล์นั้น


ขอบคุณ mrdenny เรามีดิสก์ของเราเก็บไว้ใน SAN.Does ที่สร้างความแตกต่างด้วยหรือไม่
dbachacha

1
มันเป็นปัญหาไม่ว่าจะแสดงที่เก็บข้อมูลอย่างไร การเป็นที่เก็บข้อมูลเป็นที่เก็บข้อมูล SAN ไม่จำเป็นต้องคัดลอกไฟล์ผ่านเครือข่ายไปยังเครื่องอื่น แสดง LUN ใหม่ไปยังเซิร์ฟเวอร์ MySQL จากนั้นสำรองข้อมูลไปยังเครื่องนั้น หากคุณต้องการนำไฟล์ไปยังเครื่องอื่นเพื่อสำรองข้อมูลเทปให้ใช้ SAN Snap LUN นำเสนอสแน็ปช็อตไปยังเซิร์ฟเวอร์สำรองสำรองไฟล์แล้วลบสแน็ปช็อต ทำซ้ำในวันถัดไป นี่อาจเป็นสคริปต์ทั้งหมด
mrdenny

ข้อเสนอแนะครั้งที่ 1 ของคุณ: หมายเลข # ไม่เปลี่ยนแปลงในแคชของระบบ เกี่ยวกับ LUN ฉันจะถ่ายทอดให้เพื่อนร่วมงานที่ทำงานในทีมงานระบบและเครือข่าย
dbachacha

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

7

นี่คือความคิดที่ฉันมีเกี่ยวกับการปรับปรุงประสิทธิภาพ mysqldump ตามสถานการณ์ของคุณ นี่คือคำสั่งของคุณ:

mysqldump --skip-opt - ด่วน - ธุรกรรมเดี่ยว - สร้างตัวเลือก - ส่วนขยายแทรก - ปิดการใช้งานคีย์ - เพิ่ม - ลดลงตาราง - แทรกสมบูรณ์ --set-charset - บีบอัด - - -log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

สิ่งแรกที่ฉันสังเกตเห็นคือคุณกำลังเปลี่ยนเส้นทางผลลัพธ์ไปยังระบบไฟล์ มันบอกว่า 'devNas' ดังนั้นฉันจะสมมตินี้เป็นเครือข่ายการจัดเก็บข้อมูลที่แนบมาด้วย ฉันเป็นแฟนของ NAS สำหรับการสำรองข้อมูล แต่จะต้องเชื่อมต่อกับNIC จริงแยกต่างหากจากปริมาณการใช้งานจริง คุณอาจไม่ได้แบนด์วิดท์ที่อิ่มตัว แต่ก็ยังคงแข่งขันกันอยู่ สิ่งนี้จะเป็นปัญหามากขึ้นเนื่องจากแฟล็ก --quick เนื่องจากมันจะล้างทุกแถวแทนที่จะเก็บไว้ในหน่วยความจำ

สิ่งต่อไปที่ฉันเห็นคือคุณได้เรียกใช้ - บีบอัด ดูเหมือนว่าคุณกำลังใช้งาน mysql อยู่ภายในเครื่องเนื่องจากคุณไม่ได้ใช้สวิตช์ -h นี่อาจใช้ CPU โลคัลที่ไม่จำเป็นในบริบทนี้ - จำเป็นต้องมีการบีบอัดหรือไม่ มันบีบอัดข้อมูลระหว่างไคลเอนต์ mysqldump และเซิร์ฟเวอร์ mysql เท่านั้นไม่ใช่เนื้อหาไฟล์

ต่อไปฉันเห็นว่าคุณกำลังใช้ --Single-transaction สิ่งนี้จะทำให้ซีพียูพิเศษเพิ่มขึ้นเนื่องจากมีการทดสอบกับการเลือกทุกอันในส่วนของ mysqldump

สิ่งนี้ไม่เกี่ยวกับประสิทธิภาพ แต่คุณใช้ --disable-keys ซึ่งใช้ได้กับ MyISAM เท่านั้น ( ด้วยตนเอง )

คุณอาจต้องการทดลองใช้ mysqldump จากโฮสต์ออฟไลน์จากระยะไกลและย้ายไฟล์ดัมพ์ไปยัง NAS หลังจากเสร็จสิ้นเพื่อให้การดำเนินการนี้หลุดออกจากแบนด์มากที่สุด


ใช่ฉันตรวจสอบกับผู้ดูแลเครือข่ายและระบบ เป็น Network Attached Storage ฉันสามารถลองย้าย mysqldump ไปยังเซิร์ฟเวอร์อื่น นอกจากนี้ตอนนี้มันสมเหตุสมผลสำหรับฉันเกี่ยวกับการใช้ --compress คู่มือกล่าวว่า --compress ทำงานร่วมกับลูกค้าและเซิร์ฟเวอร์ แต่ฉันใส่มันเพื่อดูว่ามันสร้างความแตกต่าง ข้อมูลชนิดใดที่ไหลระหว่างไคลเอนต์ที่รัน mysqldump และเซิร์ฟเวอร์ฐานข้อมูล mysql ข้อมูลไหลระหว่างเซิร์ฟเวอร์ฐานข้อมูล mysql และ devNas เอกสาร MySQl และการออกแบบและปรับแต่งฐานข้อมูลหนังสือต้องการใช้งานธุรกรรมเดียวสำหรับตาราง INNODB
dbachacha

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

ฉันดีใจที่มันช่วยได้ ด้วยความปรารถนาดี
randomx

ที่นี่ฉันต้องการความช่วยเหลือในการทำความเข้าใจสถานการณ์สมมติต่อไปนี้: ฐานข้อมูล mysql อยู่บนเซิร์ฟเวอร์ A. mysqldump ทำงานบนเซิร์ฟเวอร์ B ที่ทิ้งข้อมูลบนเซิร์ฟเวอร์ C เรามี NIC เฉพาะจากเซิร์ฟเวอร์ A ไปยังเซิร์ฟเวอร์ C. ถูกต้องหรือไม่ ฉันไม่แน่ใจเมื่อคืนที่แล้ว mysqldump ทำงานบนเซิร์ฟเวอร์ A. ฉันต้องการเรียกใช้บนเซิร์ฟเวอร์อื่นเพื่อลดความขัดแย้งของ CPU
dbachacha

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

2

OBSERVATION # 1

นี่คือสิ่งที่คุณควรคำนึงถึงเมื่อทำการ mysqldump กับ InnoDB

หน้าสกปรกใด ๆ ที่มีอยู่ใน InnoDB Buffer Pool ต้องถูกล้างข้อมูลลงบนดิสก์ก่อน mysqldump จะเรียกใช้การล้างตาราง InnoDB ที่ยังมีหน้าสกปรกอยู่

มีตัวเลือกเซิร์ฟเวอร์ที่เรียกว่าinnodb_max_dirty_pages_pct ค่าเริ่มต้นคือ 75 คือ MySQL 5.5 และ 90 ในเวอร์ชันของ MySQL ก่อน 5.5 ในสภาพแวดล้อมการผลิตการตกลงให้หมายเลขนี้เป็นค่าเริ่มต้น

หากต้องการดูว่าคุณมีหน้าสกปรกจำนวนมากใน InnoDB Buffer Pool หรือไม่ให้เรียกใช้สิ่งนี้:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';

BTW หน้าเป็น 16K ตามที่แสดงจากนี้:

SHOW GLOBAL STATUS LIKE 'Innodb_page_size';

เมื่อมาถึง InnoDB และ mysqldump คุณสามารถลดจำนวนนี้ได้ในสองสถานการณ์

วงจร 1: ตั้งค่าอย่างถาวรเป็น 0

เพียงเพิ่มลงใน my.ini:

[mysqld]
innodb_max_dirty_pages_pct=0

สิ่งนี้จะทำให้ InnoDB Buffer Pool เอียงและมีค่าเฉลี่ย ขั้นตอนการล้างข้อมูลตาราง InnoDB ที่ถูกทิ้งจะรวดเร็วเนื่องจากหน้าเว็บสกปรกมากที่สุด (อาจเป็น 0) จะต้องล้างข้อมูลก่อนที่ mysqldump จะทำงาน

ข้อเสียเปรียบเพียงอย่างเดียวคือถ้าคุณ mysqldump จากฐานข้อมูลการค้ามนุษย์สูงอาจมีการเขียน I / O เพิ่มขึ้นเล็กน้อยเนื่องจากการล้างหน้าสกปรกออกบ่อยขึ้น คุณสามารถตรวจสอบว่าเป็นเช่นนั้นโดยไม่ต้องเริ่มใหม่ mysql โดยใช้สิ่งนี้:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

ออกจากการตั้งค่าเป็นเวลา 12-24 ชั่วโมงหากประสิทธิภาพการเขียนเป็นที่ยอมรับคุณก็พร้อมใช้งาน หากไม่ตั้งค่ากลับด้วย:

SET GLOBAL innodb_max_dirty_pages_pct = 90;

วงจร 2: ตั้งค่าเป็น 0 ประมาณ 1 ชั่วโมงก่อน mysqldump

SET GLOBAL innodb_max_dirty_pages_pct = 0;

เรียกใช้ mysqldump

SET GLOBAL innodb_max_dirty_pages_pct = 90;

ข้อสังเกต # 2

คุณมี- สมบูรณ์ - แทรกเป็นตัวเลือก mysqldump สิ่งนี้จะฝังชื่อคอลัมน์ไว้ในทุก ๆ ส่วนของ INSERT ก่อนค่า VALUES clause แม้จะมี --extended-insert ทุกชุดของแถวที่ถูกแทรกจะมีชื่อคอลัมน์ที่ถูกส่งไปยัง mysqldump คุณสามารถลดจำนวนไบต์ที่ส่งไปยัง mysqldump ได้โดยการลบ --complete-insert

คำแนะนำ

หากคุณมี Windows Server อื่นที่สามารถตั้งค่าเป็น Slave ได้ให้ทำการ mysqldumps จากสลาฟนั้นแทนจากเครื่องที่ใช้งานจริง


ขอบคุณ. ฉันลืมพูดถึงว่าผู้ใช้บ่นว่า "บันทึก" ต้องใช้เวลามากกว่าอ่าน ฉันจะใช้การสังเกตของคุณ # 2 ทันที ฉันชอบคำแนะนำของคุณในการมีทาสแล้วเอา mysqldump จากทาส
dbachacha

innodb_buffer_pool_dirty_pages ไม่สูงเกินไปก่อนที่การสำรองข้อมูลจะเริ่มขึ้น ประมาณ 9 ถึงสูงสุด 196. Master-Slave เป็นคำแนะนำที่ดีเช่นกัน
dbachacha

1
ฉันย้ายสคริปต์สำรองเพื่อให้ทำงานบนเซิร์ฟเวอร์อื่นและมีการปรับปรุงอย่างมาก นอกจากนี้เราพบว่ารหัสแอปพลิเคชันไม่ได้ใช้การเชื่อมต่อ sinngle ซ้ำ แต่เปิด / ปิดในฟังก์ชั่นหลายอย่างที่จัดกลุ่มเป็นคำขอเดียวไปยังเซิร์ฟเวอร์ฐานข้อมูล นอกจากนี้ฉันพบว่าการ์ด NIC หนึ่งใบถูกใช้ร่วมกันโดยข้อมูลสำรองและข้อมูลธุรกรรมออนไลน์ ดังนั้นเราวางแผนที่จะมี NIC เฉพาะสำหรับการสำรองข้อมูล ขอบคุณมาก. ถ้าไม่มีงานนี้ฉันก็มั่นใจว่านายทาสนั้นก็จะดีเช่นกัน
dbachacha
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.