Skip to main content
๐Ÿš€ nusa.id cloud server linux indonesialihat paket

Cara Memperbaiki Tabel MySQL yang Rusak di Ubuntu 24.04

ยท 5 min read
Ilhamsyah
Maintainer

Kerusakan tabel database MySQL dapat terjadi secara tiba-tiba akibat mati listrik, kehabisan ruang disk, atau crash pada proses server. Kondisi ini membuat aplikasi Anda tidak dapat membaca data dan memicu error koneksi database. Panduan ini menjelaskan cara mendiagnosis dan memperbaiki tabel MySQL yang rusak di Ubuntu 24.04 secara aman.

Gejala Umumโ€‹

Ketika tabel MySQL mengalami kerusakan (corruption), sistem database akan mencatat error pada file log aplikasi atau file log utama MySQL yang berlokasi di /var/log/mysql/error.log. Berikut adalah beberapa gejala umum yang biasa terlihat:

  1. Aplikasi menampilkan pesan error seperti Table 'table_name' is marked as crashed and should be repaired.
  2. Query ke tabel tertentu menghasilkan kegagalan dengan kode error Can't open file: 'table_name.MYI' (errno: 130) atau Incorrect key file for table; try to repair it.
  3. Proses MySQL mengalami restart berulang kali (crash loop) ketika mengakses baris data tertentu.
  4. Muncul tulisan Internal error: Page corruption pada log database saat MySQL mencoba melakukan pembacaan atau penulisan data.

Kemungkinan Penyebabโ€‹

Sebelum melakukan proses perbaikan, memahami penyebab kerusakan sangat penting agar masalah serupa tidak terulang kembali di kemudian hari. Beberapa penyebab utama meliputi:

  • Server Crash atau Power Failure: Server mati secara mendadak saat proses penulisan data ke dalam file database masih berlangsung di disk.
  • Kehabisan Ruang Penyimpanan: Disk server penuh saat MySQL mencoba menulis data baru, sehingga menyebabkan penulisan file terputus di tengah jalan.
  • Masalah Hardware: Kerusakan pada sektor hard disk (bad sector) tempat database disimpan atau kegagalan modul memori RAM.
  • Interferensi Proses Eksternal: Aplikasi pihak ketiga (seperti antivirus atau script backup mentah) mengunci atau mengubah file database langsung dari sistem file tanpa melalui daemon MySQL.

Diagnostikโ€‹

Langkah pertama dalam penanganan adalah mengidentifikasi tabel mana yang mengalami kerusakan dan menentukan tipe database engine yang digunakan oleh tabel tersebut (biasanya InnoDB atau MyISAM).

1. Memeriksa Log MySQLโ€‹

Gunakan perintah berikut untuk menyaring log MySQL dan mencari indikasi tabel yang rusak:

sudo tail -n 50 /var/log/mysql/error.log | grep -iE "corrupt|crash|repair|error"

2. Mendiagnosis Menggunakan mysqlcheckโ€‹

MySQL menyediakan utilitas bawaan bernama mysqlcheck untuk menganalisis tabel tanpa harus menghentikan layanan database. Jalankan perintah berikut untuk memeriksa seluruh database:

mysqlcheck -u root -p --all-databases

Masukkan kata sandi root MySQL Anda saat diminta. Jika Anda hanya ingin memeriksa tabel tertentu pada database spesifik, jalankan perintah:

mysqlcheck -u root -p nama_database nama_tabel

3. Memeriksa Melalui Query SQLโ€‹

Anda juga dapat masuk ke shell MySQL untuk memeriksa status integritas tabel secara langsung:

sudo mysql -u root -p

Pilih database yang dituju dan jalankan query CHECK TABLE:

USE nama_database;
CHECK TABLE nama_tabel;

Perhatikan kolom Msg_type dan Msg_text pada output. Jika statusnya menunjukkan OK, maka tabel tersebut dalam kondisi sehat. Jika menunjukkan error atau corrupt, tabel memerlukan tindakan perbaikan.

Perbaikanโ€‹

Prosedur perbaikan sangat bergantung pada storage engine yang digunakan oleh tabel yang rusak.

โš ๏ธ Peringatan: Sebelum melakukan tindakan perbaikan apa pun, pastikan Anda telah menduplikasi direktori data MySQL mentah (/var/lib/mysql) ke lokasi cadangan yang aman. Kesalahan saat menjalankan proses perbaikan berisiko menyebabkan kehilangan data secara permanen.

Hentikan layanan database sebelum menyalin file database mentah untuk menghindari inkonsistensi:

sudo systemctl stop mysql
sudo cp -R /var/lib/mysql /var/lib/mysql_backup
sudo systemctl start mysql

Opsi 1: Perbaikan Tabel MyISAM dan Ariaโ€‹

Engine MyISAM menyimpan data dalam file terpisah (.MYD dan .MYI), sehingga proses perbaikan dapat dilakukan secara langsung.

  1. Menggunakan mysqlcheck: Jalankan perintah berikut untuk memperbaiki tabel yang terindikasi rusak:

    mysqlcheck -u root -p --repair nama_database nama_tabel
  2. Menggunakan Query SQL: Juk jika Anda berada di dalam shell MySQL:

    USE nama_database;
    REPAIR TABLE nama_tabel;

Opsi 2: Perbaikan Tabel InnoDB (Langkah Pemulihan Aman)โ€‹

Tabel InnoDB menggunakan arsitektur ruang tabel bersama (tablespace) yang lebih kompleks, sehingga perintah REPAIR TABLE tidak didukung. Untuk memperbaiki kerusakan InnoDB, kita harus menggunakan fitur innodb_force_recovery.

  1. Hentikan Layanan MySQL:

    sudo systemctl stop mysql
  2. Konfigurasikan innodb_force_recovery: Buka file konfigurasi utama MySQL menggunakan text editor pilihan Anda:

    # Menggunakan nano:
    sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

    # Menggunakan vim:
    sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

    Tambahkan baris berikut di bawah bagian [mysqld]:

    innodb_force_recovery = 1

    Catatan: Nilai recovery dapat diatur dari 1 hingga 6. Mulailah dari angka 1. Nilai yang lebih tinggi dapat merusak struktur data lebih lanjut tetapi memungkinkan server tetap aktif untuk mengekstrak data.

  3. Mulai Layanan MySQL dalam Mode Recovery:

    sudo systemctl start mysql
  4. Ekspor Data (Dump Database): Setelah MySQL berjalan dalam mode recovery, segera ekspor seluruh isi database Anda ke file SQL. Jangan biarkan aplikasi melakukan penulisan baru saat mode ini aktif.

    mysqldump -u root -p nama_database > /var/www/nama_database_backup.sql
  5. Matikan Mode Recovery: Hentikan kembali layanan MySQL:

    sudo systemctl stop mysql

    Buka kembali file konfigurasi /etc/mysql/mysql.conf.d/mysqld.cnf, cari baris innodb_force_recovery lalu beri tanda pagar (#) di depannya untuk menonaktifkannya, kemudian simpan file tersebut.

  6. Impor Kembali Database: Mulai kembali layanan MySQL secara normal:

    sudo systemctl start mysql

    Masuk ke MySQL, hapus database yang rusak, buat database baru dengan nama yang sama, lalu impor file SQL cadangan Anda:

    sudo mysql -u root -p -e "DROP DATABASE nama_database; CREATE DATABASE nama_database;"
    mysql -u root -p nama_database < /var/www/nama_database_backup.sql

Verifikasiโ€‹

Setelah langkah perbaikan selesai, Anda harus memastikan bahwa database kembali berfungsi normal dan tidak ada struktur data yang rusak.

1. Jalankan Kembali mysqlcheckโ€‹

Pastikan perintah verifikasi berikut memberikan status OK untuk seluruh tabel:

mysqlcheck -u root -p --all-databases --check-only-unused

2. Periksa Status Engine Melalui SQL Shellโ€‹

Masuk ke shell MySQL dan jalankan query berikut untuk memverifikasi status tabel InnoDB pasca-restorasi:

USE nama_database;
SHOW TABLE STATUS LIKE 'nama_tabel';

Pastikan kolom Rows menampilkan estimasi jumlah baris yang sesuai dan kolom Comment tidak menunjukkan pesan error.

3. Pantau Log Error Pasca-Restartโ€‹

Lakukan pemantauan langsung pada log error saat aplikasi mulai menulis data ke server Nusa Cloud VPS Anda:

sudo tail -f /var/log/mysql/error.log

Pastikan tidak ada pesan crash baru atau kegagalan alokasi memori InnoDB yang dicatat.