# MariaDB Mirror Tanpa Downtime Source (mariabackup)

Dokumen ini menggantikan metode `rsync /var/lib/mysql` langsung dari server source.

## Ringkasan Arsitektur

1. Source melakukan `mariabackup --backup` saat database tetap online.
2. Backup di-`prepare` di source sampai konsisten.
3. Mirror mengambil folder backup yang sudah `prepare`.
4. Mirror melakukan restore lokal (mirror boleh downtime, source tetap online).

## File Script

- `scripts/mariadb/source_mariabackup.sh`
- `scripts/mariadb/mirror_restore_latest.sh`

## Prasyarat

1. Paket `mariadb-backup` / `mariabackup` terpasang di source dan mirror.
2. `rsync`, `ssh`, `systemctl` tersedia.
3. Mirror bisa SSH ke source tanpa password (SSH key).
4. Script dijalankan sebagai `root`.

## Setup Source

### 1) Buat user backup MariaDB

```sql
CREATE USER 'backup'@'127.0.0.1' IDENTIFIED BY 'ganti_password_kuat';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'127.0.0.1';
FLUSH PRIVILEGES;
```

### 2) Buat file credential untuk mariabackup

File: `/etc/my.cnf.d/mariabackup.cnf`

```ini
[client]
user=backup
password=ganti_password_kuat
```

Permission:

```bash
chown root:root /etc/my.cnf.d/mariabackup.cnf
chmod 600 /etc/my.cnf.d/mariabackup.cnf
```

### 3) Deploy script backup source

```bash
install -m 750 scripts/mariadb/source_mariabackup.sh /usr/local/sbin/source_mariabackup.sh
```

## Setup Mirror

### 1) Deploy script restore mirror

```bash
install -m 750 scripts/mariadb/mirror_restore_latest.sh /usr/local/sbin/mirror_restore_latest.sh
```

### 2) Set environment variable saat eksekusi

Contoh minimal:

```bash
SOURCE_HOST=192.168.61.1 SOURCE_SSH_USER=root /usr/local/sbin/mirror_restore_latest.sh
```

## Cron Contoh

### Cron di source (backup online)

Jam 01:00 tiap hari:

```cron
0 1 * * * /usr/local/sbin/source_mariabackup.sh >> /var/log/source_mariabackup.cron.log 2>&1
```

### Cron di mirror (pull + restore)

Jam 01:40 tiap hari (beri jeda agar backup source selesai):

```cron
40 1 * * * SOURCE_HOST=192.168.61.1 SOURCE_SSH_USER=root /usr/local/sbin/mirror_restore_latest.sh >> /var/log/mirror_restore_mariadb.cron.log 2>&1
```

## Uji Manual Pertama Kali

1. Jalankan script source:

```bash
/usr/local/sbin/source_mariabackup.sh
```

2. Pastikan folder latest ada:

```bash
ls -lah /backup/mariadb/latest
```

3. Jalankan script mirror:

```bash
SOURCE_HOST=192.168.61.1 SOURCE_SSH_USER=root /usr/local/sbin/mirror_restore_latest.sh
```

4. Verifikasi MariaDB di mirror:

```bash
systemctl status mariadb --no-pager
mysql -e "SHOW DATABASES;"
```

## Catatan Penting

1. Jangan lagi `rsync` langsung datadir live (`/var/lib/mysql`) saat MariaDB berjalan.
2. `FLUSH TABLES WITH READ LOCK` tidak cukup untuk copy file-level InnoDB yang aman.
3. Source tetap online dengan pendekatan ini, tetapi mirror akan restart saat restore.
