Pendahuluan:
Postingan ini adalah salinan dari pos berikut yang luar biasa:
https://blackbird.si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/https://blackbird .si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/
Berikut adalah beberapa upaya penting darinya:
MySQL – Pemulihan tabel InnoDB yang rusak – Panduan langkah demi langkah
Diposting di Databases Oleh Alen Krmelj Pada 19 Maret 2013, 5-6 menit
Tabel InnoDB tidak mudah rusak, tetapi ketika terjadi, biasanya terjadi karena masalah perangkat keras, pemadaman listrik, atau bug MySQL. Ini meninggalkan Anda dengan halaman yang rusak di tablespace InnoDB dan memulihkan dari itu mungkin menjadi masalah. Saat MySQL Anda mogok dengan benar dan tidak ingin kembali, Anda mungkin melihat kesalahan serupa berulang:
InnoDB: Assertion failure in thread 1129654592 in file ibuf0ibuf.c line 4231 InnoDB: Failing assertion: page_get_n_recs(page) > 1 InnoDB: We intentionally generate a memory trap. InnoDB: Submit a detailed bug report to http://bugs.mysql.com. InnoDB: If you get repeated assertion failures or crashes, even InnoDB: immediately after the mysqld startup, there may be InnoDB: corruption in the InnoDB tablespace. Please refer to InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html InnoDB: about forcing recovery. mysqld got signal 6 ; This could be because you hit a bug. It is also possible that this binary or one of the libraries it was linked against is corrupt, improperly built, or misconfigured. This error can also be caused by malfunctioning hardware. We will try our best to scrape up some info that will hopefully help diagnose the problem, but since we have already crashed, something is definitely wrong and this may fail. ... some backtrace ... The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains information that should help you find out what is causing the crash. mysqld_safe Number of processes running now: 0 mysqld_safe mysqld restarted
Memulihkan dari tabel InnoDB yang rusak
Langkah 1 – Buka database Anda dalam mode pemulihan
Anda harus menurunkan database Anda. Matikan jika masih berjalan dan mengirim spam ke pesan-pesan ini di log Anda. Sebagai upaya terakhir, Anda juga dapat mematikan prosesnya. Untuk mengembalikan database Anda, Anda harus memulainya dalam mode pemulihan, dengan innodb_force_recovery
. Anda harus tahu mode pemulihan ini membuat database Anda hanya bisa dibaca. Pengguna yang terhubung dengannya tidak dapat memperbarui, menyisipkan, atau mengubah data yang ada dengan cara lain. Untuk mencegah MySQL Anda dipalu begitu kembali, saya sarankan Anda juga mengubah port server MySQL dari 3306 menjadi sesuatu yang acak. Tambahkan innodb_force_recovery=1
ke my.cnf
. Anda Jika server Anda tidak ingin kembali, Anda dapat menambah jumlah ini dari 1 menjadi 6, periksa manual MySQL untuk melihat perbedaannya.
Pastikan untuk memeriksa log MySQL Anda, dan jika loop dengan sesuatu seperti:
InnoDB: Waiting for the background threads to start
Anda juga harus menambahkan innodb_purge_threads=0
ke my.cnf
. Anda .
Jadi bersama-sama untuk mengembalikan database, saya harus menambahkan 3 parameter ini di my.cnf
:
port = 8881 innodb_force_recovery=3 innodb_purge_threads=0
Langkah 2 – Periksa tabel mana yang rusak dan buat daftarnya
Sekarang Anda memiliki database Anda kembali dan berjalan, tetapi dalam mode pemulihan. Anda tidak dapat mengubah database/tabel Anda. Jika Anda mencobanya, Anda akan mendapatkan kesalahan:
Got error -1 from storage engine
Kita perlu mencari tahu tabel mana yang rusak. Untuk melakukan itu, kita jalankan:mysqlcheck --all-databases
Periksa baris di mana dikatakan tabel Rusak. Catat semua tabel/database yang membuat Anda error. Anda perlu mysqldump
mereka dalam mode pemulihan dan impor kembali setelah Anda mem-boot kembali ke mode MySQL normal. Izinkan saya juga mengingatkan Anda bahwa innochecksum
perintah tidak membantu saya mencari tahu tabel mana yang rusak, jadi jangan repot-repot melakukannya.
Langkah 3 – Cadangkan dan jatuhkan tabel yang rusak
Setelah Anda mendapatkan daftar tabel yang rusak, Anda harus mysqldump ke file .sql mereka sendiri, dengan begitu Anda akan memiliki cadangan untuk diimpor ulang. Jika Anda bertanya-tanya bagaimana cara membuang hanya satu tabel dalam database:
mysqldump tabel my_database> database.table.sql
Setelah Anda memiliki cadangan, jatuhkan tabel yang rusak dengan menjalankan:drop table database.table; dari shell MySQL Anda. Anda sekarang telah membersihkan database MySQL Anda sehingga saatnya untuk mem-boot-nya kembali tanpa mode pemulihan.
Langkah 4 – Mulai ulang MySQL dalam mode normal
Ketika kami tidak memiliki tabel rusak yang tersisa di database kami, kami harus menghapus pengaturan my.cnf yang kami tambahkan pada Langkah 1. Jangan hapus pengaturan port, karena database Anda masih kehilangan tabel yang Anda cadangkan dan perlukan untuk diimpor kembali. Mulai ulang MySQL Anda.
Langkah 5 – Impor cadangan .sql
Impor setiap tabel .sql yang dibuang ke database yang dihormati. Untuk melakukannya dari CLI:
mysql database < database.table.sql
Langkah 6 – Ganti port dan ambil bir
Setelah Anda selesai mengimpor tabel, Anda bebas mengubah pengaturan port di my.cnf
Anda . Tentu saja reboot MySQL setelahnya. Itu harus kembali dan mulai bekerja seperti sebelum crash. Ambil bir dan klik di bagian atas posting ini, untuk memberi tahu saya bahwa artikel ini membantu Anda memecahkan masalah Anda.