Petualangan MySQL: Pengelaman Mencari Tahu Penyebab Data Hilang dan Mengembalikannya

Bismillahirrohmaanirrohiim. Alhamdulillahi Robbil 'Alamiin. Allahumma Sholli 'Alaa Sayyidinaa Muhammad.

Saya baru saja mengalami petualangan yang tidak saya duga dengan database MySQL. Masalah ini cukup serius dan masalah ini bisa saja Anda alami.

Photo by Pixabay: https://www.pexels.com/photo/fire-fighter-wearing-black-and-yellow-uniform-pointing-for-something-70573/

Jadi, klien saya ada yang mengalami masalah cukup serius: data pada mayoritas kolom di tabel produknya hilang semua secara tiba-tiba. Entah bagaimana ceritanya, tetapi klien saya memiliki 2 tujuan yang menurut saya jelas: apa penyebab hal ini terjadi dan mengembalikan data produknya seperti sedia kala.

Mari saya jelaskan bagaimana saya menanganinya.

Mencari Tahu Penyebab Data Hilang

Untuk tujuan yang ini, saya pikir kita harus mengecek hal yang akan sangat membantu kita: log. Semua aktivitas yang terjadi dalam database, seharusnya memang dicatat di dalam log.

Berhubung database yang digunakan oleh klien saya adalah MySQL, kita bisa menggunakan statemen berikut untuk mendapatkan log-nya.

SELECT * FROM mysql.general_log;

Sayangnya, saya tidak bisa melakukan hal tersebut di server klien saya. Selain karena fitur ini tidak bisa diakses secara langsung oleh user database yang dimiliki klien saya, ternyata fitur ini juga tidak dinyalakan oleh penyedia layanan hosting.

Memang inilah kelemahan jika kita menggunakan shared hosting, kita tidak memiliki fleksibilitas untuk melakukan hal-hal semacam ini. Jadi, saya jelaskan ke klien saya mengenai masalah ini.

Sampai saat ini, saya dan klien saya masih belum mengetahui penyebab data hilang. Mission failed.

Mengembalikan Data Hilang

Untuk tujuan ini, saya mengabari klien saya bahwa saya bisa mengembalikan datanya asal ada backup. Saya sendiri memiliki backup data produk pada bulan Juni. Sudah lama sekali. Banyak produk baru yang tidak ada dalam backup yang saya miliki. Klien saya kurang nyaman dengan data ini.

Klien saya memiliki backup data pada bulan November. Sayangnya, backup data tersebut juga menyimpan data produk yang sudah kosong pada mayoritas kolomnya. Jadi, kita tidak bisa menggunakan data tersebut.

Beruntungnya, klien saya berhasil mendapatkan backup data yang lumayan lengkap isinya: backup pada bulan Oktober dari penyedia layanan hosting. Kami sepakat menggunakan data ini untuk di-restore.

Tetapi, tentu saya tidak serta-merta me-restore semua data dalam data backup tersebut. Jika langsung saya restore semua, kemungkinan besar semua data yang ada pada bulan November hilang semua. Ini tidak bagus untuk klien saya.

Bagaimana dengan me-restore tabel produknya saja? Tentu ini hal yang akan saya lakukan, tetapi saya khawatir dengan pengecekan foreign key dan hal semacamnya. Jadi, saya tidak langsung melakukan restore tabel produk.

Saya melakukan prosedur khusus: saya buat tabel temporary untuk produk, me-restore data produk ke tabel tersebut, kemudian meng-update data di tabel produk berdasar data yang ada di tabel temporary.

Pertama, saya menggunakan query berikut untuk menduplikasi struktur tabel produk (products) ke tabel baru bernama products_temp.

CREATE TABLE products_temp LIKE products;

Kemudian, saya menghilangkan atribut AUTO_INCREMENT pada tabel products_temp agar id yang saya restore nanti tidak kocar-kacir.

Selanjutnya, saya me-restore data dari data backup yang saya punya menggunakan query INSERT INTO .... Saya menggunakan bantuan DBeaver untuk meng-generate query tersebut.

Selanjutnya, saya melakukan update setiap kolom yang ada pada tabel products berdasar data pada tabel products_temp menggunakan dengan pola berikut.

UPDATE products SET
   name = (SELECT name FROM products_temp AS pt WHERE pt.id = products.id),
   stock = (SELECT stock  FROM products_temp AS pt WHERE pt.id = products.id)
WHERE deleted_at IS NULL

Sekarang, data produk klien saya sudah kembali semua. Ya, memang ada miss kurang dari 5 produk baru yang tidak ada dalam data backup. Tetapi, mayoritas data sudah bisa diakses seperti biasa.

Pelajaran yang Bisa Kita Ambil

1. Pahami Resiko Menggunakan Shared Hosting

Saat kita menggunakan layanan shared hosting, kita harus menyadari beberapa resiko yang akan muncul. Salah satunya adalah akses yang terbatas untuk melakukan hal-hal yang mungkin sangat kita butuhkan. Pada contoh kali ini, kami tidak bisa mengakses atau mengaktifkan fitur general_log yang ada pada MySQL.

Apabila kita menggunakan VPS, mungkin hal ini bisa kita atasi. Namun, jika kita menggunakan shared hosting, pastikan kita melakukan apa yang kita pelajari di poin 2, yaitu...

2. Backup Data Secara Berkala

Data hilang memang menyebalkan. Tetapi, semua akan lebih menyebalkan jika kita tidak bisa mengembalikan datanya. Di saat inilah backup data yang berkala kita lakukan menjadi penyelamat.

Kita bisa melakukan backup data secara otomatis. Jika tidak, kita bisa melakukannya secara manual. Apa pun cara yang kita gunakan, selalu pastikan kita melakukan backup data secara berkala.

Penutup

Semua hal yang saya ceritakan di atas bisa juga terjadi kepada Anda semua. Jadi, sebaiknya kita melakukan langkah-langkah untuk meminimalkan dampak negatif yang kita dapatkan. Apakah Anda pernah mengalami hal serupa? Bagaimana menurut Anda pencegahan dan penanganan yang baik?

Semoga kita semua selalu berbahagia dan beruntung.

Wallahul muwafiq ilaa aqwamith thooriq.

Referensi

Komentar

Postingan populer dari blog ini

Update dari Composer 1 ke Composer 2 di Ubuntu 20.04

Cara Mengatasi "Access denied for user 'root'@'localhost' (mysqli_real_connect(): (HY000/1698))" di Ubuntu 20.04 LTS

Cara Mengatasi "Login without a password is forbidden by configuration (see AllowNoPassword)" di Ubuntu 20.04 LTS