ข้อเท็จจริง
ext4
คุณบอกว่าคุณกำลังใช้ ขีด จำกัด ขนาดไฟล์คือ 16TB ดังนั้นSample.ibd
ไม่ควรเต็ม
คุณบอกว่าคุณมีinnodb_data_file_path
ibdata1:10M:autoextend
ดังนั้นไฟล์ ibdata1 เองจึงไม่มีขีด จำกัด ของขนาดยกเว้นจากระบบปฏิบัติการ
เหตุใดข้อความนี้จึงเกิดขึ้นทั้งหมด สังเกตว่าข้อความคือ "ตาราง ... เต็ม" ไม่ใช่ "ดิสก์ ... เต็ม" ตารางเงื่อนไขนี้เต็มจากมุมมองเชิงตรรกะ คิดเกี่ยวกับ InnoDB เกิดปฏิกิริยาอะไรขึ้น?
ฉันเดาว่า InnoDB กำลังพยายามโหลดข้อมูล 93GB เป็นธุรกรรมเดียว Table is Full
ข้อความจะแพร่กระจายจากที่ไหน ฉันจะดูที่ ibdata1 ไม่ใช่ขนาดทางกายภาพของมัน (ซึ่งคุณได้ตัดออกไปแล้ว) แต่ในแง่ของข้อ จำกัด ของการทำธุรกรรม
ภายใน ibdata1 คืออะไรเมื่อเปิดใช้งานinnodb_file_per_tableและคุณโหลดข้อมูลใหม่ลงใน MySQL
- พจนานุกรมข้อมูล
- บัฟเฟอร์การเขียนซ้ำ
- Safety Net เพื่อป้องกันการเสียหายของข้อมูล
- ช่วย Bypass OS สำหรับการแคช
- แทรกบัฟเฟอร์ (ปรับปรุงการเปลี่ยนแปลงดัชนีรอง)
- ส่วนย้อนกลับ
- เลิกทำการบันทึก
- คลิกที่นี่เพื่อดูภาพแทน
ibdata1
ความสงสัยของฉันบอกฉันว่าบันทึกการเลิกทำและ / หรือการทำซ้ำบันทึกเป็นความผิด
บันทึกเหล่านี้คืออะไร? ตามหนังสือ
บทที่ 10: "เครื่องมือจัดเก็บ" หน้า 203 ย่อหน้า 3,4 พูดต่อไปนี้:
เอ็นจิ้น InnoDB เก็บบันทึกสองประเภท: บันทึกเลิกทำและบันทึกทำซ้ำ วัตถุประสงค์ของการบันทึกการเลิกทำคือการย้อนกลับการทำธุรกรรมเช่นเดียวกับการแสดงข้อมูลรุ่นเก่ากว่าสำหรับการสืบค้นที่รันในระดับการแยกธุรกรรมที่ต้องใช้ รหัสที่จับบันทึกยกเลิกสามารถพบได้ในการจัดเก็บข้อมูล / innobase / buf / log / log0log.c
วัตถุประสงค์ของบันทึกการทำซ้ำคือการจัดเก็บข้อมูลที่จะใช้ในการกู้คืนความผิดพลาด อนุญาตให้กระบวนการกู้คืนดำเนินการธุรกรรมที่อาจหรืออาจไม่เสร็จสิ้นก่อนที่จะเกิดความผิดพลาด หลังจากดำเนินการธุรกรรมเหล่านั้นอีกครั้งฐานข้อมูลจะถูกนำไปสู่สถานะที่สอดคล้องกัน รหัสที่เกี่ยวข้องกับการทำซ้ำล็อกที่สามารถพบได้ในการจัดเก็บข้อมูล / innobase / log / log0recv.c
การวิเคราะห์
มี 1023 เลิกทำบันทึกอยู่ภายใน ibdata1 (กลุ่มดูย้อนกลับและเลิกทำอวกาศ) เนื่องจากบันทึกเลิกทำเก็บสำเนาข้อมูลตามที่ปรากฏก่อนที่จะโหลดอีกครั้ง 1,023 บันทึกการเลิกทำทั้งหมดถึงขีด จำกัด แล้ว จากมุมมองอื่น ๆ 1,023 บันทึกการเลิกทำทั้งหมดอาจจะทุ่มเทให้กับธุรกรรมหนึ่งที่โหลดSample
ตาราง
แต่เดี๋ยวก่อน...
คุณอาจพูดว่า "ฉันกำลังโหลดSample
ตารางว่าง" บันทึกเลิกทำมีส่วนร่วมอย่างไร ก่อนที่Sample
ตารางจะถูกโหลดด้วยข้อมูล 93GB มันจะว่างเปล่า การแทนทุกแถวที่ไม่มีอยู่ต้องใช้พื้นที่ว่างในการทำความสะอาดใน Undo Logs เติม 1,023 บันทึกการเลิกทำดูเหมือนเล็กน้อยเนื่องจากปริมาณข้อมูลที่ไหลเข้าibdata1
มา ฉันไม่ใช่คนแรกที่สงสัยสิ่งนี้:
จากเอกสาร MySQL 4.1, หมายเหตุPosted by Chris Calender on September 4 2009 4:25pm
:
โปรดทราบว่าใน 5.0 (pre-5.0.85) และใน 5.1 (pre-5.1.38) คุณอาจได้รับข้อผิดพลาด "table is full" สำหรับตาราง InnoDB หาก InnoDB หมดสล็อตเลิกทำ (bug # 18828)
นี่คือรายงานข้อผิดพลาดสำหรับ MySQL 5.0: http://bugs.mysql.com/bug.php?id=18828
คำแนะนำ
เมื่อคุณสร้าง mysqldump ของSample
ตารางโปรดใช้--no-autocommit
mysqldump --no-autocommit ... mydb Sample > Sample.sql
นี้จะทำให้ชัดเจนทุกครั้งหลังCOMMIT;
INSERT
จากนั้นโหลดตารางอีกครั้ง
ถ้าสิ่งนี้ใช้ไม่ได้ ( คุณจะไม่ทำแบบนี้ ) ให้ทำสิ่งนี้
mysqldump --no-autocommit --skip-extended-insert ... mydb Sample > Sample.sql
สิ่งนี้จะทำให้แต่ละ INSERT มีเพียงหนึ่งแถว mysqldump จะใหญ่กว่ามาก (มากกว่า 10+ เท่า) และอาจใช้เวลาโหลดนาน 10 ถึง 100 เท่า
ไม่ว่าในกรณีใดกรณีนี้จะเป็นการสำรองบันทึกการเลิกทำจากการถูกน้ำท่วม
ให้มันลอง !!!
อัพเดท 2013-06-03 13:05 EDT
คำแนะนำเพิ่มเติม
หากตารางระบบ InnoDB (aka ibdata1) ขีด จำกัด ขนาดไฟล์และไม่สามารถใช้ Undo Logs คุณสามารถเพิ่ม tablespace ระบบอื่น (ibdata2)
ฉันเพิ่งพบสถานการณ์นี้เมื่อสองวันก่อน ฉันอัปเดตโพสต์เก่าของฉันด้วยสิ่งที่ฉันทำ: ดูการออกแบบฐานข้อมูล - การสร้างฐานข้อมูลหลายรายการเพื่อหลีกเลี่ยงการ จำกัด ขนาดตาราง
โดยพื้นฐานแล้วคุณต้องเปลี่ยนinnodb_data_file_pathเพื่อรองรับไฟล์ tablespace ของระบบใหม่ ให้ฉันอธิบายวิธี:
สถานการณ์
บนดิสก์ (ext3) เซิร์ฟเวอร์ของลูกค้าของฉันมีดังต่อไปนี้:
[root@l*****]# ls -l ibd*
-rw-rw---- 1 s-em7-mysql s-em7-mysql 362807296 Jun 2 00:15 ibdata1
-rw-rw---- 1 s-em7-mysql s-em7-mysql 2196875759616 Jun 2 00:15 ibdata2
การตั้งค่าคือ
innodb_data_file_path=ibdata1:346M;ibdata2:500M:autoextend:max:10240000M
โปรดทราบว่าการibdata2
ขยายตัวเพื่อ 2196875759616 2145386484M
ซึ่งเป็น
ฉันต้องฝังขนาดไฟล์ของibdata2
ลงใน innodb_data_file_path และเพิ่มibdata3
innodb_data_file_path=ibdata1:346M;ibdata2:2196875759616;ibdata3:10M:autoextend
เมื่อฉันรีสตาร์ท mysqld มันทำงาน:
[root@l*****]# ls -l ibd*
-rw-rw---- 1 s-em7-mysql s-em7-mysql 362807296 Jun 3 17:02 ibdata1
-rw-rw---- 1 s-em7-mysql s-em7-mysql 2196875759616 Jun 3 17:02 ibdata2
-rw-rw---- 1 s-em7-mysql s-em7-mysql 32315015168 Jun 3 17:02 ibdata3
ใน 40 ชั่วโมงibdata3
เพิ่มขึ้นเป็น 31G MySQL ทำงานอีกครั้ง