Berita

Tips Cara Recovery Data MySQL Apabila File ibdata1 Rusak

Pada video ini saya akan berbagi tips bagaimana cara recovery data MySQL, apabila terjadi kerusakan pada file ibdata1 dan kita tidak memiliki backup hasil mysqldump atau mungkin backup terakhir kita sudah terlalu lama, sehingga kita terpaksa harus recovery dari data yang rusak ini.

Nah, sebelum kita melanjutkan, ada satu syarat penting yang harus terpenuhi. Pada config mysql, nilai dari innodb_file_per_table harus On. Kabar baiknya, untuk mysql versi 5.6 keatas, nilai dari innodb_file_per_table secara defaultnya memang on. Apakah efek dari setting ini? Efek dari setting ini bisa kita lihat pada folder data MySQL. Untuk mengetahui dimana folder datanya, kita bisa membuka file my.cnf, atau kita bisa menjalankan perintah SQL dibawah ini:

show variables where variable_name = 'datadir';

Pada komputer saya kebetulan berada di drive C, folder program data, mysql. Kalau kita buka, inilah isi foldernya. Pada folder paling luarnya, terdapat satu file yang paling penting untuk MySQL, yaitu ibdata1. File ini berfungsi untuk menyimpan semua data dari semua database yang ada di MySQL.

Nah, kalau kita jalankan perintah SQL ini:

show databases;

Maka kita bisa melihat semua database yang ada di MySQL saya. Dan kalau kita bandingkan ke folder data, maka setiap database ini disimpan di dalam satu folder. Kecuali information_schema. Sekarang kita buka ke salah satu database yaitu skysen.

use skysen;
show tables;

Dan bisa kita bandingkan ke isi folder skysen. Maka kita bisa melihat bahwa setiap table disimpan dalam 2 file, yaitu .frm dan .ibd. Nah, apabila kita tidak punya innodb_file_per_table, maka setiap table hanya memiliki satu file .frm saja, yang isinya hanya struktur tablenya saja. Sedangkan semua data disimpan di satu file idbdata1, sehingga ukurannya menjadi sangat besar. Sedangkan bila innodb_file_per_table dihidupkan, maka setiap table memiliki file .ibd yang menyimpan data dari masing-masing table.

Untuk melihat data dari table, kita bisa menjalankan perintah:

select * from con_course;
select * from con_course_user;

Kelihatan ya, ada datanya.

Sekarang kita simulasikan kondisi mysql yang rusak. Pertama saya keluar dari MySQL. Lalu saya matikan service MySQL. Saya hapus file ib_logfile0, ib_logfile1 dan ibdata1. Dan saya hidupkan kembali service MySQL. Akibatnya MySQL terpaksa membuat file baru untuk ketiganya. Dan perhatikan bahwa ukuran ibdata1 berubah dari tadinya 77 MB menjadi 12 MB.

Kita masuk kembali ke MySql. Kita masih bisa melihat daftar database dengan menjalankan perintah

show databases;

Dan kita masih bisa menggunakan salah satu database dan melihat isi tablenya.

use skysen;
show tables;

Namun kita sudah tidak bisa melihat data dari masing-masing table.

select * from con_course;
select * from con_course_user;

Jadi bagi teman-teman yang mendapatkan masalah seperti ini, kita akan bahas trik untuk recovery datanya. Namun sebelum melanjutkan, jalankan dahulu SQL dibawah ini:

select version();

Catat ketiga angka versi MySQL ini. Karena untuk recovery kita mesti menggunakan MySQL yang versinya sama persis.

Sekarang kita masuk ke solusi cara recovery data MySQL. Langkah pertama yang paling penting adalah kita harus menyelamatkan folder data MySQL. Copy dahulu folder data ini ke tempat lain. Apabila diperlukan, buatlah beberapa copy karena mungkin saja kita harus melakukan beberapa trik recovery barulah kita bisa benar-benar mendapatkan kembali data kita. Dalam contoh ini, saya copy folder data ke drive c:.

Selanjutnya, kita mesti menginstall ulang MySQL dengan versi yang sama persis dengan yang rusak. Kebetulan saya sudah memiliki file installer-nya, jadi saya tinggal menjalankannya saja. Bagi teman-teman yang belum memiliki installer, bisa melakukan search google dengan kata kunci download mysql. Atau download mysql archieve untuk mendapatkan mysql versi. Saya jalankan dahulu installernya untuk melakukan uninstall. Perhatikan pada saat uninstall, kita menghapus semua folder data. Dan kemudian saya install ulang. Kita harus memilih MySQL dengan versi yang sama persis dengan yang rusak.

Kita masuk ke mysql baru. Coba jalankan

show databases;

Hanya ada database default bawaan MySQL ya. Kita buat database baru dengan nama skysen. Nama database ini harus sama persis dengan nama database yang hendak kita recovery. Jadi teman-teman bisa melihat nama database pada folder data masing-masing.

create database skysen;
use skysen;
show tables;

Berhubung ini adalah database baru, maka masih belum ada data sama sekali. Selanjutnya kita perlu menjalankan perintah CREATE TABLE. Untuk itu kita perlu tools yang namanya mysqlfrm. Tools ini dapat membuatkan sintaks untuk CREATE TABLE dari file .frm pada folder data backup kita. Tools ini bisa kita unduh dari link:

https://downloads.mysql.com/archives/utilities/

Kita bisa unduh dan install di komputer kita. Setelah berhasil di-install, maka kita mendapatkan tools yang namanya mysqlfrm. Kita buka terminal baru, harus menggunakan akses administrator ya. Kita akses folder instalasinya di c:\program files\mysql\MySQL Utilities 1.6. Kita bisa coba panggil toolsnya mysqlfrm dan kita bisa melihat parameter apa saja yang dibutuhkan. Nah, untuk menjalankannya kita panggil seperti ini ya

mysqlfrm --server=root:root123@localhost c:\data\skysen\:con_course.frm --port=3307

Kalau mysqlfrm berfungsi dengan benar, maka kita akan mendapatkan perintah untuk CREATE TABLE con_course. Kita tinggal copy saja bagian create table-nya. Dan kita bisa paste ke terminal MySQL. Namun sebelum kita menjalankan perintah create table, saya hendak memperlihatkan terlebih dahulu isi dari folder data MySQL. Folder skysen masih kosong ya. Hanya ada file db.opt.

Setelah kita membuat table, maka MySQL membuat 2 buah file yaitu con_course.frm untuk struktur table, dan con_course.ibd untuk isi datanya. Namun kalau kita menjalankan perintah

select * from con_course

Maka belum ada datanya. Karena belum kita isi. Nah, untuk mengambil data dari file lama, pertama kita harus menghapus seluruh data pada tabel kita terlebih dahulu. Perintahnya adalah:

alter table con_course discard tablespace;

Perhatikan sekarang file con_course.ibd telah dihapus. Kita buka folder c:\data\skysen dan kita copy file data con_course.ibd ke MySQL kita yang sekarang. Kemudian kita suruh MySQL untuk membaca data dari file backup dengan perintah:

alter table con_course import tablespace;
select * from con_course;

Dan sekarang table con_course sudah ada data yang diambil dari database kita yang rusak. Kita coba ulangi ya prosesnya untuk table con_course_user. Pertama jalankan dahulu mysqlfrm.

mysqlfrm --server=root:root123@localhost c:\data\skysen\:con_course_user.frm --port=3307

Kita copy perintah create table ke MySQL. Lalu kita hapus tablespacenya.

alter table con_course_user discard tablespace;

Kita copy file con_course_user.ibd dari data lama ke data MySQL. Dan kita load kembali datanya menggunakan perintah

alter table con_course_user import tablespace;
select * from con_course_user;

Oke ya, sekarang datanya sudah berhasil di-recover. Kalau trik ini berhasil, kita tinggal mengulangi cara recovery ke semua tabel yang ada. Semoga cara ini bisa membantu teman-teman. Jangan lupa subscribe ke channel Skysen Solution untuk informasi terbaru dari kami dan sampai bertemu lagi di video berikutnya.

Dengan menggunakan fasilitas tanya jawab, maka Anda bisa bertanya dan akan dijawab langsung oleh instruktur kursus.

Anda belum terdaftar pada kursus ini sehingga tidak bisa mengajukan pertanyaan.