Saya tidak sengaja menjatuhkan semua tabel. Bisakah saya mengembalikan kembali? Saya tidak punya salinan cadangan.
Saya tidak sengaja menjatuhkan semua tabel. Bisakah saya mengembalikan kembali? Saya tidak punya salinan cadangan.
Jawaban:
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.
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.
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 aux
untuk 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.
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.
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.
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.
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)