it-swarm.asia

Cara Memulihkan tabel InnoDB yang file-nya dipindahkan

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?

14
atxdba

Hal terbesar yang dilupakan kebanyakan orang tentang TRUNCATE TABLE adalah --- TABLE TRUNCATE 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.

15
RolandoMySQLDBA