İbd dosyalarından ibdata1 olmadan veri klasöründen MySQL veritabanını kurtarma


15

WAMP dizinim başka bir kullanıcı tarafından yanlışlıkla siliniyor. Yalnızca MySQL içindeki veri klasörü kullanılabilir. Ve sadece veritabanı klasörleri ("\ bin \ mysql \ mysql5.6.12 \ data \" içindeki veritabanları olan klasörler) kullanılabilir. "\ Bin \ mysql \ mysql5.6.12 \ data \" kök dizinindeki " ibdata1 " dahil tüm dosyalar da silinir.

Veritabanı klasörleri yalnızca aşağıdaki uzantılara sahip dosyalar içerir.

* .frm, * .ibd

ve "db.opt" dosyası.

Veritabanları nasıl kurtarılabilir?

Zaten bdata1'i kurtarmaya çalıştım. Ama geri alamıyorum. Ve bazı veritabanı MYISAM da içerir.

Yanıtlar:


16

MyISAM

MyISAM tablosu mydb.mytable için üç dosyanız olmalıdır

  • \bin\mysql\mysql5.6.12\data\mydb\mytable.frm
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYI

Her dosya gerekli verileri, meta verileri ve dizin bilgilerini içerdiğinden, tablo olarak zaten erişilebilir olmalıdırlar. Toplu olarak, masayı oluştururlar. Erişilecek harici depolama motoru mecahnizmi yoktur.

InnoDB'nin

InnoDB'nin bu Resimli Temsiline bir göz atın

InnoDB Mimarisi

İbdata1'i .ibddosyalara iliştiren tek şey veri sözlüğüdür .

Göreviniz, kabul etmeye karar verirseniz, her tabloyu oluşturmak ve .ibd

Herhangi bir şey yapmadan önce "\ bin \ mysql \ mysql5.6.12 \ data" dosyasının tam bir kopyasını başka bir kopyaya oluşturun

İşte bir örnek

mydbTablo ile bir veritabanınız olduğunu varsayalım mytable. Bu şu anlama gelir

  • Klasöre sahipsiniz \bin\mysql\mysql5.6.12\data\mydb
  • Bu klasörün içinde,
    • mytable.frm
    • mytable.ibd

İhtiyacınız var .frm. Yazıma bakarsanız Tablo şemasını yalnızca .frm dosyasından nasıl ayıklayabilirsiniz? , tabloyu oluşturmak için gereken SQL'i oluşturabilen bir MySQL yardımcı programını indirebilirsiniz.

Şimdi aşağıdakileri yapmalısınız

  • Şuraya taşı mytable.ibd:\bin\mysql\mysql5.6.12\data
  • InnoDB tablosu oluşturmak için SQL'i çalıştırın
  • Mysql oturumu açın ve çalıştırın ALTER TABLE mydb.mytable DISCARD TABLESPACE;(Bu silinir \bin\mysql\mysql5.6.12\data\mydb\mytable.ibd)
  • Kopya \bin\mysql\mysql5.6.12\data\mytable.ibdiçine\bin\mysql\mysql5.6.12\data\mydb
  • MySQL giriş ve ALTER TABLE mydb.mytable IMPORT TABLESPACE;(Bu \bin\mysql\mysql5.6.12\data\mydb\mytable.ibdveri sözlüğüne kayıt olacak )

Bundan sonra, masa mydb.mytabletamamen erişilebilir olmalıdır. Bu erişilebilirliği basitçe çalıştırarak test edebilirsiniz:

SELECT * FROM mydb.mytable LIMIT 10;

Bir şans ver !!!

DRINK (Veri Kurtarma Gerekli Bilgiyi İçerir) Sorumlu


Bu harika cevabı tamamlamak için innodb için, tablo alanını atmadan önce tabloya başvuran FK kısıtlamalarını kaldırmanız gerekir. İçe aktarma işleminden sonra FK'yi yeniden oluşturmanız gerekir.
SebaGra

tablo alanı içe aktarma işleminden sonra information_schema.key_column_usage(muhtemelen diğer tablolar da) ilkinde veri döndürmez, selectböylece en az bir sorgu yürütmeniz ve sonraki sorgunun çalışması için birkaç saniye beklemeniz gerekir. (mysql Ver 14.14 EditLine sarmalayıcı kullanarak linux-glibc2.12 (x86_64) için 5.7.19 dağıtın)
user3338098 10:09
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.