เหตุใดตาราง MySQL InnoDB ทั้งหมดจึงมีการแยกส่วน


10

ด้วยเหตุผลบางอย่างตาราง InnoDB ทั้งหมดในเซิร์ฟเวอร์ MySQL ของฉันจะแสดงรายการแยกส่วนเมื่อฉันเรียกใช้ mysqltuner ฉันติดตั้งเซิร์ฟเวอร์เมื่อไม่กี่ชั่วโมงที่ผ่านมา (บน OSX Lion) และมีข้อมูลใหม่มากมายที่นำเข้าจากไฟล์แบตช์ในนั้น

ฉันพยายามแปลงตารางทั้งหมดในฐานข้อมูลเดียวเป็น MYISAM และจำนวนตารางที่กระจัดกระจายก็ลดลง แม้ว่าจะแปลกใจทันทีที่ฉันแปลงตารางเหล่านั้นกลับไปที่ InnoDB จำนวนตารางที่กระจัดกระจายก็ถูกยิงกลับมาอีกครั้ง นี่เป็นสิ่งที่ตรงกันข้ามกับงานวิจัยของฉันซึ่งแนะนำว่าการวิ่งALTER TABLE table_name ENGINE=INNODB;ควรแก้ไขการกระจายตัว

หลังจาก Googling นิดหน่อยฉันก็วิ่งไป:

SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB 
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0

ซึ่งควรจะแสดงรายการตารางการแยกส่วนทั้งหมด (มันจะกลับจำนวนผลลัพธ์ที่แน่นอนเช่นเดียวกับ mysqltuner ผลลัพธ์สำหรับการนับตารางการแยกส่วน) ทุกรายการเดียวมีจำนวนเท่ากันในdata_free_MBคอลัมน์ (ปัจจุบัน 7.00000000)

นี่เป็นปัญหาจริงหรือสิ่งที่ mysqltuner ทำผิดหรือเปล่า? หากเป็นปัญหาฉันจะแก้ไขได้อย่างไร

แก้ไข

ฉันสงสัยมากขึ้นเรื่อย ๆ ว่าฉันเป็นคนงี่เง่าและการแตกแฟรกเมนต์ขนาด 7MB สำหรับไฟล์ทั้งหมดไม่ใช่สำหรับแต่ละตาราง ทุกคนสามารถยืนยันได้หรือไม่ว่าเป็นเช่นนั้น


คุณคิดว่า 7 MB ฟรีเป็นปัญหาหรือไม่
David Schwartz

@DavidSchwartz ไม่ใช่เบาะแสนั่นคือเหตุผลที่ฉันถาม;) มี 2314 ตารางแต่ละฟรี 7MB และฉันไม่รู้ว่าหมายถึงอะไร ฉันไม่แน่ใจว่าทำไม mysqltuner จะแสดงให้ฉันเห็นว่ามันไม่ใช่สาเหตุที่น่าเป็นห่วง ฉันหวังว่าจะมีใครบางคนที่นี่สามารถบอกฉันได้ว่ามีความกังวลอย่างไรที่จะได้รับตัวเลขและสิ่งที่ฉันสามารถทำได้เพื่อลดปัญหาเนื่องจากวิธีการ 'มาตรฐาน' ไม่ทำงาน
Clive

การโยกย้ายคำถามนี้ตามคำขอของผู้ใช้ในการตั้งค่าสถานะ
Daniel Beck

รายละเอียดส่วนใหญ่ mysqltuner แสดงเป็นข้อมูลเท่านั้น ไม่ใช่ทุกสิ่งที่เป็นปัญหา หากเป็นปัญหาก็จะพูดอย่างชัดเจน สิ่งนี้บ่งชี้ว่าเป็นปัญหาหรือไม่?
John Gardeniers

@JohnGardeniers ผมเชื่อเช่นนั้นข้อความ: [!!] Total fragmented tables: 2314ซึ่งผมค่อนข้างมั่นใจว่าระบุว่าเป็นปัญหา (มีคู่เครื่องหมายอัศเจรีย์สีแดง)
ไคลฟ์

คำตอบ:


5

ตามความเห็นของฉันข้างต้นไม่ได้ผลลัพธ์ทั้งหมดจาก sqltuner บ่งชี้ข้อผิดพลาด ยกเว้นว่าสคริปต์ระบุไว้อย่างชัดเจนว่าเป็นปัญหาโดยปกติจะอยู่ในบรรทัดถัดไปตามด้วยคำแนะนำสำหรับการแก้ไขจากนั้นจึงเป็นรายการที่ให้ข้อมูลเท่านั้น


3

เมื่อคุณเปิดใช้งานinnodb_file_per_tableสิ่งที่คุณทำคือการตั้งค่าโปรโตคอลเพื่อสร้างตาราง InnoDB ใหม่ใด ๆ ใน.ibdไฟล์ภายนอก ตาราง InnoDB ทั้งหมดที่คุณสร้างไว้ก่อนหน้านี้จะยังคงฝังอยู่ใน ibdata1

เมื่อปิดใช้งาน innodb_file_per_table ทุกครั้งที่คุณเรียกใช้

ALTER TABLE table_name ENGINE=INNODB;

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

คำแนะนำ

คุณจะต้องส่งออกข้อมูลทั้งหมดลบ ibdata1, ib_logfile0, ib_logfile1 และโหลดซ้ำ

ฉันเขียนถึงวิธีการและเหตุผลในการทำเช่นนี้

อัพเดท 2012-08-15 12:05 EDT

คุณอาจต้องการค้นหาสคริปต์ mysqltuner.pl ด้วยตนเอง IMHO ฉันคิดว่ามันใช้สูตรเก่าสำหรับการวัดการกระจายตัว ตรวจสอบให้แน่ใจว่าคุณมี mysqltuner เวอร์ชันล่าสุด

สำหรับการวัดการแตกแฟรกเมนต์ของตาราง InnoDB ที่จัดเก็บภายนอกฉันเขียนโพสต์เกี่ยวกับเรื่องนั้นในวันที่ 11 เมษายน 2012 (ดูอัปเดตที่ด้านล่างสำหรับ 19 เมษายน 2012)


1
Ahhh โอเคสิ่งที่ทำให้รู้สึกมากขึ้นตอนนี้ขอบคุณ ฉันสิ้นสุดการส่งออกข้อมูลเช็ด MySQL อย่างสมบูรณ์จากนั้นทำการติดตั้งใหม่ (แต่เพิ่มinnodb_file_per_tableลงในไฟล์ conf ก่อนเริ่มเซิร์ฟเวอร์และนำเข้าอีกครั้ง) ก่อนหน้านั้นฉันได้รับข้อผิดพลาดทุกประเภทของ InnoDB (ประเภทที่ไม่ดีจริง ๆ ... หมายความว่าฉันต้องทำงานด้วยinnodb_force_recoveryที่ระดับ 6 เพียงเพื่อให้ได้ข้อมูลออก!) และทุกประเภทของ 'วันที่ล็อกไฟล์อยู่ใน อนาคต!' ข้อผิดพลาด ดูเหมือนว่าตอนนี้จะหยุดแล้ว แต่ฉันยังมีตารางแยกชิ้นไม่กี่อัน ฉันจะจับตาดูมันขอบคุณอีกครั้งสำหรับอินพุต
Clive

! น่ากลัว นี่เป็นข้อมูลที่มาก ขอบคุณ @RolandoMySQLDBA!
Sudhi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.