Files
2026-09-11 16:03:00 +07:00

2.3 KiB

Cutover database production lama ke V2

Proses ini bersifat satu arah: database lama hanya dibaca, sedangkan database V2 wajib kosong saat bootstrap. ID dan seluruh isi tabel lama dipertahankan, kemudian migration aplikasi dijalankan hanya pada database V2.

Pengamanan

  • Jalankan melalui CLI; endpoint web ditolak.
  • Kredensial hanya melalui environment variable dan tidak disimpan di repository.
  • Kedua koneksi diuji sebelum target ditulis.
  • Bootstrap ditolak jika sumber dan target sama atau target sudah berisi objek.
  • Snapshot memakai consistent read-only transaction.
  • Backup dapat diberi SHA-256 agar file yang salah tidak dapat diimpor.
  • Kode akun dinormalisasi menjadi tepat empat digit oleh migration aplikasi.

Environment variable

DBSYNC_ENABLED=true
DBSYNC_SOURCE_HOST=
DBSYNC_SOURCE_PORT=3306
DBSYNC_SOURCE_USERNAME=
DBSYNC_SOURCE_PASSWORD=
DBSYNC_SOURCE_DATABASE=
DBSYNC_TARGET_HOST=
DBSYNC_TARGET_PORT=3306
DBSYNC_TARGET_USERNAME=
DBSYNC_TARGET_PASSWORD=
DBSYNC_TARGET_DATABASE=
DBSYNC_BACKUP_DIRECTORY=C:\xampp\private_backups\accounting_dev

Opsional untuk memakai snapshot yang sudah tersedia:

DBSYNC_BACKUP_FILE=C:\path\snapshot.sql
DBSYNC_BACKUP_SHA256=checksum_snapshot
DBSYNC_MYSQL_BIN=C:\xampp\mysql\bin\mysql.exe

Perintah

php index.php databasesync check
php index.php databasesync snapshot
php index.php databasesync bootstrap
php index.php databasesync verify

bootstrap otomatis membuat snapshot jika DBSYNC_BACKUP_FILE tidak diisi, mengimpor snapshot ke target kosong, menjalankan seluruh migration, dan melakukan audit akhir.

Cutover production sebenarnya

  1. Uji check dan pastikan target kosong.
  2. Aktifkan maintenance/read-only pada aplikasi lama agar tidak ada transaksi baru selama snapshot akhir.
  3. Jalankan bootstrap satu kali.
  4. Pastikan verify berhasil: migration terbaru, semua kode akun empat digit, jurnal balance, dan tidak ada orphan utama.
  5. Ubah konfigurasi aplikasi ke database V2, lakukan smoke test login/laporan/transaksi, lalu buka maintenance.

Cron sinkronisasi tabel-ke-tabel tidak digunakan karena struktur lama dan V2 berbeda dan berisiko menimpa hasil normalisasi. Jika downtime nol benar-benar diperlukan, siapkan CDC/outbox sebagai proyek terpisah; jangan menjalankan kedua aplikasi menulis ke database berbeda tanpa mekanisme konflik.