DROP Tablosu nasıl geri alınır?


11

Yanlışlıkla tüm masaları düşürdüm. Geri yükleyebilir miyim? Yedek kopyam yok.

Yanıtlar:


12

Kelimenin tam anlamıyla yedeklemeniz yoksa, şansınızın% 99 olduğundan eminim.

Eski olsa da herhangi bir yedekleme biçiminiz varsa, MySQL yapılandırma dosyasına (my.ini) oturum açma seçeneği aracılığıyla ikili günlük kaydını açtınız mı? Eğer öyleyse, son yedeklemeden beri kurtarabilirsiniz.

Bir haftaya başlamanın kötü yolu ahbap.


2
Muhtemelen deneyimsiz olduğunuz için, hepimiz bu tür bir şey yaptık, hala bazen (aslında bir hafta önce kendimi VCenter'ımdan kilitledim) - önemli olan tek şey ondan öğrenmeniz, böylece daha azsınız tekrarlanması muhtemeldir.
Chopper3

Şimdi ne yapabilirim?? Sadece oturup sabırsızlanıyorum !!!!


4
Sorunu çözmez, ancak geliştiricilerinizden birinin son iyi kopyadan çok uzak olmayan bir kopyası var mı?
Tom O'Connor

3
Tom çok iyi bir noktaya işaret ediyor: Geliştiricileriniz test / geliştirme amacıyla canlı verilerin anlık görüntülerini düzenli olarak alma alışkanlığı içindeyse, şanslı olabilirsiniz ve bunlardan birinin durumunuzu düşürmek için son zamanlarda yeterince bozulmamış bir kopyası vardır. sadece "büyük rahatsızlık" için tam bir felaket.
David Spillett

7

Soru oldukça eski, ama tek bir olumlu cevap yok, bu yüzden bir tane ekleyeceğim.

MySQL bir tablo bıraktıktan sonra veriler bir süre medyadadır. Böylece kayıtları getirebilir ve bir tabloyu yeniden oluşturabilirsiniz. Daha sonra bunun hakkında blog yazacağım, ancak şimdilik hızlı eskiz.

Tablonuzun yapısına sahip olmanız gerekir (CREATE TABLE ifadesi).

İnnodb_file_per_table ON ise, bırakılan tablo disk bölümünde bulunur. MySQL'i durdurun ve salt okunur ASAP olarak yeniden bağlayın. MySQL bir kök disk bölümündeyse (ki bu iyi bir fikir btw değildir) bir görüntü alın veya diski çıkarın ve başka bir sunucuya takın. Başka bir deyişle tüm yazmaları durdurun.

İnnodb_file_per_table OFF ise MySQL'i durdurun.

Daha sonra https://github.com/twindb/undrop-for-innodb/ adresinden InnoDB için bırakma aracını indirin ve derleyin . "Kontrol Derleme TwinDB kurtarma araç Ayrıntılar için" yazı.

Ardından disk bölümünü veya ibdata1'i (innodb_file_per_table ayarına bağlı olarak) stream_parser ile ayrıştırın:

./stream_parser -f /path/to/diskimage_or_ibdata1

Sonra bırakılan tablonun hangi index_id olduğunu bilmek için InnoDB sözlüğü kurtarmak.

Sonra tablo yapısını alın ve kayıtları getirin

./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page

Kayıtları stdout'a ve LOAD DATA komutunu stderr'e çıkarır.


efendim hayatımı kurtardın
Buddhi741 15:19

2

İşte yaptığım şey. Mysql dizininde (Ubuntu için bu / var / lib / mysql, Homebrew kullanan Mac için bu / usr / local / var / mysql), bazı dosyalar buldum. Önce belirli şemayı içeren myapp_development / dizinini yerel mysql dizinime kopyaladım. Sonra yerel ibdata1'i yedekledim ve sunucunun ibdata1'ini mysql dizinine kopyaladım. Öldürülen mysqld. ( ps auxPID'yi bulmak için kill PID). MySQL yeniden başlatıldı, çökme kurtarma modunda başladı. Sonra benim yerel mysql istemcisi ateş ve gerekli tabloların tam bir dökümü oluşturdu.

Ve sonsuza dek gittiğini düşündüğümüz meta verilere giren haftalarca çalışmayı temsil eden 15.000 satır kaydedildi !!

Umarım bu birine yardımcı olur.


Bu güzel bir çaba ama eminim ki bu güvenilir bir teknik olmak için çok fazla umut tutturmak olmazdı. Bununla birlikte, yaratıcı düşünme için +1.
John Gardeniers

Evet, haklısın. Yalnızca yanlışlıkla mysql kullanıcısından tüm izinleri kaldırdığımız için çalışma sona erdi, böylece veritabanı bu kullanıcıya boş görünüyordu.
Duke

2

Ne yazık ki yapabileceğiniz çok az şey var, iyi bir yedekleme planına duyulan ihtiyaç hakkında çok değerli bir ders almaktan başka.

Tablo türüne bağlı olarak, verileri diskte bıraktıklarından bir araya getirebilen bir uzman bulabilirsiniz, ancak bu adli analiz çok pahalı olacaktır (nispeten nadir beceriler gerektireceği için) ve hiç garanti edilmez gerçekten yararlı olmak.


Başka seçenek var mı?

1
FractalizeR anlaşılacağı gibi tablolar basit Tablolar MyISAM olsaydı, o zaman belki bunlarla ilişkili dosyaları geri edebilecektir. Eğer deneyecek olursanız, o zaman sunucuyu şimdi kapatmanız gerekir, çünkü sistem ne kadar uzun süre aktifse, dosyaların kullandığı alanın yeniden kullanılmasının imkansız hale getirilmesi imkansız hale gelir (veya silinmemiş dosyaların içeriği bozulmuşsa) ). Silme işleminin nasıl geri alınacağı, kullanılan dosya sistemine bağlıdır. ntfsundelete.com , NTFS'de silme işlemini geri almak için Google aramadaki ilk faydalı görünümlü bağlantıdır.
David Spillett

0

Bu MyISAM tablosuysa, sadece / var / log / mysql dosyasındaki veya veri dizininiz ne olursa olsun tablo dosyalarını silmeniz gerekir. Örneğin bunun için ext3grep yardımcı programını kullanabilirsiniz .


ext3grep ext3 dosya sistemleri içindir. Windows kullanıyorsanız, ext3 dosya sistemi kullanmanız olası değildir (olasılıkla, FAT32 olsa da NTFS kullanıyorsunuzdur). Silinen dosyaların kurtarılmasını deneyecekseniz, diğer hizmetler ne olursa olsun, sunucuyu mümkün olan en kısa sürede kapatmanız gerekir, sunucu ne kadar uzun süre aktif olursa, silme işleminin geri alınamaması daha fazla olur hiç.
David Spillett

MyISAM tablolarını depolayan birimde gölge kopya açıksa, bu şekilde geri alma şansınız vardır.
Catherine MacInnes

Silinen veritabanı dosyasını geri yüklemek için Google'da "ntfs undelete" ifadesini arayabilirsiniz. Veri dizininin PC'nizin neresinde olduğunu bilmiyorum. Bunun için my.ini'nizi kontrol etmeniz veya örneğin MYD uzantılı dosyaları aramanız gerekir.
Vladislav Rastrusny

0

"Geri alamazsınız" a DROP TABLE.

MySQL'in ikili günlüğe kaydetme özelliğinin etkin olup olmadığını görebilir ve görebilirsiniz , belki oradan bazı verileri ayıklayabilirsiniz.

Bunun dışında, MySQL'i unutabilirsiniz ve "Bazı dosyaları yanlışlıkla dosya sistemimden sildim" ile aynı sınıftasınız. Dosyaları kurtarmaya çalışan bazı araçlar var ve bunu profesyonel olarak yapan şirketler de var.


-1

İkili günlük kaydı açıksa, şemanız varsa önce bir tabloyu yeniden oluşturabilirsiniz. Binlog'ları kapalıyken şema oluşturduğunuzdan emin olun. Ya da sadece oturuma geçebilirsiniz. Sonra binlog'ları drop table'ın kendisi olan son ifadeye kadar tekrar oynatabilirsiniz.

Değilse, varsa bir yedek dökümü kullanarak geri yükleyebilirsiniz. Eğer csv dosyalarınız varsa, veriyi kurtarmak için data infile yöntemini yükleyebilirsiniz. Eğer mysqldump kurtarma yapıyorsanız o zaman tam veritabanını geri yüklemek yerine döküm dosyasından tek bir tablo geri yüklemeyi düşünebilirsiniz. Veri boyutu çok büyükse, yüklemeden önce anahtarları devre dışı bırakmayı düşünebilirsiniz, bu geri yükleme işlemini önemli ölçüde artıracaktır.

Gelecek için 10-24 saat gibi bir gecikmiş köleye sahip olmak isteyebilirsiniz. Percona araç setini kullanarak ertelenmiş köle oluşturabilirsiniz (pt-slave-delay)

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.