GNU/Linux >> Belajar Linux >  >> Linux

Memperbaiki database MySQL InnoDB

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.


Linux
  1. MySQL – Mengonversi ke Data Per Tabel untuk InnoDB

  2. Memperbarui MariaDB ke v10.2.35 atau v10.3.26 menunjukkan Database MySQL sebagai offline di cPanel.

  3. Pengaturan koneksi untuk database MySQL

  1. Bagaimana mengelola database MySQL dan pengguna di cPanel

  2. Cara menyalin tabel MySQL antar database

  3. Pencadangan Inkremental MySQL - Pencadangan dan Pemulihan Titik Waktu InnoDB dan Basis Data MyIsam

  1. Tampilkan tipe database MySQL di bash

  2. Bekerja dengan Database MySQL cPanel

  3. Gunakan Holland dan Cloud Backup untuk mencadangkan database MySQL