Skip to main content

Upload Backup Data and Manage Snapshots

Use Backup() on the dump file or the whole db-dumps directory. For daily jobs, keep one stable dump path (for example ./db-dumps/app.dump or ./db-dumps/app.sql) and overwrite that file each day before calling Backup().

snapshot, err := client.Backup([]string{"./db-dumps"}, &backup.BackupOptions{
Description: "nightly database backup",
Tags: map[string]string{
"type": "db-backup",
"env": "prod",
"db": "app_db",
},
Hostname: "backup-runner-01",
})
if err != nil {
log.Fatal(err)
}

log.Printf("snapshotId=%s totalSize=%d chunks=%d", snapshot.SnapshotID, snapshot.TotalSize, snapshot.TotalChunks)

Tip: using a fixed filename in the dump directory enables dedup-friendly uploads while still creating a fresh snapshot each day.

List recent snapshotsโ€‹

resp, err := client.ListSnapshots("", 20)
if err != nil {
log.Fatal(err)
}
for _, s := range resp.Snapshots {
log.Printf("id=%s createdAt=%d desc=%s size=%d", s.SnapshotID, s.CreatedAt, s.Description, s.TotalSize)
}

Inspect one snapshotโ€‹

s, err := client.GetSnapshot("snapshot-id")
if err != nil {
log.Fatal(err)
}
log.Printf("rootTreeHash=%s paths=%v tags=%v", s.RootTreeHash, s.Paths, s.Tags)

Prune snapshotsโ€‹

import "time"

before := time.Now().AddDate(0, 0, -30).UTC().Format(time.RFC3339)

pruned, err := client.PruneSnapshots(backup.PruneRequest{
KeepLatest: backup.IntPtr(14),
Before: before,
DryRun: false,
})
if err != nil {
log.Fatal(err)
}
log.Printf("pruned snapshots=%d", pruned.Count())

Delete one snapshotโ€‹

err = client.DeleteSnapshot("snapshot-id")
if err != nil {
log.Fatal(err)
}

Restore a snapshot (recovery drill)โ€‹

err = client.Restore("snapshot-id", "./restore-check", nil)
if err != nil {
log.Fatal(err)
}

Then restore DB from dump:

  • PostgreSQL: pg_restore ... ./restore-check/db-dumps/your.dump
  • MySQL: mysql ... < ./restore-check/db-dumps/your.sql