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_userdibuat - [ ] 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.