วิธีการกู้คืนตาราง InnoDB ซึ่งไฟล์ถูกย้ายไปมา


13

ดังนั้นฉันมีเซิร์ฟเวอร์ทดสอบ db ที่ติดตั้งในกระแสการจำลอง โดยชื่อการเพิ่มประสิทธิภาพผ่านมาซึ่งเต็มพื้นที่อย่างรวดเร็วบนทาสข้อมูล Mysql ตามหน้าที่กำลังรอพื้นที่เพิ่มขึ้น

datadir นี้เป็นระบบไฟล์ที่ใช้เป็น datadir ของ mysql เท่านั้นดังนั้นจึงไม่มีสิ่งอื่นใดที่จะทำให้ว่าง

ฉันมีตารางการทดสอบขนาด 4 กิ๊กที่ไม่ได้เป็นส่วนหนึ่งของกระแสข้อมูลการจำลองดังนั้นฉันจึงคิดว่าฉันลองทำบางสิ่งเพื่อดูว่ามันใช้งานได้หรือไม่และการเป็นสภาพแวดล้อมการทดสอบ

นี่คือขั้นตอนที่ฉันทำ

  1. ล้างตารางที่ฉันกำลังจะย้าย
  2. วางล็อกการอ่านไว้ (แม้ว่าจะไม่มีอะไรถูกเขียนลงไปและไม่ได้อยู่ในสตรีมการจำลองแบบ)
  3. คัดลอก. frm และ. ibd ไปยังระบบไฟล์ที่มีห้องว่าง
  4. ปลดล็อกตาราง
  5. ตัดทอนตารางนั้น - ทำให้มีพื้นที่ว่างเพียงพอสำหรับการปรับให้เสร็จสมบูรณ์เมื่อการเรพลิเคทเริ่มต้นการสับอีกครั้ง
  6. หยุดทาส / ปิด mysql
  7. คัดลอกไฟล์จาก tmp กลับไปยัง data dir
  8. รีสตาร์ท mysql

ไม่มีสิ่งใดปรากฏในบันทึก .err สิ่งต่าง ๆ ดูดี ฉันเชื่อมต่อและใช้ mydb; และดูตารางที่ฉันเล่นด้วยในตารางแสดง แต่ถ้าฉันลอง

select * from testtable limit 10;

ฉันได้รับข้อผิดพลาด

ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist

จากสิ่งที่ฉันสามารถบอกได้จนถึงตอนนี้ฉันสามารถอ่านจากตารางอื่น ๆ ทั้งหมดได้ดีและเริ่มทำสำเนาสำรองโดยไม่มีข้อร้องเรียนใด ๆ

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

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

คำตอบ:


15

สิ่งที่ใหญ่ที่สุดที่คนส่วนใหญ่ลืมเกี่ยวกับการตัดตารางคือตารางตัดเป็น DDL และความไม่ดราก้อน ใน InnoDB ข้อมูลเมตาภายใน ibdata1 มีรายการหมายเลขของตาราง InnoDB การใช้ TRUNCATE TABLE ทำให้ id ข้อมูลเมตาภายในของตาราง InnoDB เปลี่ยนไป สิ่งนี้เกิดขึ้นเนื่องจาก TRUNCATE TABLE ทำสิ่งต่อไปนี้ได้อย่างมีประสิทธิภาพ:

ตัวอย่าง: การตัดทอนตาราง InnoDB ชื่อ mydb.mytb

USE mydb
CREATE TABLE newtb LIKE mytb;
ALTER TABLE mytb RENAME oldtb;
ALTER TABLE newtb RENAME mytb;
DROP TABLE oldtb;

mytb ใหม่จะมี id เมทาดาทาภายในที่แตกต่างกัน

เมื่อคุณคัดลอกไฟล์. ibd ไปยังที่อื่นไฟล์. ibd จะบรรจุอยู่ในนั้นเป็นรหัสข้อมูลเมตาภายใน เพียงการวางไฟล์. ibd กลับไม่ทำให้เกิดการกระทบยอดของรหัสข้อมูลเมตาภายในกับของหนึ่งใน ibdata1

สิ่งที่คุณควรทำคือ:

คัดลอกไฟล์. ibd ของตาราง InnoDB จากนั้นเรียกใช้สิ่งนี้

ALTER TABLE tablename DISCARD TABLESPACE;

หากต้องการนำมาใช้อีกครั้งในภายหลังให้คัดลอกไฟล์. ibd กลับไปที่ datadir แล้วเรียกใช้

ALTER TABLE tablename IMPORT TABLESPACE;

สิ่งนี้จะรักษา id ข้อมูลเมตาภายในไว้

ตรวจสอบให้แน่ใจว่า. frm อยู่เสมอ

ฉันเคยช่วยลูกค้าเรียกคืน 30 ตาราง InnoDB ที่เขา hosed ในลักษณะเดียวกัน ฉันต้องใช้เซิร์ฟเวอร์ฐานข้อมูลอื่นและเล่นเกมบางอย่างที่มีการเพิ่มและวางตาราง InnoDB เพื่อตามหาข้อมูลเมตาดาต้าภายในที่ถูกต้อง

ลูกค้าพบบทความนี้: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file เราใช้มันและมันช่วยได้มาก ฉันหวังว่ามันจะช่วยคุณ


1
ฉันมี 2 Table 'X' doesn't exist in engineฐานข้อมูลที่ตารางทั้งหมดบอกว่า ฉันต้องทำวิธีการข้างต้นสำหรับทุกตารางหรือมีวิธีที่ดีกว่าในการแก้ไขหรือไม่
papanito

-2

ฉันมีประสบการณ์กับ Mac ก่อนขายให้เพื่อนเพียงแค่คัดลอกโฟลเดอร์ XAMPP ไปยังฮาร์ดไดรฟ์ของฉันเท่านั้น (ไม่ใช่ความสำเร็จ) ขออภัยที่ฉันมีปัญหาเพราะฉันลองทำตามขั้นตอนต่อไปนี้: - ฉันติดตั้ง XAMPP ใหม่และคัดลอก \ httdocs และ var \ mysql ทั้งหมดไปยัง Mac เครื่องใหม่ฐานข้อมูลเหล่านั้นด้วย. frm และ. ibd เท่านั้น ไม่ทำงานฉันยังคงไม่สามารถเข้าถึงตารางภายใน PHPMyAdmin ... - ฉันพยายามติดตั้งรุ่น xampp เดิมและทำตามขั้นตอนข้างต้นซ้ำ แต่ก็ยังไม่ทำงาน - ตัดสินใจเข้านอน

(ความสำเร็จ) - เช้านี้ฉันนำดิสก์สำรองข้อมูลของฉันแล้วลองกับ Windows 7 - ติดตั้ง XAMPP ใหม่ล่าสุดสำหรับ Windows, c: \ xampp - ฉันมีหนึ่งในเว็บไซต์ (โฟลเดอร์) จากข้อมูลสำรอง \ httdocs และโฟลเดอร์ฐานข้อมูลที่สอดคล้องภายใน \ var \ mysql พร้อมใน windows 7 ของฉันฉันต้องการลองกับเว็บไซต์หนึ่งแล้วลองที่เหลือเพราะฉันมีหลายโครงการใน httdocs \ and \ var \ mysql - ฉันคัดลอก httdocs \ folder ไปยัง windows c: \ xampp \ httdocs และคัดลอก \ var \ mysql ไปยัง c: \ xampp \ mysql \ data

ไม่ใช่ครั้งสุดท้ายฉันคัดลอก ib_logfile0, ib_logfile1, ibdata1 จากไฟล์สำรองของฉันไปยัง windows xampp c: \ xampp \ mysql \ data

ฉันรีเฟรชhttp: // localhost / mywebsite

WOW WOW DONE ... มันใช้งานได้ ...

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