Bu makale bunu kanıtlanmış bir yol sunar:
Bunun nasıl yapılacağının temellerini anlamak çok zor değil, zorlaşan detaylar. Bu sorunun ilk kısmı, tablo tanımını .frm dosyalarından nasıl çıkaracağınızdır. Sorunun ikinci kısmını başka bir gönderide ele alacağım. .Frm dosyasını okuyan ve çözümleyen ve tablo tanımını çıkaran bir program yazabilirsiniz, ancak bu çok iş - özellikle MySQL'i sizin için yapması için kandırabileceğiniz zaman. Foo.frm dosyası için bunu nasıl yapacağınız aşağıda açıklanmıştır.
mysql> CREATE TABLE `test`.`foo` (id int) ENGINE=InnoDB;
Foo adında bir InnoDB tablosu oluşturduk. MySQL $ datadir / test içinde bir foo.frm ve foo.ibd dosyası yazdı. Aynı zamanda bu tablonun veri sözlüğünde kaydını tuttu.
mysql> FLUSH TABLES;
Bu, MySQL'in tüm açık tabloları kapatmasına ve sorgu önbelleğini temizlemesine neden olur. Buradaki fikir MySQL'i yeni yarattığımız “foo” tablosu hakkında unutmaya zorlamak.
bash# cp foo.frm /var/lib/mysql/test;
Test.foo için tablo tanımının üzerine yazdık. MySQL hala çalışıyorken sıcak yaptık.
mysql> SHOW CREATE TABLE `test`.`foo`;
Bu sadece test dizinine kopyaladığımız foo.frm dosyası için tablo tanımını gösterecektir. .Srr dosyasındaki bilgilerin sistem tablosu alanında olanlarla eşleşmesi muhtemel olmadığından MySQL muhtemelen biraz karışık olacaktır. Muhtemelen hata günlüğünüzde böyle bir mesaj göreceksiniz:
[ERROR] Tablo ./test/foo'nun InnoDB veri sözlüğünde birincil anahtarı yoktur, fakat MySQL'de bir anahtarı vardır! Tabloyu <3.23.54 sürümündeki bir MySQL sürümüyle oluşturduysanız ve bir birincil anahtar tanımlamamışsanız, ancak NULL olmayan tüm sütunlarla benzersiz bir anahtar tanımladıysanız, MySQL dahili olarak bu anahtarı birincil anahtar olarak değerlendirir. Bu hatayı dump + DROP + CREATE + yeniden tablonun içe aktarılması ile düzeltebilirsiniz.
Sorun değil, temizle.
mysql> DROP TABLE `test`.`foo`;
Birkaç yüz tablo için bunu yapmak zorunda kalmanın sıkıntısını önlemek için, aşağıdaki yazıyı kullanın: bluegecko makale . Sıralanmalısın. Chagbert.