Cara Memulihkan tabel InnoDB yang file-nya dipindahkan

13

Jadi saya punya server uji db yang diatur pada aliran replikasi. Atas nama optimasi datang melalui yang dengan cepat mengisi ruang pada datadir slave. Mysql patuh hanya menunggu ruang lagi.

Datadir ini adalah sistem file yang HANYA digunakan sebagai datad mysql sehingga tidak ada hal lain untuk dibebaskan.

Saya memiliki meja tes innodb 4 manggung yang bukan bagian dari aliran replikasi jadi saya pikir saya akan mencoba sesuatu untuk melihat apakah itu akan berhasil, dan menjadi lingkungan pengujian saya tidak terlalu khawatir jika ada yang salah.

Inilah langkah-langkah yang saya ambil

  1. Membilas meja saya akan pindah
  2. Menempatkan kunci baca di atasnya (meskipun tidak ada yang menulis dan tidak ada dalam aliran replikasi)
  3. Menyalin .frm dan .ibd ke sistem file dengan ruang cadangan
  4. Membuka kunci meja
  5. Memotong tabel itu - ini membebaskan ruang yang cukup untuk optimisasi untuk menyelesaikan replikasi mulai berbunyi lagi.
  6. Hentikan slaving / shutdown mysql
  7. Salin file dari tmp kembali ke dir data
  8. Mulai ulang mysql

Tidak ada yang muncul di log .err, semuanya terlihat bagus. Saya terhubung dan menggunakan mydb; dan lihat meja tempat saya bermain-main. Tapi, kalau saya coba

select * from testtable limit 10;

Saya mendapatkan kesalahan

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

Dari apa yang saya tahu sejauh ini saya bisa membaca dari semua tabel lainnya baik-baik saja dan replikasi mulai kembali tanpa keluhan.

Adakah yang bisa saya lakukan untuk pulih dari titik ini? Saya dapat membangunnya kembali dari awal jika perlu tetapi ingin tahu apa pendapat orang lain tentang usaha ini secara umum. Apakah ada sesuatu tentang serangkaian langkah yang saya ambil yang akan berakhir dengan hasil yang lebih sempurna?

Bagaimana jika ini bukan server pengujian saya tidak bisa hanya 'melakukannya langsung' dan melihat apa yang terjadi? Apa yang akan memiliki cara terbaik untuk mengosongkan ruang sementara pada budak produksi jika saya harus seperti itu?

atxdba
sumber

Jawaban:

15

Hal terbesar yang dilupakan kebanyakan orang tentang TRUNCATE TABLE adalah TRUNCATE TABLE adalah DDL dan bukan DML . Di InnoDB, metadata dalam ibdata1 berisi daftar nomor dari tabel InnoDB. Menggunakan TRUNCATE TABLE menyebabkan id metadata internal tabel InnoDB bergeser. Ini terjadi karena TRUNCATE TABLE secara efektif melakukan hal berikut:

Contoh: Untuk memotong Tabel InnoDB disebut mydb.mytb

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

Mytb baru akan memiliki id metadata internal yang berbeda.

Saat Anda menyalin file .ibd ke tempat lain, .ibd berisi di dalamnya id metadata internal asli. Cukup dengan mengembalikan file .ibd tidak menyebabkan rekonsiliasi id metadata internal dengan yang ada di ibdata1.

Apa yang seharusnya Anda lakukan adalah ini:

Salin file .ibd dari tabel InnoDB. Lalu, jalankan ini

ALTER TABLE tablename DISCARD TABLESPACE;

Untuk mengembalikannya nanti, salin file .ibd kembali ke datadir dan kemudian jalankan

ALTER TABLE tablename IMPORT TABLESPACE;

Ini akan mempertahankan id metadata internal.

Pastikan .frm selalu ada.

Saya pernah membantu klien mengembalikan 30 tabel InnoDB yang dia sembunyikan dengan cara yang sama. Saya harus menggunakan server DB lain dan memainkan beberapa game dengan menambahkan dan menjatuhkan tabel InnoDB untuk memburu id metadata internal yang benar.

Klien menemukan artikel ini: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Kami menggunakannya dan itu sangat membantu. Saya harap ini membantu Anda.

RolandoMySQLDBA
sumber
1
Saya memiliki 2 database di mana semua tabel mengatakan Table 'X' doesn't exist in engine. Apakah saya harus melakukan metode di atas untuk setiap tabel atau apakah ada cara yang lebih baik untuk memperbaikinya?
papanito
-2

Saya alami dengan Mac saya, sebelum menjual ke teman cukup salin folder XAMPP hanya ke hard drive saya. (BUKAN KEBERHASILAN) Sayangnya, itu membawa masalah bagi saya, karena saya mencoba langkah-langkah berikut: - Saya menginstal XAMPP baru dan menyalin seluruh \ httdocs dan var \ mysql ke Mac baru saya, yang db hanya dengan .frm dan .ibd, BUKAN BEKERJA, saya masih tidak bisa mengakses tabel di dalam PHPMyAdmin ... - Saya mencoba menginstal versi xampp yang sama dan mengulangi langkah-langkah di atas, masih BUKAN BEKERJA. - Memutuskan untuk pergi tidur.

(SUKSES) - Pagi ini, saya membawa disk cadangan saya dan mencoba dengan Windows 7. - Instal XAMPP terbaru untuk Windows, c: \ xampp - Saya memiliki salah satu situs web (folder) dari cadangan saya \ httdocs dan folder database yang sesuai di dalamnya \ var \ mysql SIAP di windows 7 saya, saya hanya ingin mencoba dengan satu situs web lalu mencoba sisanya karena saya punya banyak proyek di dalam httdocs \ dan \ var \ mysql - Saya menyalin folder httdocs \ yang disebutkan ke windows c: \ xampp \ httdocs dan salin data \ var \ mysql ke c: \ xampp \ mysql \

BELUM TERAKHIR Saya menyalin file ib_logfile0, ib_logfile1, ibdata1 dari file cadangan saya ke windows xampp c: data \ xampp \ mysql \

Saya menyegarkan http: // localhost / mywebsite

WOW WOW DONE ... berhasil ...

Armindo
sumber