Back to blog
Database

Expand-Contract Migration: Cara Ganti Nama Kolom Database Tanpa Bikin API Down

Budi mengganti nama kolom 'nama' menjadi 'full_name' langsung di database production dengan satu perintah ALTER TABLE. Sedetik kemudian, seluruh API miliknya mati total.

super admin·02 September 2026·2 min read
Expand-Contract Migration: Cara Ganti Nama Kolom Database Tanpa Bikin API Down
Article Content

Bayangin Budi Mengganti Nama Kolom Langsung di Production...

Bayangin Budi merasa nama kolom nama di tabel users kurang jelas, dan ingin menggantinya menjadi full_name. Karena terburu-buru, Budi langsung menjalankan satu perintah di database production:

ALTER TABLE users RENAME COLUMN nama TO full_name;

Query-nya sukses dalam sepersekian detik. Tapi detik berikutnya, seluruh API Budi mulai melempar error column "nama" does not exist secara massal — karena kode aplikasi yang sedang berjalan di server (yang belum sempat di-deploy ulang dengan kode terbaru) masih menulis query SELECT nama FROM users. Database dan kode aplikasi jadi tidak sinkron selama beberapa menit yang menyakitkan.

Masalahnya: Perubahan Skema dan Perubahan Kode Tidak Pernah Terjadi di Detik yang Persis Sama

Proses deployment aplikasi modern (apalagi dengan banyak instance/container) selalu punya jeda: migrasi database dijalankan duluan, baru kode baru menyusul menyala satu per satu. Kalau migrasi langsung menghapus atau mengubah nama sesuatu yang masih dipakai kode versi lama, akan selalu ada jendela waktu di mana keduanya bentrok.

Nah, Di Sinilah Pola 'Expand-Contract Migration' Masuk!

Alih-alih mengubah dalam satu langkah, ubah skema secara bertahap dalam beberapa kali deploy terpisah:

  1. Expand (Perluas): Tambahkan kolom baru full_name tanpa menghapus kolom lama nama. Deploy kode yang menulis ke kedua kolom sekaligus setiap kali ada perubahan data, sambil masih membaca dari kolom lama. Database sekarang punya dua kolom yang isinya sinkron.
  2. Migrate (Pindahkan data lama): Jalankan skrip satu kali untuk menyalin data historis dari nama ke full_name untuk baris-baris yang sudah ada sebelum kolom baru ditambahkan.
  3. Contract (Persempit): Setelah yakin semua instance aplikasi sudah memakai kode terbaru yang membaca dari full_name, deploy versi kode yang berhenti menyentuh nama sama sekali.
  4. Cleanup: Barulah di migrasi terpisah berikutnya, kolom nama yang sudah benar-benar tidak dipakai boleh dihapus dengan DROP COLUMN.

Intinya: Setiap kali sebuah kolom atau tabel masih mungkin dibaca oleh kode versi lama yang sedang berjalan, jangan pernah menghapus atau me-rename-nya secara langsung. Tambah dulu yang baru, pastikan semua kode sudah pindah, baru bersihkan yang lama — proses yang lebih lama, tapi tidak ada satu pun pengguna yang merasakan downtime.

Mau langsung pakai template?

Jelajahi template gratis dan premium di TampilKit untuk mempercepat proses development project kamu.

Browse Templates