การลบตาราง MySQL ด้วยธุรกรรมที่ค้างอยู่


10

มีวิธีการลบตาราง InnoDB หรือฐานข้อมูลที่มีธุรกรรมที่ค้างอยู่ใน MySQL (ควรอยู่ในระดับระบบไฟล์) หรือไม่?

เกิดอะไรขึ้น:

ฉันใช้ MySQL 5.5.28 และวิ่งLOAD DATA INFILE…เพื่อนำเข้าชุดข้อมูลขนาดใหญ่ (300M แถว) ลงในตาราง InnoDB ฉันไม่ได้ใช้set autocommit = 0;มาก่อน น่าเสียดายที่mysqldมีการหยุดกลางการนำเข้า

เมื่อฉันรีสตาร์ทmysqlจะพยายามย้อนกลับธุรกรรมที่กรอกบันทึกของระบบด้วยข้อความเช่นนี้:

mysqld_safe [4433]: 121212 16:58:52 InnoDB: กำลังรอ 1 ธุรกรรมที่กำลังจะเสร็จสิ้น

ปัญหาคือการย้อนกลับทำงานมากกว่า 25 ชั่วโมงในขณะนี้ซึ่ง mysqldไม่ยอมรับการเชื่อมต่อซ็อกเก็ตใด ๆ

ฉันไม่สามารถลบ/var/lib/mysql/*และเริ่มจากศูนย์ได้เนื่องจากมีบางฐานข้อมูล InnoDB / ตารางอื่น ๆ ในเครื่องนี้เช่นกัน อย่างไรก็ตามตารางที่มีปัญหานั้นเป็นตารางเดียวในฐานข้อมูลแยกต่างหาก การลบทั้งตารางหรือฐานข้อมูลทั้งหมดไม่ใช่ปัญหาเนื่องจากฉันสามารถนำเข้าข้อมูลทั้งหมดอีกครั้งในภายหลัง

คำตอบ:


8

ไม่มีสิ่งใดที่คุณสามารถทำได้จริง ๆ เพราะการย้อนกลับถูกทำผ่านUNDO tablespace ใน ibdata1ซึ่งน่าจะเพิ่มขึ้นอย่างมาก

หากคุณฆ่ากระบวนการ mysqld และรีสตาร์ท mysql มันจะทำการดึงข้อมูลที่ค้างไว้ซึ่งเป็นส่วนหนึ่งของวงจรการกู้คืนความผิดพลาด

การปฏิเสธความรับผิด: ไม่รับผิดชอบต่อการสูญเสียข้อมูล

สิ่งที่คุณสามารถทำได้อาจทำให้ข้อมูลสูญหายสำหรับตารางอื่น แต่มีบางสิ่งที่คุณสามารถทำได้เพื่อหลีกเลี่ยงวงจรการกู้คืนความผิดพลาดปกติของ InnoDB

มีตัวเลือกการเริ่มต้นที่เรียกว่าinnodb_force_recoveryซึ่งช่วยให้คุณสามารถข้ามขั้นตอนต่าง ๆ ของการกู้คืนความเสียหายของ InnoDB ได้

ตามเอกสาร MySQL บนบังคับ InnoDB การกู้คืนที่นี่มีการตั้งค่าและผลกระทบ:

1 (SRV_FORCE_IGNORE_CORRUPT)

ปล่อยให้เซิร์ฟเวอร์ทำงานแม้ว่าจะตรวจพบหน้าเว็บที่เสียหาย ลองสร้าง SELECT * FROM จาก tbl_name เพื่อบันทึกเรคคอร์ดและเพจที่เสียหายซึ่งจะช่วยในการดัมพ์ตาราง

2 (SRV_FORCE_NO_BACKGROUND)

ป้องกันไม่ให้เธรดหลักทำงาน หากเกิดความผิดพลาดขึ้นระหว่างการดำเนินการล้างค่าการกู้คืนนี้จะป้องกัน

3 (SRV_FORCE_NO_TRX_UNDO)

อย่าเรียกใช้ธุรกรรมย้อนกลับหลังจากการกู้คืนความผิดพลาด

4 (SRV_FORCE_NO_IBUF_MERGE)

ป้องกันการแทรกการผสานบัฟเฟอร์ หากพวกเขาจะทำให้เกิดความผิดพลาดอย่าทำ อย่าคำนวณสถิติตาราง

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

อย่าดูบันทึกการเลิกทำเมื่อเริ่มต้นฐานข้อมูล: InnoDB จัดการกับการทำธุรกรรมที่ไม่สมบูรณ์ตามที่ได้รับมอบหมาย

6 (SRV_FORCE_NO_LOG_REDO)

ห้ามทำการย้อนการล็อกการทำซ้ำในการเชื่อมต่อกับการกู้คืน

ด้วยการเปลี่ยนแปลงการทำธุรกรรมที่ฝังอยู่ในบันทึก UNDO และ REDO คุณจะเสี่ยงต่อการ

  • การสูญเสียข้อมูลหมายถึงการเขียน
  • การเก็บข้อมูลหมายถึงการถูกลบ

ในกรณีที่คุณคาดว่าจะเกิดผลข้างเคียงที่ไม่ดีให้สำรองข้อมูล / var / lib / mysql ทั้งหมดไว้ที่อื่นในกรณีที่คุณต้องการคัดลอก ibdata1, ib_logfile0 และ ib_logfile1 แล้วลองกู้คืนตามปกติ

หาก mysql เต็มในโหมดใดโหมดหนึ่ง

  • mysqldump ข้อมูลทั้งหมดยกเว้นตารางที่ละเมิด
  • ปิด mysql
  • ลบทุกอย่างใน / var / lib / mysql ยกเว้น / var / lib / mysql / mysql
  • เริ่ม mysql
  • โหลด mysqldump อีกครั้ง

ถ้ำ: ให้แน่ใจว่าคุณสำรองข้อมูลทุกอย่าง !!!

ฉันหวังว่านี่จะช่วยได้ !!!


1

ฉันมีสถานการณ์ที่คล้ายกันในสัปดาห์นี้

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

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

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