Dosyaları hareket ettirilmiş bir InnoDB tablosu nasıl kurtarılır


13

Bu yüzden bir çoğaltma akışında ayarlanmış bir test db sunucusu var. İsim üzerinde, köle veri dizinindeki alanı hızla dolduran bir optimizasyon geldi. Mysql sadece biraz daha yer bekliyordu.

Bu datadir SADECE mysql'ın datadir'i olarak kullanılan bir dosya sistemidir, bu yüzden ücretsiz başka bir şey yoktu.

Çoğaltma akışının bir parçası olmayan 4 gig innodb test masam vardı, bu yüzden işe yarayıp yaramayacağını görmek için bir şeyler deneyeceğim ve bir test ortamı olarak işler çok yanlış gittiğinde endişelenmedim.

İşte attığım adımlar

  1. Taşımak üzere olduğum masayı yıkadım
  2. Üzerine bir okuma kilidi yerleştirildi (üzerine hiçbir şey yazmasa ve çoğaltma akışında olmasa bile)
  3. .Frm ve .ibd dosyalarını yedek oda bulunan bir dosya sistemine kopyaladı
  4. Masanın kilidi açıldı
  5. Bu tablo kesildi - bu, optimizasyonun bitmesi için yeterli alan bıraktı, çoğaltma tekrar tekrar çalmaya başladı.
  6. Köle / kapatma MySQL'i durdur
  7. Dosyayı tmp dışında veri dizinine kopyalayın
  8. MySQL'i yeniden başlat

.Err günlüğünde hiçbir şey görünmüyor, işler iyi görünüyor. Ben mydb bağlamak ve kullanmak; ve gösteri tablolarında uğraştığım tabloyu görüyorum. Ama denersem

select * from testtable limit 10;

Hatayı alıyorum

ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist

Şimdiye kadar söyleyebileceğim kadar tüm diğer tablolardan gayet iyi okuyabilir ve çoğaltma herhangi bir şikayet w / o geri başladı.

Bu noktadan sonra kurtarmak için yapabileceğim bir şey var mı? Gerekirse sıfırdan yeniden inşa edebilirim ama genel olarak başkalarının bu girişim hakkında ne düşündüğünü merak ettim. Attığım adımlarla ilgili daha kusursuz sonuçlara yol açacak bir şey var mıydı?

Ya bu bir test sunucusu olmasaydı, sadece 'canlı mı yapıyordum' ve ne olacağını göremedim? Bunu yapmak zorunda kalsaydım, bir üretim kölesinde geçici olarak yer açmanın en iyi yolu ne olurdu?

Yanıtlar:


15

Çoğu insanın TRUNCATE TABLE hakkında unutduğu en büyük şey, TRUNCATE TABLE'ın DML değil DDL olmasıdır . InnoDB'de ibdata1 içindeki meta veriler InnoDB tablolarının numaralı listesini içerir. TRUNCATE TABLE kullanıldığında, InnoDB tablosunun dahili meta veri kimliği değişebilir. Bunun nedeni, TRUNCATE TABLE'ın etkili bir şekilde aşağıdakileri yapmasıdır:

Örnek: mydb.mytb adlı bir InnoDB Tablosunu kısaltmak için

USE mydb
CREATE TABLE newtb LIKE mytb;
ALTER TABLE mytb RENAME oldtb;
ALTER TABLE newtb RENAME mytb;
DROP TABLE oldtb;

Bu nedenle yeni mytb'nin farklı bir dahili meta veri kimliği olacaktır.

.İbd dosyasını başka bir yere kopyaladığınızda, .ibd içinde orijinal dahili meta veri kimliğini içerir. Sadece .ibd dosyasını geri koymak, dahili meta veri kimliğinin ibdata1'deki ile mutabakata neden olmaz.

Yapmanız gereken şudur:

InnoDB tablosunun .ibd dosyasını kopyalayın. Sonra bunu çalıştırın

ALTER TABLE tablename DISCARD TABLESPACE;

Daha sonra geri getirmek için, .ibd dosyasını tekrar datadir'e kopyalayın ve çalıştırın

ALTER TABLE tablename IMPORT TABLESPACE;

Bu, dahili meta veri kimliğini koruyacaktı.

.Frm dosyasının daima mevcut olduğundan emin olun.

Bir keresinde bir istemci aynı şekilde hosed 30 InnoDB tabloları geri yardımcı oldu. Başka bir DB sunucusu kullanmak ve doğru dahili meta veri kimliği avlamak için InnoDB tabloları ekleyerek ve bırakarak bazı oyunlar oynamak zorunda kaldı.

Müşteri bu makaleyi buldu: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Biz kullandık ve çok yardımcı oldu. Umarım sana yardımcı olur.


1
Tüm tabloların söylediği 2 veritabanım var Table 'X' doesn't exist in engine. Her bir tablo için yukarıdaki yöntemi yapmak zorunda mıyım yoksa bunu düzeltmenin daha iyi yolları var mı?
papanito

-2

Bir arkadaşımla satmadan önce Mac'imle yaşadım, sadece XAMPP klasörünü sadece sabit sürücüme kopyaladım. (BAŞARI DEĞİL) Ne yazık ki, bana sorun getiriyordu, çünkü aşağıdaki adımları denedim: - Yeni XAMPP yükledim ve tüm \ httdocs ve var \ mysql'i yeni Mac'ime kopyaladım, bu db sadece .frm ve .ibd ile, ÇALIŞMIYORUM, hala PHPMyAdmin içindeki tablolara erişemiyorum ... - Aynı xampp sürümünü kurmaya ve yukarıdaki adımları tekrarlamaya çalıştım, hala ÇALIŞMADI. - Yatmaya karar verdim.

(SUCCESS) - Bu sabah, yedek diskimi getirdim ve Windows 7'yi denedim. - Windows için yeni en yeni XAMPP'yi yükleyin, c: \ xampp - Yedeklememden \ httdocs web sitesinden (klasör) birini alıyorum ve içindeki veritabanı klasörüne karşılık veriyorum \ var \ mysql benim windows 7 HAZIR, ben sadece bir web sitesi ile denemek istiyorum sonra geri kalanı denemek istiyorum çünkü ben httdocs \ ve \ var \ mysql içinde birçok proje var - ben söz httdocs \ klasör windows c: \ xampp \ httdocs ve \ var \ mysql dosyasını c: \ xampp \ mysql \ data'ya kopyalayın

SON DAHA DEĞİL ib_logfile0, ib_logfile1, ibdata1'i yedek dosyamdan windows xampp c: \ xampp \ mysql \ data'ya kopyalarım

Ben yenilemek // localhost / MyWebSite: http

WOW WOW DONE ... çalışıyor ...

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.