MySQL Tablolarını .ibd, .frm ve mysqllogbin dosyalarından geri yükleme


10

Herhangi bir nedenle, içinde depolanan tablolarımı .frmve .ibddosyaları açmaya çalıştığımda (MySQL veya phpmyadmin'de olsun) bana bir sözdizimi hatası veriyor veya var olmadığını söylüyor.

Buna benzer sorunu olan diğer yayını okudum, ancak innodb_file_per_tableetkin olup olmadığını nasıl kontrol edeceğimi bilmiyorum ve genel olarak gerçekten kafam karıştı. Ayrıca mysql-bin.000002veritabanımdaki verilerin tamamen kaybolmadığını görmek için dosyamın bir kopyasını bir txt dosyasına dönüştürdüm .

Veritabanı geçen yıl oluşturuldu. Bu mysql-bin.00000dosyalardan 6 tanesine sahibim , ancak bir nedenden dolayı .000002en büyük dosya . Şu anda, tüm veritabanlarım için .ibdve .frmdosyalarım var , ancak MySQL'e veya en azından okuyabileceğim bir şeye nasıl geri yükleyebileceğim konusunda bir kayıptayım.

Windows 2003 Server'da WampServer 2.4 ve MySQL 5.6.12 kullanıyorum. Ayrıca, InnoDB'de bir eklenti indirmem gerekiyor mu?


Hayır, geçen yıl yaratıldı. Bu mysql-bin.00000 dosyalarından 6 tanesine sahibim, ancak bir nedenle .000002 en büyük dosya. Şu anda, tüm veritabanlarım için .ibd ve .frm dosyaları var, ancak MySQL'e veya en azından okuyabileceğim bir şeye nasıl geri yükleyebileceğim konusunda kayboldum.
carment

Olası MySQL
T.Todua

Yanıtlar:


20

Sonunda bir çok deneme yanılma yoluyla sorunumu çözdüm ve çözdüm. Orijinal ibdata1 dosyasına sahip olmayan ve yalnızca .frm ve .ibd dosyalarına sahip olanlar için, verilerimi nasıl geri yükledim.

  1. MySQL yardımcı programlarını -> http://dev.mysql.com/downloads/utilities adresinden indirip yükleyin .
  2. MySQL yardımcı programını (mysqlfrm) açmak için komutunuza / terminalinize gidin ve tablonuzun geri yüklemeniz gereken yapısını bulmak için kullanın. Bunu nasıl yaptım, mysqlfrm dosya konumuna cd'ed, sonra "mysqlfrm --server = user: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt" yazdı. .Txt dosyası, nereye gitmek istediğinizi belirtmediyseniz, yardımcı programlarınızın kaydedildiği klasöre kaydedilmelidir.
  3. Metin dosyasında, tablonuzdaki tüm sütunları ve bilgileri (temel olarak orijinal yapı) içeren CREATE TABLE ifadelerini görürsünüz. Bu CREATE deyimini tüm bu bilgilerle kopyalayın.
  4. MySQL Komutunuzda yeni bir veritabanı oluşturun (CREATE DATABASE veritabanı_adı). Orijinal veritabanı adınızla aynı adı kullanın.
  5. Yeni veritabanının içinde yeni bir tablo oluşturun - klasörle aynı ad olması gerekmez. Komut isteminde yeni tablo oluşturabilirsiniz, ancak masamı MySQL'in web üzerinden yönetilmesini sağlayan ücretsiz bir yazılım aracı olan PhpMyAdmin'de oluşturdum. Sadece PhpMyAdmin, sonra SQL tablo veritabanına tıkladı ve # 3 tablo yapısını yapıştırdı. (Yan not olarak, komut istemimde tablolarıma "table" adını verirsem her zaman hata aldım, bu yüzden bu addan kaçınmayı deneyin).
  6. MySQL Komutunuzda veritabanınıza gidin ve "ALTER TABLE table_name DISCARD TABLESPACE" ifadesini girin. Bu tablo, esasen bu tablonun .ibd dosyasını kaldıracaktır.
  7. Az önce kaldırdığınız .ibd dosyasını değiştirmek için özgün tablonuzu (geri yüklemek istediğiniz tablo) yeni oluşturduğunuz tabloya kopyalayın. İlk .ibd dosyanızı yeni oluşturulan tablonun adıyla değiştirin. Bu, yeni sildiğiniz eski .ibd dosyasını taklit eder. Bu klasörü MySQL veri klasöründe, bilgisayarınızda yeni oluşturulan veritabanı klasörünün altında bulabilirsiniz.
  8. MySQL Komutunuza geri dönün, veritabanınıza gidin ve "ALTER TABLE table_Name IMPORT TABLESPACE" yazın. Bir "uyarı" (1) hata türü bildirimi alırsınız, ancak bunu dikkate almayın.
  9. Ve bitti! yeni tablonuza erişmeye çalışırsanız, eski tablonuzdaki tüm verileri içermelidir.

Umarım bu yardımcı olmuştur ve herhangi bir sorunuz veya yorumunuz varsa bana bildirin! Ayrıca, diğer ayrıntılar için http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file adresini ziyaret edin .


Harika talimatlar, ancak sadece MySQL 5.6 ile çalışır ! 5.5'te Got error -1 from storage engineçalıştırdığınızda hatayı alırsınız IMPORT TABLESPACE. Ama benim için MySQL 5.6, MySQL 5.5 kullanılarak oluşturulan tablolar için çalıştı, bu yüzden hepsi iyi;). 5.5 ile sıkışırsanız, oluşturduğunuz chriscalender bağlantısındaki talimatları izlemeniz gerekir .
ostrokach

@carment Talimatlarınızı takip ettim ama ERRPR ile karşılaşıyorum: 13635 numaralı alandaki 1767006713 sayfa numarasına erişmeye çalışıyorum, alan adı dışında yer alan <dbname> / <tblname>. Bana ne yapabilirdim?
Mohit Mehta

Bu bana bir masa yeniden oluşturmak için zaman kazandırdı. Metod 2016'da hala MySQL 5.7.17 üzerinde çalışıyor
Andy Mercer

@ostrokach öyle görünüyor çünkü innodb_file_per_tableetkinleştirmediniz.
Yvan

Çok uzun bir yolculuktan sonra beni kurtardın, teşekkürler!
Amr SubZero

4

Ana InnoDB veri dosyası - genellikle adlandırılmış ibdata- MySQL'in .ibd dosyalarınızı anlayabilmesi için gereklidir.

İkili dosyaları kullanan sunucular arasında veri taşımanız gerekiyorsa, MySQL'i temiz bir şekilde durdurmalı ve ardından ibdata dosyaları dahil tüm veri dosyalarını dizinler arasında taşımalısınız .

Verileri Windows'ta sunucular arasında taşımanın daha güvenilir bir mekanizması, mysqldumpPHPMyAdmin'den (veya benzer bir araçtan) ( ) veya bir veritabanı dışa aktarma kullanmak olacaktır .

Sunucunuzun çalıştığı süre boyunca ikili günlük kaydı etkinleştirildiyse (yorumlara göre, durum böyle olmayabilir), mysqlbinlog sunucuda çalıştırdığınız her SQL deyimini mysql-bin dosyalarından kurtarmak için . ve veritabanını bu şekilde yeniden oluşturun. Mysql-bin dosyalarında ne kadar geriye gideceklerini belirlemenize yardımcı olan unix zaman damgaları bulunmalıdır .

Özgün veritabanı dosyalarınızı kaybettiyseniz ve geriye kalan tek tek .ibd dosyalarıysanız, akuzminsky'nin yorumlardaki önerilerine göre verileri kurtarmaya başvurmanız gerekebilir.

MySQL 5.6, InnoDB .ibd veri dosyalarını ( taşınabilir tablo alanları ) taşımak için bazı yeni özelliklere sahiptir , ancak bunlar biraz çaba gerektirir ve yeterince küçük bir veritabanı için veri aktarımı çok daha kolay olacaktır mysqldump.


0

Akuzminsky tarafından soru yorumlarından oluşturulan wiki yanıtı


Eğer görürseniz *.ibddosyaları daha sonra innodb_file_per_tableedilir ON, aksi takdirde tüm tabloları olacaktır ibdata1.

Bir tablonun mevcut olmadığını söylerse, tablo InnoDB sözlüğünde eksiktir. Tüm tabloları ayrı sql dökümlerine dökmeye çalışın (bir tablo - bir dosya). Boşaltılamadığınız bu tabloları TwinDB kurtarma araç seti ile geri yükleyebilirsiniz .

Henüz ikili paket yok. GitHub'dan kaynak kodu almalı ve derlemelisiniz. Bkz. Recover InnoDB sözlüğü . Oldukça basit:

git clone git@github.com:twindb/undrop-for-innodb.git

ve sonra

make all
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.