Mengembalikan Tabel MySQL dari file .ibd, .frm dan mysqllogbin

10

Untuk beberapa alasan, ketika saya mencoba untuk membuka tabel saya yang disimpan dalam .frmdan .ibdfile (apakah pada MySQL atau phpmyadmin) itu memberi saya kesalahan sintaks, atau dikatakan tidak ada.

Saya sudah membaca posting lain yang memiliki masalah yang mirip dengan ini, tapi saya tidak tahu bagaimana memeriksa jika innodb_file_per_tablediaktifkan, dan saya secara keseluruhan hanya benar-benar bingung. Saya juga mengkonversi salinan mysql-bin.000002file saya ke file txt jadi saya melihat bahwa data dari database saya tidak sepenuhnya hilang.

Basis data dibuat tahun lalu. Saya memiliki 6 mysql-bin.00000file - file itu, tetapi untuk beberapa alasan .000002adalah yang terbesar. Saat ini, saya memiliki .ibddan .frmfile untuk semua database saya, tapi saya bingung bagaimana saya bisa mengembalikannya kembali ke MySQL, atau setidaknya menjadi sesuatu yang bisa saya baca.

Saya menggunakan WampServer 2.4 dan MySQL 5.6.12 pada Windows 2003 Server. Juga, apakah saya harus mengunduh plugin di InnoDB?

carment
sumber
Tidak, itu dibuat tahun lalu. Saya memiliki 6 dari file mysql-bin.00000, tetapi untuk beberapa alasan .000002 adalah yang terbesar. Saat ini, saya memiliki file .ibd dan .frm untuk semua database saya, tetapi saya bingung bagaimana saya bisa mengembalikannya kembali ke MySQL, atau setidaknya menjadi sesuatu yang bisa saya baca.
carment

Jawaban:

19

Saya akhirnya menemukan dan menyelesaikan masalah saya melalui banyak trial and error. Bagi mereka yang tidak memiliki file ibdata1 asli mereka, dan hanya memiliki file .frm dan .ibd, inilah cara saya memulihkan data saya.

  1. Unduh dan instal utilitas MySQL di -> http://dev.mysql.com/downloads/utilities .
  2. Pergilah ke perintah / terminal Anda untuk membuka utilitas MySQL, mysqlfrm, dan gunakan untuk menemukan struktur tabel Anda yang perlu Anda pulihkan. Bagaimana saya melakukannya, adalah saya dimasukkan ke lokasi file mysqlfrm, kemudian dimasukkan "mysqlfrm --server = pengguna: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt". File .txt harus disimpan di folder yang sama dengan tempat utilitas Anda disimpan jika Anda tidak menentukan ke mana Anda ingin pergi.
  3. Dalam file teks, Anda akan melihat pernyataan CREATE TABLE, yang mencakup semua kolom dan info (pada dasarnya, struktur asli) dari tabel Anda. Salin pernyataan CREATE itu dengan semua info itu.
  4. Di Perintah MySQL Anda, buat database baru (CREATE DATABASE database_name). Buatlah nama yang sama dengan nama database asli Anda.
  5. Buat tabel baru di dalam database baru - itu tidak harus nama yang sama dengan folder. Anda dapat membuat tabel baru di dalam command prompt, tetapi saya membuat tabel saya di PhpMyAdmin, alat perangkat lunak gratis yang menangani administrasi MySQL melalui web. Saya cukup mengklik database pada PhpMyAdmin, lalu tabel SQL, dan menempelkan struktur tabel dari # 3. (Sebagai catatan, saya selalu menerima kesalahan jika saya memberi nama tabel saya "tabel" pada prompt perintah saya, jadi cobalah untuk menghindari nama itu).
  6. Pada Perintah MySQL Anda, masuk ke database Anda, dan masukkan "ALTER TABLE table_name DISCARD TABLESPACE", yang pada dasarnya akan menghapus file .ibd tabel ini.
  7. Salin tabel asli Anda (tabel yang ingin Anda pulihkan) .ibd file ke dalam tabel yang baru dibuat untuk mengganti file .ibd yang baru saja Anda hapus. Ubah file .ibd awal Anda ke nama tabel yang baru dibuat. Ini akan meniru file .ibd lama yang baru saja Anda hapus. Anda dapat menemukan folder ini di folder data MySQL, di bawah folder database yang baru dibuat di komputer Anda.
  8. Kembali ke Perintah MySQL Anda, masuk ke database Anda, dan masukkan "ALTER TABLE table_Name IMPORT TABLESPACE." Anda akan menerima "peringatan" (1) pernyataan tipe kesalahan, tetapi abaikan saja.
  9. Dan dilakukan! jika Anda mencoba mengakses tabel baru Anda, itu harus berisi semua data dari tabel lama Anda.

Saya harap ini membantu, dan beri tahu saya jika Anda memiliki pertanyaan atau komentar! Juga, periksa http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file untuk detail lainnya.

carment
sumber
Instruksi hebat, tetapi hanya bekerja dengan MySQL 5.6 ! Pada 5,5 Anda akan mendapatkan kesalahan Got error -1 from storage enginesaat Anda menjalankan IMPORT TABLESPACE. Tetapi bagi saya MySQL 5.6 bekerja untuk tabel yang dibuat menggunakan MySQL 5.5, jadi semuanya baik;). Jika Anda terjebak dengan 5.5, Anda harus mengikuti instruksi di tautan chriscalender yang Anda ajukan.
ostrokach
@carment Saya mengikuti instruksi Anda tetapi saya menghadapi ERRPR: mencoba mengakses nomor halaman 1767006713 di ruang 13635, nama ruang <dbname> / <tblname>, yang berada di luar batas tablespace. Bisakah Anda membimbing saya apa yang mungkin telah saya lakukan?
Mohit Mehta
Ini hanya menghemat banyak waktu untuk membuat ulang tabel. Metode masih berfungsi pada 2016, di MySQL 5.7.17
Andy Mercer
@ostrokach sepertinya itu karena Anda belum innodb_file_per_tablemengaktifkan.
Yvan
Anda baru saja .. menyelamatkan saya setelah perjalanan yang sangat panjang, terima kasih!
Amr SubZero
4

File data InnoDB utama - biasanya dinamai ibdata- sangat penting bagi Anda MySQL untuk dapat memahami file .ibd Anda.

Jika Anda perlu memindahkan data antar server menggunakan file biner, Anda harus menghentikan MySQL dengan bersih dan kemudian memindahkan semua file data, termasuk file ibdata , di antara direktori.

Mekanisme yang lebih dapat diandalkan untuk memindahkan data antara server pada Windows adalah dengan menggunakan ( mysqldump) atau ekspor basis data dari PHPMyAdmin (atau alat serupa).

Jika pencatatan biner telah diaktifkan sepanjang waktu server Anda berjalan (berdasarkan komentar, ini mungkin tidak terjadi), Anda juga dapat menggunakan mysqlbinloguntuk memulihkan setiap pernyataan SQL yang Anda jalankan di server dari file mysql-bin , dan buat ulang basis data dengan cara itu. Seharusnya ada cap waktu unix di file mysql-bin yang membantu Anda menentukan seberapa jauh mereka pergi.

Jika Anda kehilangan file database asli dan yang tersisa hanyalah file .ibd individual, Anda mungkin harus memulihkan data sesuai saran akuzminsky di komentar.

MySQL 5.6 memiliki beberapa fitur baru untuk memindahkan file data InnoDB .ibd ( tablespace yang dapat diangkut ), tetapi ini memerlukan beberapa upaya dan, untuk database yang cukup kecil, akan jauh lebih mudah untuk mentransfer data menggunakan mysqldump.

Nathan Jolly
sumber
0

Jawaban wiki dihasilkan dari komentar pertanyaan oleh akuzminsky


Jika Anda melihat *.ibdfile kemudian innodb_file_per_tableadalah ON, kalau tidak semua tabel akan di ibdata1.

Jika itu memberitahu tabel tidak ada maka tabel tersebut hilang dalam kamus InnoDB. Cobalah untuk membuang semua tabel ke dalam dump sql terpisah (satu tabel - satu file). Tabel yang tidak bisa Anda buang dapat Anda kembalikan dengan toolkit pemulihan TwinDB .

Belum ada paket biner. Anda harus mendapatkan kode sumber dari GitHub dan mengompilasinya. Lihat petunjuk di Pulihkan kamus InnoDB . Cukup mudah:

git clone [email protected]:twindb/undrop-for-innodb.git

lalu

make all
Paul White
sumber