OffVPSOFFSHORE VPSOndersteuning

Draaiende houden

Een back-up is een vraag. Een restore geeft het antwoord.

Een bruikbare back-up moet de database en de bestanden waarnaar deze verwijst kunnen terugzetten. Bewijs die relatie op een geïsoleerd doel voordat u er tijdens een incident op vertrouwt.

OffVPS veldgids · Beoordeeld · 5 min leestijd

Houd de eerste oefening bewust klein

Deze oefening maakt een speelgoed-notitiedatabase en één bijlage aan, legt beide vast en zet ze vervolgens terug in een nieuwe database en map. Gebruik een wegwerpbare Linux-machine met PostgreSQL 17-server en bijbehorende client-hulpprogramma's, Bash en GNU coreutils. Deze mag geen productiegegevens bevatten en geen verbinding hebben met productietoepassingen, uitgaande mail of geplande taken. Gebruik alleen het archief dat in deze oefening is gemaakt.

De commando's gaan uit van een vooraf geconfigureerde, niet-superuser databaserol met de naam restore_lab, die testdatabases mag aanmaken, en een OS-login met dezelfde naam die lokaal kan authenticeren. De PostgreSQL-socket is /var/run/postgresql op poort 5432. Laat de beheerder dat account in de wegwerpomgeving voorbereiden; deze handleiding wijzigt geen regels voor databasetoegang. Controleer het eindpunt voordat u iets aanmaakt:

psql -h /var/run/postgresql -p 5432 -U restore_lab -d postgres -c '\conninfo' &&
pg_dump --version &&
pg_restore --version

Stop als de host, het account of de versie onverwacht is. Houd clients en server op dezelfde hoofdversie voor deze eerste oefening. pg_dump kan geen server dumpen die nieuwer is dan zijn eigen hoofdversie, en een ouder hersteldoel is over het algemeen niet gegarandeerd compatibel. Zie pg_dump versielimieten. Voer elk blok afzonderlijk uit en stop bij een fout. De && -guards voorkomen dat latere commando's in een geplakt blok na een fout worden uitgevoerd; ga nooit verder naar het volgende blok na een mislukte database- of mapaanmaak.

Maak een record en het bijbehorende bestand aan

De namen offvps_restore_source en offvps_restore_target mogen niet in gebruik zijn. Een bestaande database is een reden om te stoppen en een nieuwe geïsoleerde oefening te kiezen, niet een reden om deze te droppen. Maak een nieuwe bestandssysteemwerkruimte en de brondatabase aan:

umask 077 &&
lab=$(mktemp -d "$PWD/offvps-restore.XXXXXX") &&
mkdir "$lab/source" "$lab/source/uploads" "$lab/bundle" "$lab/restore" &&
createdb -h /var/run/postgresql -p 5432 -U restore_lab \
  --template=template0 offvps_restore_source

De nieuwe werkruimte voorkomt overschrijven van een bestaande map. mktemp maakt een unieke map aan; createdb maakt een nieuwe database aan op basis van de geselecteerde template. Bewaar deze twee markeringen:

psql -X -v ON_ERROR_STOP=1 -h /var/run/postgresql -p 5432 \
  -U restore_lab -d offvps_restore_source \
  -c "CREATE TABLE notes (
        id integer PRIMARY KEY,
        body text NOT NULL,
        attachment text NOT NULL
      );
      INSERT INTO notes VALUES (1, 'restore-marker-01', 'marker.txt');" &&
printf '%s\n' 'restore-marker-01' > "$lab/source/uploads/marker.txt"

Het record geeft aan welk bestand bij de notitie hoort, en beide bevatten dezelfde markering. Zo wordt een ontbrekende bijlage of een niet-overeenkomende kopie zichtbaar. -X voorkomt persoonlijke psql-opstartinstellingen en ON_ERROR_STOP stopt bij een SQL-fout; zie psql-scriptingopties. Er is geen toepassing die naar deze speelgoeddataset schrijft.

Leg de database en bestanden vast als één herstelset

pg_dump -h /var/run/postgresql -p 5432 -U restore_lab \
  --format=custom --file="$lab/bundle/notes.dump" offvps_restore_source &&
cp -a "$lab/source/uploads" "$lab/bundle/uploads" &&
pg_restore --list "$lab/bundle/notes.dump"

Het archief in aangepast formaat wordt gelezen door pg_restore; een gewone SQL-dump volgt een andere herstelprocedure. Het archief weergeven helpt bevestigen dat de verwachte tabel- en gegevensitems aanwezig zijn. Een consistente databasedump synchroniseert externe uploads niet automatisch. Gebruik voor een echte app de gedocumenteerde onderhouds- of schrijf-pauzeprocedure, zodat de bestandsstructuur en de database hetzelfde tijdstip beschrijven. De speelgoedoefening is al stil.

Noteer de databaseversie, applicatierelease, start/eind van de vastlegging en het bestandspad naast de bundel. Bewaar echte inloggegevens apart onder passende toegangscontroles. Een dump per database legt geen globale rollen en tablespaces vast; een echt herstelplan moet ook daarmee rekening houden. Het bereik wordt beschreven in PostgreSQL's SQL-dumpgids.

Zet terug naar nieuwe doelen zonder een bestaand doel op te schonen

createdb -h /var/run/postgresql -p 5432 -U restore_lab \
  --template=template0 offvps_restore_target &&
pg_restore -h /var/run/postgresql -p 5432 -U restore_lab \
  --dbname=offvps_restore_target --no-owner --no-acl \
  --single-transaction "$lab/bundle/notes.dump" &&
mkdir "$lab/restore/uploads" &&
cp -a "$lab/bundle/uploads/." "$lab/restore/uploads/"

De doeldatabase wordt leeg aangemaakt. Bij het terugzetten wordt opzettelijk --cleanweggelaten, wat bestaande objecten zou kunnen verwijderen. --single-transaction zorgt ervoor dat het terugzetten van deze kleine database als geheel slaagt of stopt zonder de gedeeltelijke wijzigingen toe te passen; het kan niet worden gecombineerd met parallelle taken. --no-owner en --no-acl vereenvoudigt eigenaarschap voor deze testrol, dus deze oefening valideert niet de productierollen of -machtigingen van de toepassing. Zie pg_restore.

De bestandskopie gaat naar de nieuwe herstelmap en laat de bron intact. GNU cp -a probeert bestandskenmerken te behouden; controleer eigenaarschap en toegang voor het account dat een echte toepassing gaat uitvoeren. Bytes kopiëren is geen test van applicatiemachtigingen. Zie cp's archiefoptie.

Controleer de relatie, niet alleen exitcodes

psql -X -h /var/run/postgresql -p 5432 -U restore_lab \
  -d offvps_restore_target -c "SELECT id, body, attachment FROM notes;" &&
cat "$lab/restore/uploads/marker.txt"

Verwachte resultaten zijn één rij met ID 1, body restore-marker-01 en bijlage marker.txt, plus een bestand met restore-marker-01. Controleer dat de bron nog steeds de oorspronkelijke rij en het bestand bevat. Wijs voor uw echte app ook een geïsoleerde instantie naar de teruggezette database en uploadmap, open representatieve records, haal een bijlage op en test de beoogde loginmachtigingen. Houd daarbij callbacks, mail en taken ingeperkt.

Schrijf op wat u hebt bewezen en wat nog rest

RecordWat vast te leggen
HerstelpuntLeg tijdstip en het nieuwste verwachte record vast
HerstelduurStart/eindtijden en handmatige stappen
ControlesDatabaserij, inhoud van bijlage en applicatiecontroles
UitzonderingenOntbrekende rollen, machtigingen, configuratie of afhankelijkheden
Volgende oefeningEen trigger zoals een wijziging in schema, opslag of deployment

De hierboven verwachte uitvoer zijn oefeningscriteria, geen resultaten die al door OffVPS zijn waargenomen. Omdat de eerste oefening alle bestanden op één machine houdt, biedt deze geen bescherming tegen verlies van die machine. Een echt plan vereist een beschermde kopie in een apart foutdomein, bruikbare ontsleutelingssleutels, retentie en een getest ophaalpad. Controleer de exacte wegwerpbare databasenamen en map vóór latere opschoning; houd productie buiten dat proces.

Herhaal de oefening na belangrijke wijzigingen en leg fouten net zo zorgvuldig vast als successen. Een optionele back-upservice bewijst niet de hersteltijd van uw toepassing. Ga verder met een geplande taak plannen wanneer u klaar bent om het vastleggen te automatiseren, met behoud van een aparte hersteloefening.

Gebruikte documentatie

Primaire referenties voor deze pagina. Controleer de documentatie voor de versie die in uw eigen omgeving is geïnstalleerd.