Cadangan basis data
Cara menjadwalkan dump MySQL dan PostgreSQL, memindahkannya keluar dari mesin, dan memverifikasi bahwa cadangan benar-benar dapat dipulihkan.
Diperbarui 23 Agustus 2026
VPS tidak dilengkapi dengan backup mesin otomatis atau snapshot status: apa pun yang belum Anda salin sendiri hanya ada dalam satu instance. Dump database adalah hal pertama yang harus Anda siapkan, karena tidak ada tempat untuk memulihkan data, sementara situs dapat di-deploy ulang dari awal.
Dump manual
PostgreSQL:
pg_dump -Fc -U shop -h 127.0.0.1 shop > /srv/backups/shop-$(date +%F).dump
pg_dumpall -U postgres --roles-only > /srv/backups/roles.sql
MySQL dan MariaDB:
mysqldump --single-transaction --quick --routines --events \
-u root shop | gzip > /srv/backups/shop-$(date +%F).sql.gz
--single-transaction menghasilkan dump InnoDB yang konsisten tanpa mengunci tabel — tanpanya, situs Anda akan macet selama proses ekspor. Format -Fc PostgreSQL terkompresi dan memungkinkan Anda memulihkan tabel individual.
Jangan letakkan kata sandi di command line: buat ~/.pgpass atau ~/.my.cnf dengan izin 600.
Terjadwal
mkdir -p /srv/backups && chmod 700 /srv/backups
crontab -e
20 3 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1
Skrip /usr/local/bin/db-backup.sh:
#!/bin/bash
set -euo pipefail
DEST=/srv/backups
STAMP=$(date +%F-%H%M)
pg_dump -Fc -U shop -h 127.0.0.1 shop > "$DEST/shop-$STAMP.dump.tmp"
mv "$DEST/shop-$STAMP.dump.tmp" "$DEST/shop-$STAMP.dump"
find "$DEST" -name '*.dump' -mtime +14 -delete
Menulis ke file sementara lalu mengganti namanya itu penting: jika dump terputus, Anda tidak akan salah mengira file yang terpotong sebagai backup lengkap. set -euo pipefail menghentikan skrip pada error pertama alih-alih melanjutkan secara diam-diam.
Pindahkan backup keluar dari mesin
Salinan di disk yang sama tidak akan menyelamatkan Anda dari kesalahan migrasi, ransomware, atau instalasi ulang OS di tab "Access". Kirim dump ke luar lokasi:
rsync -az --delete /srv/backups/ backup@other-host:/store/vds/
Atau ke penyimpanan apa pun yang kompatibel dengan S3 melalui rclone. Perlu diingat bandwidth hingga 500 Mbit/s dan batas penulisan disk per tier: 60 MB/s per core.
Pemeriksaan pemulihan
Backup yang belum pernah Anda pulihkan bukanlah backup.
createdb -U postgres shop_check
pg_restore -U postgres -d shop_check /srv/backups/shop-2026-08-23.dump
psql -U postgres -d shop_check -c "SELECT count(*) FROM users;"
dropdb -U postgres shop_check
Untuk MySQL: gunzip -c dump.sql.gz | mysql -u root shop_check.
Lakukan ini sebulan sekali dan catat tanggal pemeriksaannya.
Kesalahan umum
| Gejala | Penyebab |
|---|---|
| Dump hanya beberapa kilobyte | Skrip gagal saat autentikasi, dan error-nya masuk ke /dev/null |
| Ruang disk habis | Tidak ada penghapusan backup lama berdasarkan mtime |
| Pemulihan gagal pada izin | Role tidak di-dump — Anda perlu --roles-only |
| Cron senyap, tidak ada backup | Cron tidak memiliki PATH Anda — gunakan path absolut |
| Situs melambat di malam hari | Dump bersaing untuk disk — geser waktunya, tambahkan --quick |
Simpan setidaknya dua salinan di lokasi berbeda dan pantau ukuran dump: penurunan ukuran yang tajam berarti tidak seluruh database di-dump.