Im ersten Teil haben wir gelernt, wie Sie inkrementelle Sicherungen erstellen, diese auf einen Remote-Server (Repository mit Sicherungen) hochladen und auf die letzte Sicherung zurücksetzen.
In diesem Artikel erfahren Sie, wie Sie Sicherungen verschlüsseln, in einen S3-kompatiblen Speicher (anstelle eines zweiten Repository-Servers) hochladen, in einen sauberen Cluster wiederherstellen und schließlich die Wiederherstellung zu einem bestimmten Zeitpunkt (PITR) durchführen.
Moment Der
Autor gibt nicht vor, ein DBA zu sein, aber manchmal mag er es, alles selbst einzurichten und zu sehen.
Ausbildung
Um dieses Handbuch zu reproduzieren, benötigen wir:
- Der Server mit der Datenbank (wir werden pgbackrest darauf installieren);
- S3-Speicher (Sie können Amazon oder einen beliebigen S3-kompatiblen Speicher verwenden, ich werde Amazon S3 verwenden);
- Dritter Server. Auf Wunsch. Darauf üben wir das Bereitstellen von postgresql und pgbackrest von Grund auf neu, das Bereitstellen eines vorhandenen Backups aus dem S3-Speicher (der Server ist ausgebrannt, bewegt sich usw.).
Es wird davon ausgegangen, dass Sie postgresql bereits installiert haben und daher auch der Benutzer postgresql vorhanden ist.
Ich habe den Installationsprozess von pgbackrest im vorherigen Artikel beschrieben, aber nur für den Fall, dass ich ihn erneut duplizieren werde (ich erinnere Sie: Erstellen Sie vor der Installation einen sudo-Benutzer für sich selbst - ich werde einen sudo-Benutzer mit dem Benutzernamen pgbackrest verwenden).
Damit Sie beim Reproduzieren der Anweisungen weniger Probleme haben, schreibe ich kursiv, wo, von welchem Benutzer und mit welchen Rechten ich den Befehl beim Schreiben und Überprüfen des Artikels ausgeführt habe.
Wir folgen diesem Pfad:
Konfigurieren von postgresql und pgbackrest Konfigurieren der
Verschlüsselung von Sicherungen (zwei Zeilen)
Erfahren Sie, wie Sie sichern und an den S3-Speicher senden (fünf Zeilen). Erstellen
Sie eine Sicherung
Stellen wir uns vor, wir haben den Cluster zerstört, auf einem neuen Server bereitgestellt, das vorhandene S3-Repository verbunden und das Backup
aufgerollt. Schauen wir uns PITR (Point In Time Recovery) an: Wir werden bis zu einem bestimmten Zeitpunkt wiederherstellen (sagen wir, pgbackrest hat die Drop-Tabelle bereits gesichert, aber wir müssen 4 Stunden zurücksetzen als das Zeichen noch existierte)
Lass uns gehen!
PgBackRest installieren
sudo user oder root:
1. Laden Sie das Archiv von pgbackrest herunter und übertragen Sie den Inhalt in den Ordner / build:
sudo mkdir /build
sudo wget -q -O - \
https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | \
sudo tar zx -C /build
2. Installieren Sie die zum Erstellen erforderlichen Abhängigkeiten:
sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev \
libpq-dev
3. Pgbackrest zusammensetzen:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src
4. Kopieren Sie die ausführbare Datei in das Verzeichnis / usr / bin:
sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest
5.pgBackRest erfordert Perl. Installieren:
sudo apt-get install perl
6. Erstellen Sie Verzeichnisse für Protokolle und geben Sie ihnen bestimmte Rechte:
sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown postgres:postgres /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf
7. Überprüfen Sie:
pgbackrest version
Postgresql- und pgBackRest-Setup
sudo user oder root:
1. Nehmen Sie die erforderlichen Einstellungen in der postgresql.conf vor (sie befindet sich im Ordner / etc / postgresql / 11 / main), damit pgBackRest funktioniert:
archive_command = 'pgbackrest --stanza=main archive-push %p' # main - . postgres main.
archive_mode = on
max_wal_senders = 3
wal_level = replica
2. Nehmen Sie die erforderlichen Einstellungen in der Konfigurationsdatei pgbackrest (/etc/pgbackrest/pgbackrest.conf) vor:
[main]
pg1-path=/var/lib/postgresql/11/main
[global]
log-level-file=detail
repo1-cipher-pass=tr5+BXdfdoxeyUqfo6AzLTrW+c+Jfd/1QbQj2CDMMBwtB0YGH3EJajry4+Eeen6D
repo1-cipher-type=aes-256-cbc
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # , . .. , . " " - .
repo1-type=s3
repo1-s3-bucket=pgbackrest-part2-tutorial
repo1-s3-endpoint=s3.us-east-1.amazonaws.com
repo1-s3-region=us-east-1
repo1-s3-key=9wdS3G8U5wz7kNsFWVGck7DDZ7DtVDtbM
repo1-s3-key-secret=A9zRmW16zXKt2vVA8mmNsFWy2mUAPYHa
start-fast=y
[global:archive-push]
compress-level=3
Wie Sie verstehen, haben wir hier sofort die Verschlüsselung und die Unterstützung für S3-Speicher konfiguriert.
PS Die Konfiguration sollte keine Kommentare enthalten.
PS Um einen starken Verschlüsselungsschlüssel zu generieren, können Sie den folgenden Befehl verwenden:
openssl rand -base64 48
Repository-Erstellung
sudo user oder root:
sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R postgres /var/lib/pgbackrest/
sudo -u postgres pgbackrest --stanza=main stanza-create
Wenn alles geklappt hat, sehen Sie im S3-Bucket die Dateien, die pgbackrest generiert hat.
Erstellen eines Backups:
sudo user oder root:
sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup
pgBackRest erstellt die erste vollständige Sicherung. Wenn Sie möchten, können Sie den Sicherungsbefehl erneut ausführen und sicherstellen, dass das System eine inkrementelle Sicherung erstellt.
Wenn Sie eine vollständige Sicherung erneut erstellen möchten, geben Sie ein zusätzliches Flag an:
sudo -u postgres pgbackrest --log-level-console=info --stanza=main --type=full backup
Sie können die Liste der Sicherungen mit dem folgenden Befehl anzeigen:
sudo -u postgres pgbackrest --stanza=main info
Sicherung wiederherstellen:
sudo user oder root:
1. Stoppen Sie den laufenden Cluster:
sudo pg_ctlcluster 11 main stop
2. Wiederherstellung von einem Backup:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore
Verwenden Sie den Befehl ohne Angabe von recovery_target, um die Datenbank auf den Status der letzten vollständigen Sicherung zurückzusetzen:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore
Wichtig! Nach der Wiederherstellung kann sich herausstellen, dass die Datenbank im Wiederherstellungsmodus hängt (es treten Fehler wie FEHLER auf: DROP DATABASE kann in einer schreibgeschützten Transaktion nicht ausgeführt werden). Es wird wie folgt gelöst (Sie müssen nach Ausführung des Befehls etwas warten):
sudo -u postgres psql -c "select pg_wal_replay_resume()"
UPD: Soweit ich weiß, tritt dieser Fehler auf, weil pgbackrest nach der Wiederherstellung mit recovery_target = sofort die Datenbank pausiert . Um dies zu vermeiden, müssen Sie zusätzlich einige Flags angeben (deren Bedeutung können Sie hier und hier lesen ):
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate --target-action=promote --type=immediate restore
Tatsächlich ist es möglich, eine bestimmte Sicherung anhand ihres Namens wiederherzustellen. Hier werde ich nur einen Link zur Beschreibung dieser Funktion in der Dokumentation bereitstellen . Die Entwickler raten zur Verwendung dieses Parameters mit Vorsicht und erklären, warum. Von mir selbst kann ich hinzufügen, dass ich es benutzt habe. Die Hauptsache ist, sicherzustellen, dass die Datenbank nach der Wiederherstellung den Wiederherstellungsmodus beendet hat (wählen Sie pg_is_in_recovery () sollte "f" anzeigen) und für alle Fälle eine vollständige Sicherung nach der Wiederherstellung durchführen.
3. Starten Sie den Cluster:
sudo pg_ctlcluster 11 main start
Nach dem Wiederherstellen des Backups führen wir ein zweites Backup durch:
sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup
Wiederherstellen der Sicherung in einem sauberen Cluster:
Stellen wir uns vor, dass etwas Schreckliches passiert ist - der Server ist abgebrannt (gefallen, überflutet, Zugriff verloren). Wir müssen alles auf einem neuen, sauberen Server wiederherstellen. Auf dem neuen Server haben wir bereits einen sudo-Benutzer erstellt, pgbackrest installiert, postgresql installiert und einen sauberen und frischen Hauptcluster.
Alles, was wir tun müssen, ist, die Konfiguration von postgresql und pgBackRest auf die gleiche Weise wie auf dem vorherigen Server einzurichten, postgresql neu zu starten und die Befehlsreihenfolge ähnlich der Wiederherstellung auszuführen:
sudo user oder root:
1. Stoppen Sie den laufenden Cluster:
sudo pg_ctlcluster 11 main stop
2. Wiederherstellung von einem Backup:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate --target-action=promote --type=immediate restore
PS Ich habe oben die Nuancen und Feinheiten dieses Befehls beschrieben.
3. Starten Sie den Cluster:
sudo pg_ctlcluster 11 main start
Nach dem Wiederherstellen der Sicherung müssen wir eine zweite Sicherung durchführen:
sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup
Das ist in der Tat alles. Das Feuer wird gelöscht.
Zeitpunkt der Wiederherstellung (PITR)
Stellen wir uns eine solche Situation vor, dass um 16:00 Uhr ein Backup erstellt wurde und wir um 18:05 Uhr versehentlich eine wichtige Platte gelöscht haben, in die in 2 Stunden viele wichtige Daten, die wir nicht verlieren möchten, gelangen konnten. PgBackRest auf Kosten von PostgreSQL bietet uns eine solche Möglichkeit: Wir können auf einen bestimmten Zeitpunkt zurücksetzen, vorausgesetzt, wir haben genügend Informationen, um sie wiederherzustellen.
Es funktioniert so:
- Wir sagen, wir wollen auf die Zeit 18:04 zurückrollen;
- pgBackRest sucht nach der letzten aktuellen Sicherung (16:00);
- Stellt es wieder her, aber nicht alles rollt über, sondern nur das, was wir vor dem 18.04 geschafft haben;
PS Dieser Mechanismus basiert auf WAL-Protokollen. Sie können es hier lesen .
Mit diesem Befehl können Sie die Wiederherstellung zu einem bestimmten Zeitpunkt (nach dem Stoppen des Clusters) durchführen:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --type=time "--target=2020-09-06 18:27:24.561458+02" --target-action=promote restore
Wichtiger Hinweis - PostgreSQL kann WAL-Protokolle nur vorwärts und nicht rückwärts abspielen. Was bedeutet das in der Praxis?
Angenommen, um 16:00 Uhr wurde ein Backup erstellt. Um 18:05 Uhr haben wir versehentlich die Tabelle gelöscht, und um 18:10 Uhr wurde erneut ein Backup mit der bereits gelöschten Tabelle erstellt. Wenn Sie versuchen, eine PITR zu erstellen, nimmt pgBackRest die Sicherung, die um 16:00 Uhr erstellt wurde, und überträgt alles, was vor 18:05 Uhr war, und nimmt nicht die Sicherung, die um 18:10 Uhr erstellt wurde, und setzt alles zurück. Das ist wichtig zu verstehen. Dieser Mechanismus wird hier ausführlicher beschrieben .
Angenommen, Sie haben eine Sicherung erstellt, die bereits Informationen zum Löschen einer Tabelle enthält. Nehmen wir mit dem Flag --set an, welches Backup für die Basis verwendet werden soll (das, in dem sich die Tabelle noch befand). pgBackRest erstellt diese Sicherung und überträgt alles, was vor dem Löschen der Tabelle vorhanden war.
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --type=time --set=20200905-183838F_20200906-182612I "--target=2020-09-06 18:27:24.561458+02" --target-action=promote restore
PS Ich habe den Befehl zum Abrufen der Liste der Sicherungen oben gezeigt.
Starten wir den Cluster. Untersuchen wir nach dem Start die Datei /var/log/postgresql/postgresql-11-main.log. Darin interessieren uns die folgenden Zeilen, die zeigen, dass die Wiederherstellung zum angegebenen Zeitpunkt erfolgreich war:
starting point-in-time recovery to 2020-09-07 11:26:52.493127+02
...
recovery stopping before commit of transaction 576, time 2020-09-07 11:27:14.584496+02
...
last completed transaction was at log time 2020-09-07 11:24:09.583761+02
Das ist alles. Ich rate Ihnen dringend, mit diesem Werkzeug zu experimentieren, bevor Sie es im Kampf einsetzen.