Skip to content

Migrasi Metabase dan Database db_services

Tujuan

Bab ini mendokumentasikan prosedur migrasi lingkungan Metabase dan database db_services dari server lama ke server baru Kesehatan.io.

Prosedur ini disusun hanya berdasarkan langkah yang berhasil dan dapat digunakan sebagai runbook resmi.


Lingkungan Tujuan

Item Nilai
Server baru 72.62.122.41
Sistem operasi Ubuntu 24.04 LTS
Folder Metabase /opt/metabase
Metabase Docker Compose
Database aplikasi Metabase MariaDB container
Database analitik db_services
Domain https://metabase.kesehatan.io

1. Backup Database di Server Lama

Masuk ke server lama:

ssh root@SERVER_LAMA

Buat dump database:

mysqldump \
  --default-character-set=utf8mb4 \
  --single-transaction \
  --quick \
  --routines \
  --triggers \
  db_services \
  > /root/db_services.sql

Periksa ukuran file:

ls -lh /root/db_services.sql

Kompres file:

gzip /root/db_services.sql

Hasil:

/root/db_services.sql.gz

2. Transfer ke Server Baru

Dari server lama:

scp /root/db_services.sql.gz \
  root@72.62.122.41:/root/

Masuk ke server baru:

ssh root@72.62.122.41

Periksa file:

ls -lh /root/db_services.sql.gz

Ekstrak:

gunzip /root/db_services.sql.gz

Pastikan file tidak kosong:

ls -lh /root/db_services.sql

3. Backup Dump Asli

Sebelum modifikasi, simpan salinan asli:

cp /root/db_services.sql \
   /root/db_services_original.sql

!!! warning Jangan pernah memodifikasi dump asli tanpa backup.


4. Penyesuaian Tabel Sangat Lebar

Beberapa tabel survei memiliki ratusan kolom TEXT dan gagal dibuat dengan InnoDB karena batas ukuran baris.

Error yang muncul:

ERROR 1118 (42000): Row size too large (> 8126)

Tabel yang perlu menggunakan MyISAM adalah seluruh tabel dengan prefix:

tbl_ocsea
tbl_ss_puskesmas

Gunakan proses streaming agar file besar tidak dimuat seluruhnya ke memori:

awk '
/^CREATE TABLE `/ {
    target = 0

    if ($0 ~ /^CREATE TABLE `tbl_ocsea/ ||
        $0 ~ /^CREATE TABLE `tbl_ss_puskesmas/) {
        target = 1
    }
}

{
    if (target == 1 && $0 ~ /ENGINE=InnoDB/) {
        sub(/ENGINE=InnoDB/, "ENGINE=MyISAM")
        sub(/[[:space:]]+ROW_FORMAT=[A-Za-z0-9_]+/, "")
        target = 0
    }

    print
}
' /root/db_services.sql > /root/db_services_fixed.sql

Periksa ukuran file:

ls -lh \
  /root/db_services.sql \
  /root/db_services_fixed.sql

Jika ukurannya wajar dan tidak kosong:

mv /root/db_services_fixed.sql \
   /root/db_services.sql

Verifikasi engine:

awk '
/^CREATE TABLE `tbl_ocsea/ ||
/^CREATE TABLE `tbl_ss_puskesmas/ {
    table=$0
}
/ENGINE=/ {
    if (table != "") {
        print table
        print $0
        print ""
        table=""
    }
}
' /root/db_services.sql

Semua tabel target harus menunjukkan:

ENGINE=MyISAM

!!! warning Jangan mengubah tabel Moodle menjadi MyISAM. Beberapa tabel Moodle memiliki indeks VARCHAR(255) dengan utf8mb4 dan akan memicu ERROR 1071.


5. Menghapus DEFINER Lama

Dump dapat memiliki objek VIEW dengan akun lama, misalnya:

DEFINER='hmukri'@'10.10.5.19'

Jika akun tersebut tidak ada di server baru, import akan gagal:

ERROR 1449: The user specified as a definer does not exist

Buat file tanpa DEFINER:

sed -E \
  -e 's/DEFINER=`[^`]+`@`[^`]+`//g' \
  -e "s/DEFINER='[^']+'@'[^']+'//g" \
  /root/db_services.sql \
  > /root/db_services_no_definer.sql

Periksa ukuran file:

ls -lh \
  /root/db_services.sql \
  /root/db_services_no_definer.sql

Pastikan tidak ada DEFINER tersisa:

grep -n -m 10 "DEFINER=" \
  /root/db_services_no_definer.sql

Jika tidak ada output:

mv /root/db_services_no_definer.sql \
   /root/db_services.sql

6. Membuat Database Tujuan

mysql -e "
DROP DATABASE IF EXISTS db_services;
CREATE DATABASE db_services
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
"

7. Import Database

mysql \
  --default-character-set=utf8mb4 \
  db_services \
  < /root/db_services.sql \
  2> /root/db_services_import_error.log

Simpan status import segera:

IMPORT_STATUS=$?
echo "Status import: $IMPORT_STATUS"

Lihat log:

cat /root/db_services_import_error.log

Kondisi sukses:

Status import: 0

dan file log kosong.


8. Validasi Hasil Import

Cek jumlah tabel:

mysql -e "
SELECT COUNT(*) AS total_tables
FROM information_schema.tables
WHERE table_schema = 'db_services';
"

Cek jumlah view:

mysql -e "
SELECT COUNT(*) AS total_views
FROM information_schema.views
WHERE table_schema = 'db_services';
"

Hasil migrasi yang tervalidasi:

Objek Jumlah
Tabel 617
View 65
Routine 0
Trigger 0

Cek integritas:

mysqlcheck db_services

9. Membuat User Metabase

Masuk ke MariaDB atau MySQL yang menjadi sumber data Metabase:

mysql -u root -p

Buat user read-only:

CREATE USER IF NOT EXISTS 'metabase_user'@'%'
IDENTIFIED BY 'PASSWORD_DB_METABASE';

GRANT SELECT, SHOW VIEW
ON db_services.*
TO 'metabase_user'@'%';

FLUSH PRIVILEGES;

Verifikasi:

SELECT user, host
FROM mysql.user
WHERE user = 'metabase_user';

SHOW GRANTS FOR 'metabase_user'@'%';

10. Konfigurasi Koneksi di Metabase

Gunakan tipe database:

MySQL

Parameter:

Field Nilai
Display name Dataviz
Host mariadb atau host database yang dapat dijangkau container
Port 3306
Database name db_services
Username metabase_user
Password lihat dokumen credential internal
SSL Off, kecuali dikonfigurasi khusus
SSH Tunnel Off

Database berada di Docker Compose yang sama

Gunakan:

Host: mariadb

Database berada di host server

Jangan gunakan:

127.0.0.1

karena dari dalam container, alamat tersebut menunjuk ke container Metabase sendiri.

Gunakan salah satu:

host.docker.internal

atau IP gateway Docker.


11. Error Umum

Unknown database 'db_services'

Penyebab:

Metabase terhubung ke MariaDB container, tetapi database db_services diimport ke MySQL host.

Solusi:

  • import database ke MariaDB container; atau
  • arahkan Metabase ke MySQL host.

Specified key was too long

Penyebab:

Tabel dengan indeks panjang diubah menjadi MyISAM.

Solusi:

Kembalikan tabel normal, khususnya tabel Moodle, ke InnoDB.

Row size too large

Penyebab:

Tabel survei sangat lebar menggunakan InnoDB.

Solusi:

Ubah hanya keluarga tbl_ocsea* dan tbl_ss_puskesmas* menjadi MyISAM.


12. Checklist Migrasi

  • [ ] Dump dibuat dari server lama
  • [ ] Dump ditransfer ke server baru
  • [ ] Dump asli dibackup
  • [ ] Tabel lebar disesuaikan
  • [ ] DEFINER lama dihapus
  • [ ] Database tujuan dibuat ulang
  • [ ] Import selesai dengan status 0
  • [ ] Log import kosong
  • [ ] Jumlah tabel tervalidasi
  • [ ] Jumlah view tervalidasi
  • [ ] User metabase_user dibuat
  • [ ] Metabase berhasil terkoneksi
  • [ ] Dashboard diuji

13. File Penting

/root/db_services_original.sql
/root/db_services.sql
/root/db_services_import_error.log
/opt/metabase/docker-compose.yml
/opt/metabase/.env

14. Catatan Keamanan

Credential lengkap hanya disimpan di:

docs/04-credentials.md

Versi sanitized tidak boleh memuat password asli.