Backup, Restore, dan Kebiasaan Baik di Dunia Kerja
Mencadangkan database dengan mysqldump, memulihkannya, menguji hasilnya dengan query verifikasi, serta kumpulan praktik baik: charset, migrasi, slow query log, dan checklist produksi.
Aturan nomor satu di dunia database
Ada dua jenis orang: yang sudah kehilangan data, dan yang akan kehilangan data. Disk rusak, salah DROP, ransomware, bug aplikasi — semua bisa terjadi. Satu-satunya penolong adalah backup yang terbukti bisa dipulihkan.
Backup yang belum pernah diuji restore itu hanya harapan, bukan backup. Jadwalkan uji restore berkala di server percobaan.
mysqldump: backup logis
mysqldump adalah program (bukan perintah SQL; dijalankan di terminal) yang mengekspor database menjadi berkas teks berisi perintah CREATE TABLE dan INSERT.
# backup satu database
mysqldump -u root -p tokoku > tokoku_2024-06-30.sql
# backup konsisten untuk tabel InnoDB tanpa mengunci aplikasi
mysqldump -u root -p --single-transaction --routines --triggers tokoku > tokoku.sql
# beberapa tabel saja
mysqldump -u root -p tokoku produk pelanggan > sebagian.sql
# semua database + dikompres
mysqldump -u root -p --all-databases | gzip > semua.sql.gz
Restore: memulihkan
# ke database yang sudah dibuat kosong
mysql -u root -p -e "CREATE DATABASE tokoku_pulih"
mysql -u root -p tokoku_pulih < tokoku_2024-06-30.sql
# dari berkas gzip
gunzip < semua.sql.gz | mysql -u root -p
Strategi backup yang waras
- Otomatis & terjadwal (cron di Linux) — backup manual pasti terlupa.
- Aturan 3-2-1: 3 salinan data, di 2 jenis media berbeda, 1 di lokasi lain (cloud / kantor lain).
- Beri tanggal pada nama berkas, simpan beberapa generasi (harian 7 hari, mingguan 4 minggu, bulanan 12 bulan).
- Binary log (binlog) memungkinkan point-in-time recovery: memulihkan sampai detik sebelum bencana.
- Untuk database sangat besar ada backup fisik (Percona XtraBackup, MySQL Enterprise Backup); layanan cloud (RDS, Cloud SQL) menyediakan snapshot otomatis.
Menguji hasil restore dengan SQL
Setelah restore, bandingkan database asli dan hasil pulih. Cara cepat: hitung jumlah baris tiap tabel utama.
SELECT 'produk' AS tabel, COUNT(*) AS jumlah_baris FROM produk
UNION ALL
SELECT 'pelanggan', COUNT(*) FROM pelanggan
UNION ALL
SELECT 'pesanan', COUNT(*) FROM pesanan
ORDER BY tabel;
Jalankan di kedua database; angkanya harus sama. Untuk pemeriksaan lebih ketat: CHECKSUM TABLE produk; atau membandingkan total SUM(total) penjualan.
Ekspor-impor CSV
SELECT * FROM produk INTO OUTFILE '/var/lib/mysql-files/produk.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/var/lib/mysql-files/produk.csv' INTO TABLE produk
FIELDS TERMINATED BY ',' ENCLOSED BY '"';
Checklist kebiasaan baik
| Area | Kebiasaan |
|---|---|
| Desain | Primary key di setiap tabel; tipe data tepat; utf8mb4; kolom created_at/updated_at |
| Perubahan struktur | Lewat migrasi yang tercatat di Git (Laravel Migration, Flyway, dll.), bukan klik manual di produksi |
| Query | Hindari SELECT * di aplikasi; selalu LIMIT/pagination; cek dengan EXPLAIN |
| Performa | Aktifkan slow query log untuk menemukan query lambat; pasang index yang tepat |
| Perubahan data manual | Dalam transaksi; SELECT dulu; ada backup |
| Keamanan | User khusus per aplikasi dengan hak minimal; password kuat; TLS |
| Pemantauan | Perhatikan ruang disk, koneksi, dan replikasi; atur alert |