Backup intern
Teknisk guide til backup, PITR og gendannelse af Google Firestore databaser.
Der laves to typer af backup i Google Firestore:
- Point-In-Time Recovery (PITR)
- Ugentlig fuld backup
Point-In-Time Recovery (PITR) er en funktion i Google Firestore, der gør det muligt at gendanne databasen til et tidligere tidspunkt inden for en bestemt tidsramme.
PITR er aktiveret for vores database, og vi kan gendanne databasen eller dele af databasen til et hvilket som helst tidspunkt inden for de sidste 7 dage.
Ulempen ved PITR er, at recovery går tabt hvis databasen slettes fuldstændigt. Dette er årsagen til at vi også laver ugentlige fulde backups, der opbevares i Cloud Storage.
Gendan en backup
Du skal have installeret Google Cloud CLI på din computer for at kunne køre disse commands. Du kan også åbne Google Cloud CLI via Google Cloud Platform (altså online)
Gendan med PITR
Hvis du har brug for at gendanne databasen til et tidligere tidspunkt inden for de sidste 7 dage, kan du bruge PITR.
For at lave en fuld gendannelse, skal du først eksportere databasen fra et bestemt tidspunkt til en bucket:
gcloud firestore export gs://YOUR-BUCKET-NAME/backup-folder --database=DATABASE_ID --snapshot-time="2025-10-14T10:30:00Z"
Derefter skal destinationsdatabasen oprettes:
gcloud firestore databases create --database=NEW_DATABASE_ID --location=LOCATION --type=firestore-native
Hvorefter databasen kan importeres:
gcloud firestore import gs://YOUR-BUCKET-NAME/backup-folder/EXPORT_TIMESTAMP --database=NEW_DATABASE_ID
Du kan se hvor langt den er, ved at køre følgende command:
gcloud firestore operations list --database=DATABASE_NAME
Delvis gendannelse med PITR
Hvis du kun har brug for at gendanne en del af databasen, f.eks. et enkelt dokument eller en collection, kan PITR recovery også bruges til det.
Ved at lave queries i en `readOnly` transaction med `readTime` sat til det tidspunkt du vil gendanne til, kan du hente de data du har brug for.
Dette script kan anvendes i Firefoo:
async function run() {
const documentRef = db.collection('/content/61teGqCSW9xeELXAwSYM/pages').doc('0HudGXc6GHLT5UBf5uZR');
// Just view the old data
return await recoverDocument(documentRef, '2025-10-15T09:40:00Z');
// View AND restore
// return await recoverDocument(documentRef, '2025-10-14T10:30:00Z', true);
}
async function recoverDocument(documentRef, recoveryTime, restoreToDb = false){
try {
// Get version from the past
const readTime = admin.firestore.Timestamp.fromDate(new Date(recoveryTime));
const oldSnapshot = await db.runTransaction(
updateFunction => updateFunction.get(documentRef),
{ readOnly: true, readTime: readTime }
);
if (!oldSnapshot.exists) {
console.log('Document did not exist at recovery time');
return null;
}
const oldData = oldSnapshot.data();
// Just return the data if restoreToDb is false
if (!restoreToDb) {
console.log('Retrieved historical document data');
return oldData;
}
// Otherwise, restore it to the database
await documentRef.set(oldData);
console.log('Document restored successfully!');
return oldData;
} catch (error) {
console.error('Error during recovery:', error);
throw error;
}
}
Se mere her: https://firebase.google.com/docs/firestore/enterprise/use-pitr?authuser=0#node
Fuld disaster recovery Hvis hele databasen inkl PITR er blevet slettet, kan vores ugentlige fulde backups bruges til at gendanne databasen.
For at gendanne en backup, skal du bruge ID'et på den backup du vil gendanne. Du finder alle backups du kan gendanne ved at køre følgende command:
gcloud firestore backups list --format="table(name, database, state)" --project=attraction-prod
For derefter at gendanne den, skal du bruge følgende:
gcloud firestore databases restore --source-backup=BACKUP_LOCATION --destination-database="DESTINATION_DATABASE" ``` Erstat BACKUP_LOCATION med "Name" fra listen over backups, og DESTINATION_DATABASE
Erstat BACKUP_LOCATION med "Name" fra listen over backups, og DESTINATION_DATABASE med navnet på databasen du vil gendanne til. Du kan ikke gendanne til en eksisterende database, så det skal være en ny database.
Du kan ikke tilgå databasen før backuppen er gendannet helt.
Du kan se hvor langt den er, ved at køre følgende command:
gcloud firestore operations list --database=DATABASE_NAME
Erstat DATABASE_NAME med navnet på databasen du gendanner til, som hed DESTINATION_DATABASE i commanden over. Dokumentation fra Google: https://cloud.google.com/firestore/docs/backups