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