วิธีเลิกทำ DROP Table


คำตอบ:


12

หากคุณไม่มีการสำรองข้อมูลอย่างแท้จริงฉันมั่นใจว่าคุณโชคดี 99%

หากคุณมีการสำรองข้อมูลในรูปแบบใด ๆ ก็ตาม แต่เก่าแล้วคุณได้เปิดการบันทึกแบบไบนารี่ผ่านตัวเลือก log-bin ในไฟล์ MySQL config (my.ini) หรือไม่? ถ้าเป็นเช่นนั้นคุณอาจสามารถกู้คืนได้ตั้งแต่การสำรองข้อมูลครั้งล่าสุด

วิธีที่ไม่ดีในการเริ่มต้นเพื่อนสัปดาห์ขอโทษ


2
สันนิษฐานว่าเป็นเพราะคุณไม่มีประสบการณ์เราทุกคนทำสิ่งนี้ แต่บางครั้งก็ยังทำ (ปิดกั้นตัวเองจาก VCenter ของฉันไม่จริงเมื่อสัปดาห์ที่แล้ว) - สิ่งที่สำคัญคือคุณเรียนรู้จากมันดังนั้นคุณจึงน้อย มีแนวโน้มที่จะทำซ้ำ
Chopper3

ฉันต้องทำอะไรตอนนี้ ?? ฉันไม่สามารถนั่งรอได้ !!!!

8
บอกผู้จัดการของคุณ
Chopper3

4
ไม่สามารถแก้ไขปัญหาได้ แต่นักพัฒนาของคุณอาจมีสำเนาที่ไม่ได้อยู่ห่างจากสำเนาที่ดีครั้งล่าสุด
Tom O'Connor

3
ทอมยกประเด็นที่ดีมากขึ้นมา: หากนักพัฒนาของคุณติดนิสัยการถ่ายภาพข้อมูลสดเป็นประจำเพื่อการทดสอบ / พัฒนาคุณอาจโชคดีและหนึ่งในนั้นมีสำเนาที่ไม่ได้ทำเรื่องล่าสุดเพื่อลดระดับสถานการณ์ของคุณจาก " เสร็จสิ้นภัยพิบัติ "เป็น" ความไม่สะดวกที่สำคัญ "เท่านั้น
David Spillett

7

คำถามค่อนข้างเก่า แต่ไม่มีคำตอบในเชิงบวกเดียวดังนั้นฉันจะเพิ่มอีกหนึ่งคำถาม

หลังจาก MySQL วางตารางข้อมูลจะยังคงอยู่ในสื่ออยู่ครู่หนึ่ง ดังนั้นคุณสามารถดึงข้อมูลและสร้างตารางใหม่ได้ ต่อมาฉันจะบล็อกเกี่ยวกับมัน แต่ตอนนี้ร่างอย่างรวดเร็ว

คุณจะต้องมีโครงสร้างของตารางของคุณ (คำสั่ง CREATE TABLE)

ถ้า innodb_file_per_table อยู่บนตารางที่ดร็อปอยู่บนดิสก์พาร์ติชัน หยุด MySQL และติดตั้งใหม่เป็นแบบอ่านอย่างเร็ว หาก MySQL อยู่บนพาร์ติชันรูท (ซึ่งไม่ใช่ความคิดที่ดี btw) ให้ถ่ายรูปหรือนำดิสก์ออกแล้วเสียบกับเซิร์ฟเวอร์อื่น หยุดเขียนทั้งหมดในคำอื่น ๆ

ถ้า innodb_file_per_table OFF ให้หยุด MySQL

จากนั้นดาวน์โหลดและรวบรวมเครื่องมือยกเลิกการลดลงสำหรับ InnoDB จากhttps://github.com/twindb/undrop-for-innodb/ ตรวจสอบการโพสต์" รวบรวมเครื่องมือการกู้คืน TwinDB " สำหรับรายละเอียด

จากนั้นแยกวิเคราะห์พาร์ติชันดิสก์หรือ ibdata1 (ขึ้นอยู่กับการตั้งค่า innodb_file_per_table) ด้วย stream_parser:

./stream_parser -f /path/to/diskimage_or_ibdata1

จากนั้นกู้คืนพจนานุกรม InnoDB เพื่อให้ทราบว่า index_id ตารางที่ถูกดร็อปคืออะไร

จากนั้นใช้โครงสร้างตารางและดึงระเบียน

./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page

มันจะส่งออกบันทึกไปยัง stdout และคำสั่งโหลดข้อมูลไปยัง stderr


คุณช่วยชีวิตฉันไว้
Buddhi741

2

นี่คือสิ่งที่ฉันทำ ในไดเรกทอรี mysql (สำหรับ Ubuntu นี่คือ / var / lib / mysql สำหรับ Mac ที่ใช้ Homebrew นี่คือ / usr / local / var / mysql) ฉันพบไฟล์บางไฟล์ ก่อนอื่นฉันคัดลอก myapp_development / directory ที่มี schema เฉพาะลงในไดเรกทอรี mysql ในพื้นที่ของฉัน จากนั้นฉันก็สำรองข้อมูล ibdata1 ในเครื่องของฉันและคัดลอก ibdata1 ของเซิร์ฟเวอร์ไปยังไดเรกทอรี mysql ฆ่า mysqld ( ps auxเพื่อค้นหา PID จากนั้นkill PID) เริ่ม mysql ใหม่มันเริ่มต้นในโหมดการกู้คืนความผิดพลาด จากนั้นจึงเปิดไคลเอนต์ mysql ในพื้นที่ของฉันและสร้างตารางเต็มที่ฉันต้องการ

และ 15,000 แถวที่แสดงถึงสัปดาห์ของการทำงานเข้าสู่เมทาดาทาที่เราคิดว่าหายไปตลอดกาลจะถูกบันทึกไว้ !!

หวังว่านี่จะช่วยใครซักคน


นั่นเป็นความพยายามที่ดี แต่ฉันแน่ใจว่าจะไม่ได้รับความหวังมากเกินไปในเรื่องนี้ว่าเป็นเทคนิคที่เชื่อถือได้ อย่างไรก็ตาม +1 สำหรับการคิดอย่างสร้างสรรค์
John Gardeniers

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

2

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

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


มีตัวเลือกอื่น ๆ อีกไหม?

1
ดังที่ FractalizeR แนะนำถ้าตารางเป็นตาราง MyISAM อย่างง่ายคุณอาจยกเลิกการลบไฟล์ที่เกี่ยวข้องได้ หากคุณกำลังจะลองแล้วคุณจะต้องปิดเซิร์ฟเวอร์ตอนนี้เพราะยิ่งระบบใช้งานได้นานขึ้นโอกาสที่มากขึ้นคือว่าพื้นที่ที่ใช้ไฟล์จะถูกนำมาใช้ซ้ำทำให้ยกเลิกการลบไม่ได้ (หรือการลบไฟล์ที่ลบไม่ได้มีเนื้อหาเสียหาย ) วิธียกเลิกการลบขึ้นอยู่กับระบบไฟล์ที่ใช้ ntfsundelete.comเป็นลิงค์ค้นหาที่มีประโยชน์ครั้งแรกในการค้นหาของ Google เพื่อยกเลิกการลบบน NTFS
David Spillett

0

หากนี่คือตาราง MyISAM คุณต้องยกเลิกการลบไฟล์ตารางใน / var / log / mysql หรือข้อมูลใด ๆ ที่คุณต้องการ คุณสามารถใช้โปรแกรมอรรถประโยชน์ext3grepเพื่อเป็นตัวอย่าง


ext3grep ใช้สำหรับระบบไฟล์ ext3 หากคุณใช้ Windows คุณไม่น่าจะใช้ระบบไฟล์ ext3 (โอกาสที่คุณใช้ NTFS อยู่อาจเป็น FAT32) หากคุณกำลังจะลองกู้คืนไฟล์ที่ถูกลบใด ๆ ที่คุณจำเป็นต้องปิดเซิร์ฟเวอร์โดยเร็วที่สุดไม่ว่าบริการอื่น ๆ จะทำงานอยู่ที่ใดเพราะเซิร์ฟเวอร์ที่ใช้งานอยู่นานขึ้นมีโอกาสมากขึ้นที่การยกเลิกการลบไม่สามารถช่วยได้ คุณเลย
David Spillett

หากคุณเปิดเงาคัดลอกบนวอลลุ่มที่จัดเก็บตาราง MyISAM คุณจะได้ช็อตที่ทำให้มันกลับมาเหมือนเดิม
Catherine MacInnes

หากต้องการกู้คืนไฟล์ฐานข้อมูลที่ถูกลบคุณสามารถค้นหา "ntfs undelete" ใน google ได้ ฉันไม่ทราบว่าข้อมูล dir ตั้งอยู่บนพีซีของคุณ คุณต้องตรวจสอบ my.ini ของคุณเพื่อหาสิ่งนั้นหรือค้นหาไฟล์ที่มีนามสกุล MYD
Vladislav Rastrusny

0

คุณไม่สามารถ DROP TABLE"ยกเลิก"

คุณสามารถดูและดูว่า MySQL มีการเปิดใช้งานการบันทึกแบบไบนารีหรือไม่คุณสามารถดึงข้อมูลบางส่วนได้จากตรงนั้น

นอกเหนือจากนั้นคุณสามารถลืม MySQL และอยู่ในระดับเดียวกันของปัญหา "ฉันลบบางไฟล์ออกจากระบบไฟล์ของฉัน" มีเครื่องมือบางอย่างที่พยายามกู้คืนไฟล์และยังมี บริษัท ที่ทำอย่างมืออาชีพ


-1

หากคุณเปิดการบันทึกแบบไบนารี่คุณสามารถสร้างตารางใหม่ได้ก่อนหากคุณมีสคีมา ตรวจสอบให้แน่ใจว่าคุณสร้างสคีมาในขณะที่ปิด Binlogs หรือคุณสามารถข้ามเซสชันได้ จากนั้นคุณสามารถเล่นซ้ำ binlogs จนถึงคำสั่งสุดท้ายซึ่งเป็นตารางการปล่อยตัวเอง

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

สำหรับอนาคตคุณอาจต้องการมีทาสที่ล่าช้ากว่า 10-24 ชั่วโมง คุณสามารถสร้าง Slave ที่ล่าช้าโดยใช้ชุดเครื่องมือ percona (pt-slave-delay)

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