Bagaimana cara membatalkan DROP Table?

11

Saya tidak sengaja menjatuhkan semua tabel. Bisakah saya mengembalikan kembali? Saya tidak punya salinan cadangan.

Mark Henderson
sumber

Jawaban:

12

Jika Anda benar-benar tidak memiliki cadangan maka saya yakin Anda 99% kurang beruntung.

Jika Anda memiliki segala bentuk cadangan, betapapun tua, maka apakah Anda memiliki pencatatan biner diaktifkan melalui opsi log-bin ke dalam file konfigurasi MySQL (my.ini)? Jika demikian mereka Anda mungkin dapat memulihkan sejak cadangan terakhir.

Cara yang buruk untuk memulai seminggu, maaf.

Chopper3
sumber
2
Mungkin karena Anda tidak berpengalaman, kita semua telah melakukan hal semacam ini, kadang-kadang masih (mengunci diri dari VCenter saya sendiri belum seminggu yang lalu) - yang penting adalah Anda belajar darinya sehingga Anda kurang kemungkinan akan berulang.
Chopper3
Apa yang bisa saya lakukan sekarang?? Aku tidak bisa duduk dan menunggu !!!!
8
Beri tahu manajer Anda
Chopper3
4
Itu tidak memperbaiki masalah, tetapi mungkin salah satu pengembang Anda memiliki salinan yang tidak terlalu jauh dari salinan bagus terakhir?
Tom O'Connor
3
Tom memunculkan poin yang sangat bagus: jika pengembang Anda terbiasa mengambil snapshot secara langsung dari data langsung untuk keperluan pengujian / pengembangan, maka Anda mungkin beruntung dan salah satu dari mereka memiliki salinan belum lama ini yang cukup baru untuk menurunkan situasi Anda dari " menyelesaikan bencana "hanya" ketidaknyamanan utama ".
David Spillett
7

Pertanyaannya agak lama, tetapi tidak ada jawaban positif tunggal, jadi saya akan menambahkannya.

Setelah MySQL menjatuhkan tabel, data masih ada di media untuk sementara waktu. Jadi, Anda bisa mengambil catatan dan membangun kembali tabel. Nanti saya akan menulis blog tentang itu, tetapi untuk sketsa cepat sekarang.

Anda perlu memiliki struktur tabel Anda (CREATE TABLE statement).

Jika innodb_file_per_table ON, tabel yang dijatuhkan berada di partisi disk. Hentikan MySQL dan pasang kembali sebagai ASAP hanya baca. Jika MySQL berada di partisi root (yang bukan ide bagus btw) maka ambil gambar atau keluarkan disk dan tancapkan ke server lain. Hentikan semua tulisan dengan kata lain.

Jika innodb_file_per_table OFF maka hentikan MySQL.

Kemudian unduh dan kompilasi alat un-drop untuk InnoDB dari https://github.com/twindb/undrop-for-innodb/ . Lihat pos " Kompilasi tool pemulihan TwinDB " untuk detailnya.

Kemudian parse partisi disk atau ibdata1 (tergantung pada pengaturan innodb_file_per_table) dengan stream_parser:

./stream_parser -f /path/to/diskimage_or_ibdata1

Kemudian pulihkan kamus InnoDB untuk mengetahui di mana index_id tabel yang dijatuhkan.

Kemudian ambil struktur tabel dan ambil catatan

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

Ini akan menampilkan catatan ke stdout dan perintah LOAD DATA ke stderr.

akuzminsky
sumber
Anda pak menyelamatkan hidup saya
Buddhi741
2

Inilah yang saya lakukan. Dalam direktori mysql (untuk Ubuntu ini adalah / var / lib / mysql, untuk Mac menggunakan Homebrew ini adalah / usr / local / var / mysql), saya menemukan beberapa file. Pertama saya menyalin direktori myapp_development / yang berisi skema tertentu ke direktori mysql lokal saya. Kemudian saya mencadangkan ibdata1 lokal saya dan menyalin ibdata1 server ke direktori mysql. Membunuh mysqld. ( ps auxuntuk menemukan PID, lalu kill PID). Restart mysql, itu dimulai dalam mode pemulihan crash. Kemudian meluncurkan klien mysql lokal saya dan menghasilkan setumpuk penuh tabel yang saya butuhkan.

Dan, 15.000 baris yang mewakili minggu kerja memasuki metadata yang kami pikir telah hilang selamanya, selamat !!

Semoga ini bisa membantu seseorang.

Bangsawan tinggi
sumber
Itu upaya yang bagus tapi saya yakin tidak akan terlalu banyak berharap ini menjadi teknik yang dapat diandalkan. Namun demikian, +1 untuk beberapa pemikiran kreatif.
John Gardeniers
Ya kamu benar Itu akhirnya bekerja hanya karena kami tidak sengaja menghapus semua izin dari pengguna mysql, sehingga database muncul sebagai kosong untuk pengguna itu.
Duke
2

Sayangnya, sangat sedikit yang dapat Anda lakukan selain mengambil pelajaran yang sangat berharga tentang perlunya rencana cadangan yang baik.

Tergantung pada jenis tabel Anda mungkin dapat menemukan seorang ahli yang dapat mengumpulkan data kembali dari apa yang tersisa pada disk tetapi analisis forensik seperti itu akan sangat sangat sangat mahal (karena akan memerlukan keterampilan yang relatif tidak umum) dan sama sekali tidak dijamin untuk benar-benar bermanfaat.

David Spillett
sumber
Apakah ada opsi lain?
1
Seperti yang disarankan FractalizeR, jika tabelnya adalah tabel MyISAM sederhana maka Anda mungkin dapat membatalkan penghapusan file yang terkait dengannya. Jika Anda akan mencoba maka Anda perlu mematikan server sekarang karena semakin lama sistem aktif semakin banyak kesempatan bahwa ruang yang digunakan oleh file akan digunakan kembali membuat pembatalan penghapusan tidak mungkin (atau membuat file yang tidak terhapus memiliki konten yang rusak. ). Cara membatalkan penghapusan tergantung pada sistem file yang digunakan. ntfsundelete.com adalah tautan tampak berguna pertama dalam pencarian Google untuk membatalkan penghapusan pada NTFS.
David Spillett
0

Jika ini adalah tabel MyISAM, Anda hanya perlu membatalkan penghapusan file tabel di / var / log / mysql atau apa pun dir data Anda. Anda dapat menggunakan utilitas ext3grep untuk itu misalnya.

Vladislav Rastrusny
sumber
ext3grep adalah untuk filesystem ext3. Jika Anda menggunakan Windows maka Anda tidak mungkin menggunakan sistem file ext3 (kemungkinan Anda menggunakan NTFS, meskipun itu mungkin FAT32). Jika Anda akan mencoba memulihkan file yang dihapus, Anda harus mematikan server sesegera mungkin, tidak peduli layanan apa pun yang berjalan di atasnya, karena semakin lama server aktif semakin banyak kesempatan ada yang tidak dapat dihapus tidak dapat membantu kamu sama sekali.
David Spillett
Jika Anda memiliki salinan bayangan dihidupkan pada volume yang menyimpan tabel MyISAM Anda memiliki kesempatan untuk mendapatkannya kembali.
Catherine MacInnes
Untuk mengembalikan file database yang dihapus, Anda dapat mencari "ntfs undelete" dari google. Saya tidak tahu di mana dir data berada di PC Anda. Anda perlu memeriksa my.ini Anda untuk itu atau mencari file dengan ekstensi MYD misalnya.
Vladislav Rastrusny
0

Anda tidak dapat "membatalkan" a DROP TABLE.

Anda dapat melihat dan melihat apakah MySQL yang memiliki pencatatan biner diaktifkan, mungkin Anda dapat mengekstrak beberapa data dari sana.

Selain itu, Anda bisa melupakan MySQL dan berada di kelas masalah yang sama "Saya tidak sengaja menghapus beberapa file dari sistem file saya". Ada beberapa alat di luar sana yang mencoba memulihkan file, dan ada juga perusahaan yang melakukannya secara profesional.

Luke404
sumber
-1

Jika Anda memiliki logging biner dihidupkan maka Anda bisa membuat ulang tabel terlebih dahulu jika Anda memiliki skema. Pastikan Anda membuat skema saat binlog Anda dimatikan. Atau Anda bisa langsung melewati sesi ini. Kemudian Anda dapat memutar ulang binlog hingga pernyataan terakhir yang drop table itu sendiri.

Jika tidak, maka Anda dapat memulihkan dengan menggunakan cadangan sampah jika ada. Jika Anda memiliki file csv maka Anda dapat melakukan metode memuat data infile untuk memulihkan data. Jika Anda memulihkan dari mysqldump maka Anda dapat mempertimbangkan memulihkan satu tabel dari file dump daripada mengembalikan database lengkap. Jika ukuran data terlalu besar maka Anda dapat mempertimbangkan untuk menonaktifkan kunci sebelum memuat ini akan secara signifikan meningkatkan proses pemulihan.

Untuk masa depan Anda mungkin ingin memiliki budak yang tertunda sekitar 10-24 jam di belakang. Anda dapat membuat budak yang tertunda menggunakan perkona toolkit (pt-slave-delay)

roger moore
sumber