Saya tidak sengaja menjatuhkan database MySQL di server saya. Apakah ada cara untuk memulihkan database yang jatuh?
Saya tidak sengaja menjatuhkan database MySQL di server saya. Apakah ada cara untuk memulihkan database yang jatuh?
Jawaban:
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:
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.
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