MySQL InnoDB tabloları kaybetti ama dosyalar var


33

Tüm veritabanı tablosu dosyalarına sahip bir MySQL InnoDB'im var, ancak MySQL onları görmüyor ve yüklemiyor.

Sorun bu üç dosya silindiği için oldu: ibdata1, ib_logfile0veib_logfile1

çünkü MySQL'in yeni başlamasıyla ilgili problemlerim vardı ve okuduklarım onları kaldırmaktı çünkü MySQL onları sadece yenileyecek (onları yedeklemeliydim ama yapmadım).

MySQL'in tabloları tekrar görmesini sağlamak için ne yapabilirim?

about_member.frm                              site_stories.frm
about_member.ibd                              site_stories.ibd
db.opt                                        stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd  stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd        story_comments.frm
FTS_00000000000000bb_CONFIG.ibd               story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd        story_likes.frm
FTS_00000000000000bb_DELETED.ibd              story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd  story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd        story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd               story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd        story_views.ibd
FTS_00000000000000f5_DELETED.ibd              story_view_totals.frm
member_favorites.frm                          story_view_totals.ibd
member_favorites.ibd                          tags.frm
members.frm                                   tags.ibd
members.ibd

Bu dosyaları geri yüklemeyi denediniz mi? Günlük dosyaları silinmiş kalabilir. Gerçekten de ibdata1
Ramhound 13.13

Dosyayı, dosyanın bulunduğu eski bir mysql sürümünden kopyaladım, ancak tablolar görünmüyor.
Get Off My Lawn

Yanıtlar:


36

İşte bu yüzden MySQL bu dosyaları göremiyor: Sistem tablo alanı (ibdata1), InnoDB'nin potansiyel tablo kullanımını belirlemesini sağlayan bir Depolama Motoruna özel veri sözlüğüne sahip:

InnoDB Mimarisi

InnoDB tablolarını bir yerden bir yere taşımak, aşağıdaki gibi komutları gerektirir:

ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;

İşte dikkat edilmesi gerekenleri açıklayan MySQL 5.5 Belgeleri'nin bir parçası

.İbd Dosyaları için Taşınabilirlik Hususları

.İbd dosyalarını MyISAM tablo dosyalarıyla olduğu gibi veritabanı dizinleri arasında özgürce taşıyamazsınız. InnoDB paylaşılan tablo alanında depolanan tablo tanımı, veritabanı adını içerir. Tablo alanı dosyalarında saklanan işlem kimlikleri ve günlük sıra numaraları da veritabanları arasında farklılık gösterir.

Bir .ibd dosyasını ve ilişkili tabloyu bir veritabanından diğerine taşımak için, bir RENAME TABLE ifadesi kullanın:

RENAME TABLO db1.tbl_name TO db2.tbl_name; Bir .ibd dosyasının “temiz” bir yedeğine sahipseniz, onu kaynaklandığı MySQL kurulumuna geri yükleyebilirsiniz:

.İbd dosyasını kopyaladığınızdan beri tablonun düşürülmemesi veya kesilmemesi gerekir, çünkü bunu yaparken tablo alanı içinde depolanan tablo kimliği değişir.

Geçerli .ibd dosyasını silmek için bu ALTER TABLE ifadesini verin:

ALTER TABLE tbl_name DISCARD TABLESPACE; Yedekleme .ibd dosyasını uygun veritabanı dizinine kopyalayın.

InnoDB'ye tablo için yeni .ibd dosyasını kullanmasını söylemek için bu ALTER TABLE ifadesini verin:

ALTER TABLE tbl_name İTHALAT TABLESPACE; Bu bağlamda, “clean” .ibd dosya yedeği, aşağıdaki gereksinimlerin karşılandığı bir tanesidir:

.İbd dosyasındaki işlemler tarafından henüz tadilat edilmemiş herhangi bir değişiklik yoktur.

.İbd dosyasında birleştirilmemiş ekleme tampon girişi yok.

Temizleme, silinen tüm işaretlenmiş dizin kayıtlarını .ibd dosyasından kaldırdı.

mysqld, .ibd dosyasının bütün değiştirilmiş sayfalarını arabellek havuzundan dosyaya siler.

Bu uyarılar ve protokoller göz önüne alındığında, burada önerilen bir eylem süreci

Bu örnekte, tagstabloyu mydbveritabanına geri yüklemeyi deneyelim

AŞAMA 1

Bunların .frmve .ibddosyaların yedeğini aldığınızdan emin olun ./tmp/innodb_data

ADIM 2

İfadeyi alın CREATE TABLE tagsve olarak çalıştırın CREATE TABLE mydb.tags .... Orijinal ile aynı yapı olduğundan emin oluntags.frm

AŞAMA 3

tags.ibdMySQL kullanarak boş sil

ALTER TABLE mydb.tags DISCARD TABLESPACE;

ADIM # 4

Yedek kopyasını getir tags.ibd

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

ADIM 5

tagsInnoDB Veri Sözlüğüne tablo ekle

ALTER TABLE mydb.tags IMPORT TABLESPACE;

ADIM 6

Tablonun erişilebilirliğini test edin

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;

Normal sonuçlar elde ederseniz, tebrikler InnoDB tablosunu içe aktardığınız için.

ADIM 7

Gelecekte, lütfen ibdata1 ve loglarını silmeyin

Bir şans ver !!!

Daha önce böyle şeyler tartıştım

UYARI

Ya masa yapısını bilmiyorsanız tags?

Sadece .frmdosyayı kullanarak CREATE TABLE deyimini almak için araçlar vardır . Bununla ilgili bir yazı da yazdım: Tablo şemasını sadece .frm dosyasından nasıl çıkarabilirim? . Bu yazımda, bir .frm dosyasını bir Linux makinesinden Windows makinesine kopyaladım, Windows aracını çalıştırdım ve ifade aldım CREATE TABLE.


Müthiş Cevap için teşekkürler! Hala bir masayı ithal etme sürecindeyim çünkü sorun yaratmaya devam ediyorum, ama sonunda oraya gideceğim ve nasıl çalıştığını size bildireceğim! Teşekkürler!
Get Off My Lawn

1
Yaratmayıweblyizetags çalıştırdığımda şunu alıyorum: ERROR 1813 (HY000): Tablo için tablo . 'var. Lütfen İTHALAT'tan önce tablo alanını ATIN. Bu yüzden önce alter tablo alanını çalıştırmayı denedim ve şu hatayı alıyorum: ERROR 1146 (42S02): Tablo 'weblyize.tags' mevcut değil . Ne yapabilirim?
Get Off My Lawn

Teşekkürler! Hatamı düzeltmek için yeni bir veritabanı oluşturdum, koştuktan CREATE TABLE ...sonra adımlarınızı takip edin! Beni sıfırdan% 100 yeniden yazmak zorunda kalmamdan kurtardın! Yabancı anahtarlar ithal etmedi, ama sorun değil, kendim yapabilirim! Tekrar teşekkürler!
Get Off My Lawn

Bu şekilde düzeltilmesi gereken 100 masa varsa? Her masaya elle işlem yapmam. Nasıl otomatikleştirilebilir?
Oleg Abrazhaev

10

Aynı durum var, belirli bir tblname bırakamıyor veya oluşturamıyorum. Düzeltme prosedürüm:

  1. MySQL'i durdur.

    service mysql stop
    
  2. İb_logfile0 ve ib_logfile1 öğesini kaldırın.

    cd /var/lib/mysql;
    rm ib_logfile0 ib_logfile1
    
  3. Tblname dosyalarını kaldırın. UYARI: BU KALICI VERİLERİNİZİ SİLECEKTİR

    cd /var/lib/mysql/dbname;
    rm tblname*
    
  4. MySQL'i başlatın.

    service mysql start
    

1
Teşekkürler bu sorunu düzelttim, 3. adımı yapmadım, sadece kayıt dosyalarını kaldırdım ve MySQL'i yedeklemeye başladım.
Jeff Wilbert

Sen kesinlikle harikasın! Sorunumu çözdüm.
Alex GP

2

Bende de bu problem vardı. ibdata1Yanlışlıkla sildim ve tüm verilerim kayboldu.

Google ve SO’da 1-2 gün aradıktan sonra nihayet hayatımı kurtardığı bir çözüm buldum (çok fazla veritabanına ve tabloya sahiptim).

  1. yedeğini almak /var/lib/mysql

  2. dbsake.frm ile dosyadan tablo şema kurtarmak (başka bir seçenek vardı! mysqlfrm . ama benim için işe yaramadı)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. dışa aktarılan şema ile yeni tablo (yeni adla) oluşturun.

  2. bu komutla yeni tablo verilerini atın:

ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. eski tablonun verilerini kopyalayın ve yenisi yerine yapıştırın ve bunun için doğru izni belirleyin.
cp tbl.ibd tbl@002dnew.ibd && chown mysql:mysql tbl@002dnew.ibd
  1. veriyi yeni tabloya aktar.
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. Peki! Yeni tabloda veri var ve eskisini düşürebiliriz.
DROP TABLE `tbl`;
  1. kontrol edin /var/lib/mysql/database-nameve .ibdeski tablo için veri ( dosya) olup olmadığını silin.
rm tbl.ibd
  1. ve son olarak yeni tabloyu orijinal ismine göre yeniden adlandırın
ALTER TABLE `tbl-new` RENAME `tbl`;
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.