Selama lebih dari sebulan, saya percaya penuh bahwa project ini punya backup harian yang jalan dengan baik. Ada cron job yang menyalin database setiap dini hari, filenya bertambah setiap hari, semua terlihat normal. Sampai suatu proses pemulihan memaksa saya membuka isi backup-backup itu satu per satu — dan ternyata semuanya sama persis. Setiap hari, selama lebih dari 30 hari berturut-turut.
Backup-nya tidak pernah rusak. Backup-nya juga tidak pernah gagal berjalan. Masalahnya lebih halus dari itu: backup-nya menyalin kondisi yang sama, berulang-ulang, tanpa pernah benar-benar menangkap data terbaru.
Bagaimana ini bisa terjadi?
Database yang dipakai Qata (SQLite) punya mode penulisan yang disebut WAL — cara kerja yang membuat tulisan baru sering disimpan sementara di file terpisah sebelum akhirnya digabung ke file utama. Penggabungan ini biasanya terjadi otomatis, tapi tidak selalu — tergantung seberapa sering aplikasi menulis data.
Proses backup saya, sialnya, hanya menyalin file utama begitu saja. Kalau penggabungan otomatis itu kebetulan belum terjadi saat backup berjalan, yang tersalin ya kondisi lama. Dan karena tidak ada mekanisme yang memaksa penggabungan sebelum menyalin, kondisi "lama" itu jadi konsisten terus — bukan karena filenya rusak, tapi karena tidak ada yang pernah memicu pembaruan sebelum backup diambil.
Yang membuat ini berbahaya bukan errornya — justru karena tidak ada error sama sekali. Semuanya terlihat berjalan normal. Tidak ada notifikasi merah, tidak ada log gagal. Backup diam-diam berhenti berguna.
Masalah ini baru terungkap saat saya benar-benar butuh salah satu backup itu — setelah proses pemulihan database yang tidak berjalan mulus, dan ada satu tulisan yang sempat hilang. Waktu itulah saya sadar: backup yang saya andalkan selama sebulan lebih ternyata cuma menyimpan satu titik waktu yang sama, berulang.
Untungnya, titik waktu itu masih cukup jauh sebelum insiden terjadi, jadi datanya sendiri masih bisa saya selamatkan. Tapi kalau insidennya terjadi di waktu yang berbeda, atau kalau titik waktu backup yang beku itu justru setelah data penting dibuat, ceritanya bisa jauh lebih buruk.
Pelajaran terbesarnya sederhana: backup yang belum pernah dicoba untuk dipulihkan bukanlah backup yang bisa diandalkan — itu baru asumsi.
Beberapa hal yang sekarang saya terapkan:
- Proses backup memaksa penggabungan data terlebih dahulu sebelum menyalin apa pun, jadi tidak lagi bergantung pada kebetulan.
- Setiap backup yang selesai dibuat langsung diperiksa isinya — bukan sekadar dicek apakah filenya ada.
- Kalau ada tanda-tanda jumlah data tiba-tiba berkurang dibanding backup sebelumnya, itu langsung tercatat sebagai peringatan, bukan dibiarkan lewat begitu saja.
- Dan yang paling penting: saya sudah mencoba proses pemulihannya secara langsung, bukan cuma percaya bahwa "kalau dibutuhkan nanti pasti bisa."
Qata dibangun sebagai proyek belajar sambil jalan, dan insiden seperti ini — meski bikin jantung berdebar sesaat — justru salah satu bagian paling berharga dari prosesnya. Kadang kita baru benar-benar mengerti sebuah sistem setelah sistem itu gagal dengan caranya sendiri yang khas.
Kalau ada yang sedang mengelola sistem serupa: coba luangkan waktu sesekali untuk benar-benar membuka backup kamu, bukan cuma melihat apakah prosesnya "selesai tanpa error". Kadang yang paling berbahaya bukan proses yang gagal — tapi proses yang berhasil dengan cara yang salah.