Apakah ada cara untuk memulihkan database mysql yang hilang?

8

Saya tidak sengaja menjatuhkan database MySQL di server saya. Apakah ada cara untuk memulihkan database yang jatuh?

kewl
sumber
Apa platform yang menjalankan database MySQL Anda?
Jack bilang coba topanswers.xyz
Adakah kemungkinan drive di basis data Anda sedang dicadangkan dan admin server dapat menyelamatkan Anda?
Kenneth Fisher
Ada berbagai alat di pasar untuk memperbaiki database MySQL yang korup tetapi untuk hasil terbaik dan teruji Anda selalu dapat mengandalkan alat Stellar untuk memperbaiki database Anda. Alat ini dapat memperbaiki tabel InnoDB dan MyISAM dari database MySQL. Anda juga bisa mendapatkan pratinjau objek database yang diperbaiki yang akan membantu Anda memberikan gambaran umum tentang data yang sedang dipulihkan. Versi Demo Trial dari perangkat lunak ini tersedia secara gratis untuk memperbaiki database dengan integritas penuh dan format asli, memastikan tidak ada kehilangan data.
Mitchel

Jawaban:

16

Jika Anda bertindak cepat ada kemungkinan besar untuk mendapatkan kembali database Anda. Peluangnya lebih tinggi untuk InnoDB, untuk MyISAM bukan nol, tapi dekat.

Masalahnya adalah ketika MySQL mengeksekusi DROP TABLE atau DROP DATABASE (yang pada dasarnya sama) InnoDB tidak menghapus data. Halaman dengan data masih di disk.

Tergantung pada pengaturan innodb_file_per_table proses pemulihan berbeda. Jika innodb_file_per_table adalah OFF (default hingga 5.5) maka tabel yang dijatuhkan tetap di ibdata1. Jika innodb_file_per_table adalah AKTIF (default pada 5.5) maka tabel yang dijatuhkan berada di masing-masing file .ibd. MySQL menghapus file ini ketika menjatuhkan tabel.

Hal pertama yang harus dilakukan adalah menghentikan kemungkinan penulisan sehingga meja Anda tidak ditimpa. Jika innodb_file_per_table OFF, itu cukup untuk menghentikan MySQL (kill -9 bahkan lebih baik, tetapi pastikan Anda membunuh safe_mysqld terlebih dahulu). Jika innodb_file_per_table AKTIF maka umount partisi tempat MySQL menyimpan datanya. Jika datadir berada di partisi root, saya sarankan untuk mematikan server atau setidaknya mengambil gambar dari disk. Saya ulangi, tujuannya adalah untuk mencegah overwriting menjatuhkan tabel oleh MySQL atau sistem operasi.

Ada alat yang memungkinkan untuk bekerja dengan halaman InnoDB di tingkat rendah, tool pemulihan data TwinDB . Saya akan menggunakannya untuk menggambarkan pemulihan undrop.

Anda perlu mengambil media dengan tabel yang dijatuhkan (baik ibdata1 atau disk image) dan menemukan halaman InnoDB di atasnya. alat stream_parser dari toolkit melakukannya.

./stream_parser -f /path/to/disk/image

Ini akan memindai file, menemukan halaman InnoDB dan mengurutkannya berdasarkan tipe dan index_id. index_id adalah pengidentifikasi yang digunakan InnoDB untuk merujuk ke indeks. Sebuah tabel disimpan dalam indeks PRIMARY. Untuk menemukan index_id apa yang Anda jatuhkan, Anda perlu memulihkan kamus InnoDB .

Kamus InnoDB disimpan dalam file ibdat1. Anda perlu memindai file ibdata1 dengan cara yang sama seperti di atas:

./stream_parser -f /var/lib/mysql/ibdata1

Sekarang Anda perlu mendapatkan catatan dari tabel kamus InnoDB SYS_TABLES dan SYS_INDEXES (katakanlah tabel Anda adalah sakila.actor):

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor
000000000B28  2A000001430D4D  SYS_TABLES  "sakila/actor"  158  4  1 0   0   ""  0

158 adalah table_id, ingat itu.

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 158
000000000B28    2A000001430BCA  SYS_INDEXES     158     376     "PRIMARY"       1       3       0       4294967295
000000000B28    2A000001430C3C  SYS_INDEXES     158     377     "idx\_actor\_last\_name"        1       0       0       4294967295

Jadi, index_id dari tabel yang Anda jatuhkan (sakila.actor) adalah 376.

Sekarang Anda dapat mengambil catatan dari tabel yang dijatuhkan dari InnoDB index_id 376. Anda harus memiliki struktur tabel dari tabel yang dijatuhkan, persis pernyataan CREATE TABLE yang tabelnya dibuat. Di mana Anda bisa mendapatkannya? Baik dari cadangan lama, atau dari tempat lain. Mungkin juga untuk memulihkan struktur dari kamus InnoDB, tetapi saya tidak akan membahasnya dalam jawaban ini. Anggap saja Anda memilikinya.

./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t actor.sql > dump.tsv 2> load_cmd.sql

c_parser menampilkan catatan sebagai dump tab-separated ke stdout. Dump dapat dimuat dengan perintah LOAD DATA. c_parser mencetaknya ke stderr.

Lihat lebih detail di posting:

akuzminsky
sumber
apakah masih dapat dipulihkan jika setelah tabel turun, saya membuat tabel baru dan menyisipkan catatan baru?
Oki Erie Rinaldi
Dalam hal ini Anda kehilangan index_id karena CREATE menimpa nilai asli. Anda harus menemukannya entah bagaimana. Biasanya saya memahami string yang dikenal. INSERT berikut mungkin atau mungkin tidak menimpa data. Jika tidak, itu dapat dipulihkan. Anda harus mencoba, tidak ada cara untuk memberi tahu sebelumnya
akuzminsky
Tautan ini menghasilkan 404 !!
Nevermore
@akuzminsky saya lakukan sampai bagian "kamus / SYS_INDEXES.sql | grep 158". Dan itu memberi saya beberapa index_id untuk tabel saya, Tetapi dikatakan tidak ada file halaman dengan index_id saya. mis: 0000000000000376.page (ketika saya menjalankan c_parser -6f ini)
Sampath Sri Anuradha
@SampathSriAnuradha pasti merasa tidak enak ketika Fortune tidak ada di pihak Anda. Maafkan saya.
akuzminsky
11

Tidak ada cara mudah untuk memecahkan ini untuk Anda. Tidak masalah jika Anda menjatuhkan db melalui phpmyadmin atau commandline. Itu sudah pergi.

Human error adalah salah satu alasan untuk memiliki rejimen cadangan yang baik.

Saya tidak religius tetapi saya akan berdoa berharap itu tidak terlalu penting.

atxdba
sumber
itu sangat penting, banyak transaksi akan hilang
kewl
8
Yang terbaik yang bisa saya sarankan dalam hal ini adalah meng-unmount sistem file datadir Anda. Matikan server jika perlu melakukannya. Panggil layanan pemulihan data dan bersiaplah untuk keluar ribuan, jika tidak puluhan, semua sambil membayar untuk menembak omong kosong tanpa garauntees: - \
atxdba
3
Jika ada orang yang dalam situasi yang sama membaca ini di masa depan, saya pikir ada baiknya juga menyarankan bahwa penting untuk menginstal sistem file yang tidak terpasang atau baca-saja ASAP jika Anda akan menyewa perusahaan pemulihan data. Semakin lama penulisan berlanjut pada sistem file, semakin besar kemungkinan bahwa cluster yang berisi file yang Anda hapus akan ditimpa.
James L
2

Tergantung pengaturan Anda. Dimungkinkan untuk memulihkan jika Anda mengatur sistem Anda dengan benar. Jika Anda memiliki cadangan, Anda dapat memulihkannya. dan kemudian menerapkan log biner hingga ke titik tepat sebelum Anda menjatuhkan tabel.

http://dev.mysql.com/doc/refman/5.5/en/mysqlbinlog.html

Saya sarankan Anda melakukan ini di server lain, setelah tabel dikembalikan, Anda dapat menggunakan mysqldump untuk mengekstraknya dan mengimpor kembali ke server produksi Anda. Ini bukan pemulihan yang cepat, tetapi Anda dapat memulihkan data.

Jika Anda tidak tahu apa yang Anda lakukan, saya sarankan membuka kontrak dukungan dengan salah satu perusahaan konsultan mysql (pythian, percona, palamino mungkin yang terbaik) dan minta mereka membantu Anda dalam hal ini.

Semoga beruntung

Allen Kinnard
sumber