Skip to content
VDS · Basis data

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

GejalaPenyebab
Dump hanya beberapa kilobyteSkrip gagal saat autentikasi, dan error-nya masuk ke /dev/null
Ruang disk habisTidak ada penghapusan backup lama berdasarkan mtime
Pemulihan gagal pada izinRole tidak di-dump — Anda perlu --roles-only
Cron senyap, tidak ada backupCron tidak memiliki PATH Anda — gunakan path absolut
Situs melambat di malam hariDump 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.