Mehr

Datenbank in PostgreSQL sichern?

Datenbank in PostgreSQL sichern?


Ich muss ein Backup von meiner Datenbank erstellen (in PostgreSQL 9.3). Ich habe das pg_dump-Tool verwendet, gibt mir einen Fehler. Ich habe auch pgAdmin III zum Sichern verwendet, was mir auch die folgende Fehlermeldung gibt:

pg_dump: [Archiver (db)] Abfrage fehlgeschlagen: FEHLER: Bibliothek "C:/Program Files/Boundless/OpenGeo/bin/… /pgsql/lib/postgis-2.1.dll" konnte nicht geladen werden: %1 ist kein gültiges Win32 Anwendung.

Ich habe versucht, den Pfad zu überprüfen, aber ich konnte ihn nicht finden. Der nächste Weg, den ich erreiche, ist:

"C:/Programme/Boundless/OpenGeo/bin"


Pfad sollte auf das… / im Pfadnamen zurückzuführen sein

"C:/Programme/Boundless/OpenGeo/pgsql/lib/"

Erstellen Sie jedoch, wie in Ihrer ersten Frage angegeben, eine Kopie des Verzeichnisses "data" von PostgreSQL. Machen Sie dann das von Ihnen befolgte Tutorial rückgängig, indem Sie die Dateien löschen, die Sie zu PostgreSQL hinzugefügt haben, starten Sie postgresql neu und versuchen Sie es erneut.

Wenn dies nicht funktioniert, deinstallieren Sie PostgreSQL am besten, installieren Sie es erneut und fügen Sie die Kopie des "data"-Verzeichnisses in die neue Installation ein.

Außerdem sollten Sie den Stack Builder verwenden, um PostGIS und pgRouting zu installieren.


Hevo bietet eine schnellere Möglichkeit, Daten aus Datenbanken oder SaaS-Anwendungen in Ihr Data Warehouse zu verschieben, um sie in einem BI-Tool zu visualisieren. Hevo ist vollständig automatisiert und erfordert daher keine Codierung.

Schauen Sie sich einige der coolen Funktionen von Hevo an:

  • Vollständig automatisiert: Die Hevo-Plattform kann in wenigen Minuten eingerichtet werden und erfordert nur minimale Wartung.
  • Echtzeit-Datenübertragung: Hevo bietet Echtzeit-Datenmigration, sodass Sie immer über analysebereite Daten verfügen.
  • 100% vollständige und genaue Datenübertragung: Die robuste Infrastruktur von Hevo gewährleistet eine zuverlässige Datenübertragung ohne Datenverlust.
  • Skalierbare Infrastruktur: Hevo verfügt über integrierte Integrationen für über 100 Quellen, mit denen Sie Ihre Dateninfrastruktur nach Bedarf skalieren können.
  • 24/7 Live-Support: Das Hevo-Team steht rund um die Uhr zur Verfügung, um Ihnen durch Chat, E-Mail und Support-Anrufe außergewöhnlichen Support zu bieten.
  • Schemaverwaltung: Hevo nimmt Ihnen die mühsame Aufgabe der Schemaverwaltung ab und erkennt automatisch das Schema eingehender Daten und ordnet es dem Zielschema zu.
  • Sicherheit: Hevo ist SOC II-, DSGVO- und HIPPA-konform. Hevo ermöglicht auch erstklassige Sicherheit mit Ende-zu-Ende-Verschlüsselung, Zwei-Faktor-Authentifizierung und mehr.
  • Live-Überwachung: Mit Hevo können Sie den Datenfluss überwachen, sodass Sie überprüfen können, wo sich Ihre Daten zu einem bestimmten Zeitpunkt befinden.

Sie können Hevo kostenlos testen, indem Sie sich für eine 14-tägige kostenlose Testversion anmelden.


2 Antworten 2

Sie müssen den vollständigen Pfad zu pg_dump angeben -- cron führt seine Skripte standardmäßig mit einem sehr restriktiven PATH aus.

Annahmen:

Ich gehe davon aus, dass Ihre Zugangsdaten für die Postgress-Datenbank gespeichert sind in

/.pgpass und die Berechtigungen der Datei sind auf 0600 gesetzt und Sie verwenden PG*-Umgebungsvariablen.

Grund:

Der Grund dafür, dass Ihr Backup-Befehl funktioniert (erstellt ein Backup der Datenbank), wenn er vom Terminal ausgeführt wird, und nicht funktioniert (erstellt eine leere Datei), wenn er von crontab ausgeführt wird, ist die Umgebung.

Ursache:

Wenn Sie einen Befehl in crontab ausführen (auch wenn Sie die Ausführung als gewünschter Benutzer erzwingen (z. B. su - root -c 'my_aesome_command' ) unterscheiden sich die Umgebungsvariablen für den angeforderten Benutzer von den Umgebungsvariablen, da sie gesetzt werden, wenn der Benutzer Terminal eingeloggt.

Lösung:

Ich habe dieses Problem behoben, indem ich die Umgebungsvariablen eines bestimmten Benutzers zur /etc/environment-Datei hinzugefügt habe, indem ich diesen Befehl ausführe env >> /etc/environment, wenn ich mein Backup-Skript lade (eigentlich wenn ich meinen Container lade, da ich mit Docker arbeite)


Einfachste Dateisystemsicherung der Postgres-Datenbank

Situation: Ein Backup-System führt tägliche Backups auf Dateisystemebene auf einem Server durch, der eine große, aber ziemlich statische PostgreSQL 9.2-Datenbank enthält. Die Dateisystem-Backups sind inkrementell und dauern im Allgemeinen <30 Minuten.

Meine ursprüngliche Idee war, die Hook-Skripte des Backup-Systems zu verwenden, um den Datenbank-Cluster in den Backup-Modus zu versetzen:

  1. start-backup Hook läuft: psql -c "SELECT pg_start_backup('daily')"
  2. Backup kopiert Postgres-Datendateien woanders und ignoriert pg_xlog/
  3. Hook mit abgeschlossenem Backup läuft: psql -c "SELECT pg_stop_backup()"

Mein Verstehen war, dass (1) einen Datenbank-Checkpoint erzwingen würde, was bedeutet, dass Sie ein konsistentes Dateisystem in base/& friends haben. Weitere WAL-Segmente würden während (2) in pg_xlog/ geschrieben, würden aber die base/-Dateien allein lassen. Wenn dann pg_stop_backup() in (3) aufgerufen wird, wendet es die WAL-Protokolle während des Backups auf die Basis/&-Freunde an. Und wenn Sie das Backup wiederherstellen, erhalten Sie den Datenbankstatus bei (1).

Aber die Postgresql-Dokumente beschreiben etwas anderes:

Eigenständige Hot-Backups

Es ist möglich, die Backup-Funktionen von PostgreSQL zu verwenden, um eigenständige Hot-Backups zu erstellen. Dies sind Backups, die nicht für eine Point-in-Time-Wiederherstellung verwendet werden können, aber normalerweise viel schneller zu sichern und wiederherzustellen sind als pg_dump-Dumps.

Wenn mehr Flexibilität beim Kopieren der Backup-Dateien erforderlich ist, kann ein Prozess auf niedrigerer Ebene auch für eigenständige Hot-Backups verwendet werden. Zur Vorbereitung auf Low-Level-Standalone-Hot-Backups setzen Sie wal_level auf archive , archive_mode auf on , und richten Sie einen archive_command ein, der nur dann archiviert, wenn eine Switch-Datei vorhanden ist. Beispielsweise:

Dieser Befehl führt eine Archivierung durch, wenn /var/lib/pgsql/backup_in_progress vorhanden ist, und gibt ansonsten stillschweigend den Exit-Status Null zurück (damit PostgreSQL die unerwünschte WAL-Datei recyceln kann).

Mit dieser Vorbereitung kann ein Backup mit einem Skript wie dem folgenden erstellt werden:

Die Switch-Datei /var/lib/pgsql/backup_in_progress wird zuerst erstellt, damit die Archivierung abgeschlossener WAL-Dateien erfolgen kann. Nach der Sicherung wird die Switch-Datei entfernt. Archivierte WAL-Dateien werden dann dem Backup hinzugefügt, sodass sowohl das Basis-Backup als auch alle erforderlichen WAL-Dateien Teil derselben tar-Datei sind. Bitte denken Sie daran, Ihren Backup-Skripten eine Fehlerbehandlung hinzuzufügen.

Das ist in Ordnung - ich muss wal_level=archive aktivieren, damit pg_start_backup() trotzdem funktioniert, und kann leicht eine Switch-Datei erstellen und entfernen. Es ist jedoch nicht möglich, das Backup-System dazu zu bringen, das Dateisystem erneut zu besuchen (für den letzten Schritt oben).

Soweit ich das beurteilen kann, würde mir der obige Ansatz aus der Postgres-Dokumentation eine Sicherung des Datenbankstatus wie bei pg_stop_backup() verschaffen (letzterer Teil über das Wiedergeben der archivierten WAL-Segmente während des Starts).

Aber es ist durchaus möglich, dass mein Verständnis falsch ist und Basis/ tut während der Sicherungen ändern, sodass Sie auch die archivierten WAL-Segmente benötigen.

So, mache ich brauchen die WAL-Segmente aus der Zeit zwischen pg_start_backup() & pg_stop_backup() Aufrufen kopieren, um ein brauchbares Backup zu erhalten?


Ermitteln Sie, wann eine PostgreSQL-Datenbank zuletzt geändert wurde

Ich überlege, wie Backups durchgeführt werden, und frage mich, ob es eine Möglichkeit gibt, festzustellen, welche Datenbanken in einem Postgreql-Cluster nicht kürzlich geändert wurden?

Anstatt pg_dumpall zu verwenden, möchte ich pg_dump verwenden und nur die Datenbanken sichern, die sich seit dem letzten Backup geändert haben (einige Datenbanken werden nicht sehr oft aktualisiert) - die Idee ist, dass, wenn sich nichts geändert hat, das aktuelle Backup sollte noch gut sein.

Kennt jemand eine Möglichkeit, festzustellen, wann eine bestimmte Datenbank zuletzt aktualisiert/geändert wurde?

Ich hatte gehofft, nicht überall Trigger schreiben zu müssen, da ich keine Kontrolle über die Erstellung von Datenbanken in einem bestimmten Cluster habe (geschweige denn die Erstellung von DB-Objekten innerhalb einer Datenbank).

Wenn man weiter gräbt, sieht es so aus, als ob es eine Korrelation zwischen dem Inhalt der Datei $PGDATA/global/pg_database (insbesondere dem zweiten Feld) und den Verzeichnisnamen unter $PGDATA/base gibt.

Auf der einen Seite würde ich vermuten, dass das zweite Feld der pg_database-Datei das Datenbank-oid ist und dass jede Datenbank ihr eigenes Unterverzeichnis unter $PGDATA/base hat (mit dem oid für den Unterverzeichnisnamen). Ist das korrekt? Wenn ja, ist es sinnvoll, die Dateizeitstempel aus den Dateien unter $PGDATA/base/* als Auslöser für die Notwendigkeit einer Sicherung zu verwenden?


2 Antworten 2

PostgreSQL generiert keine Datenbanksicherung mit einer Abfrage wie SQL Server (z. B.: Sichern Sie die Datenbank [db_name] auf die Festplatte. )! Es ist ein anderes RDBMS, Sie können nicht einfach etwas tun, was andere tun, nur weil Sie es wollen!

Es gibt 2 Methoden, um Backups von Postgres zu erstellen, wie zuvor kommentiert. Verwenden von pg_dump, können Sie eine vollständige SQL-Datei mit allen DDL- und DML-Anweisungen erstellen, um Ihre Datenbank an einem anderen Ort neu zu erstellen (oder wiederherzustellen):

Oder Sie können physische Backups erstellen, indem Sie die pg_data Mappe.

Verwenden Sie pg_dump von der Befehlszeile aus. die pg_dump exe befindet sich in Ihrem bin-Ordner im Postgres-Installationsverzeichnis.


Fehlerbehebung

Klicken Sie auf die Links in der Tabelle, um Details zu erfahren:

Für dieses Problem. Das Problem könnte sein. Versuche dies.
Kann den aktuellen Betriebsstatus nicht sehen. Die Benutzeroberfläche zeigt nur Erfolg oder Misserfolg an. Verwenden Sie diese Datenbankbefehle, um mehr zu erfahren.
Der Urheber der Operation kann nicht gefunden werden. Die Benutzeroberfläche zeigt nicht an, wer einen Vorgang gestartet hat. Verwenden Sie die Audit-Protokollierung, um dies herauszufinden.
Nicht genügend Speicherplatz während der automatischen Sicherung. Instanz hat Festplattenspeichergrenzen erreicht. Überprüfen Sie die Dateisystemgröße und das Kontingent.
Sicherung nach gelöschter Instanz nicht möglich. Instanz wurde gelöscht. Erstellen Sie aus einem Export erneut oder wenden Sie sich an den Kundensupport, wenn Sie sich innerhalb des Kulanzzeitraums befinden.
Die automatische Sicherung scheint festzustecken. Die Sicherungszeit ist mit der Datenbankgröße korreliert. Wenden Sie sich an den Kundensupport, wenn Sie den Vorgang wirklich abbrechen müssen.
Wiederherstellung schlägt fehl. Die Dump-Datei kann Datenbankbenutzer enthalten, die noch nicht existieren. Erstellen Sie die Datenbankbenutzer vor der Wiederherstellung.
Der Vorgang ist für diese Instanz nicht gültig. Die Größe der Zielinstanz ist kleiner als die der Quelle. Erhöhen Sie die Größe der Zielinstanz.
Erhöhen Sie die Anzahl der Tage, um automatisierte Backups aufzubewahren. Es werden nur sieben automatisierte Backups aufbewahrt. Verwalten Sie Ihre eigenen manuellen Backups.
Unbekannter Fehler bei Backup-Fehler. Bei der Sicherung ist möglicherweise eine Zeitüberschreitung aufgetreten. Überprüfen Sie diese Flaggen.
Keine Benachrichtigung über Backup-Fehler. Bei Sicherungsfehlern werden keine Benachrichtigungen unterstützt. Verwenden Sie die REST API- oder gcloud-Befehle, um den Status einer Sicherung zu überprüfen.
Instanz bleibt hängen und wechselt zwischen Fehler- und Backup-Wiederherstellungsstatus. Zu viel Verkehr oder zu viele offene Verbindungen. Überprüfen Sie die Autovacuum-Einstellungen und die Wiederholungslogik.
In einem Backup fehlen Daten. Nicht protokollierte Tabellen werden nicht aus der Sicherung wiederhergestellt. Siehe diese Hinweise zu nicht protokollierten Tabellen.

Kann den aktuellen Betriebsstatus nicht sehen

Sie können den Status eines Vorgangs in der Google Cloud Console nicht sehen.

Das Problem könnte sein

Die Google Cloud Console meldet nach Abschluss nur den Erfolg oder Misserfolg und ist nicht darauf ausgelegt, Warnungen zurückzugeben.

Dinge zum Ausprobieren

Stellen Sie eine Verbindung zur Datenbank her und führen Sie SHOW WARNINGS aus.

Der Urheber der Operation kann nicht gefunden werden

Sie möchten herausfinden, wer einen On-Demand-Backup-Vorgang durchgeführt hat.

Das Problem könnte sein

Auf der Seite Instanzvorgänge in der Google Cloud Console wird nicht angezeigt, wer einen Vorgang eingeleitet hat.

Dinge zum Ausprobieren

  • cloudql.googleapis.com/postgres.log
  • cloudaudit.googleapis.com/activity ist möglicherweise auch verfügbar, wenn Cloud-Audit-Logs aktiviert ist.

Nicht genügend Speicherplatz während der automatischen Sicherung

Sie sehen die Fehlermeldung [ERROR] InnoDB: Write to file ./ibtmp1 failed at offset XXXX, YYYY Bytes hätten geschrieben werden sollen, es wurden nur 0 geschrieben.

Das Problem könnte sein

Die Instanz hat während eines automatisierten Backups ein hartes Limit erreicht. Temporäre Dateien können während eines Backups über den verfügbaren Speicherplatz hinaus expandieren.

Dinge zum Ausprobieren

Stellen Sie sicher, dass die Festplatte nicht voll ist oder das Festplattenkontingent überschritten hat. Sie können die Festplattengröße entweder manuell erhöhen oder die automatische Speichererweiterung aktivieren.

Sicherung nach gelöschter Instanz nicht möglich

Nach dem Löschen der Instanz können Sie keine Sicherung durchführen.

Das Problem könnte sein

Dinge zum Ausprobieren

  • Der Kulanzzeitraum für die Bereinigung einer Cloud SQL-Instanz beträgt vier Tage. Während dieser Zeit kann der Kundensupport die Instanz neu erstellen. Nachdem Instanzen gelöscht wurden, ist keine Datenwiederherstellung möglich.
  • Wenn Sie einen Export durchgeführt haben, können Sie eine neue Instanz erstellen und dann einen Import durchführen, um die Datenbank neu zu erstellen. Exporte werden in Cloud Storage geschrieben und Importe von dort gelesen.

Automatisiertes Backup ist stecken geblieben

Die automatische Sicherung bleibt viele Stunden hängen und kann nicht abgebrochen werden.

Das Problem könnte sein

Backups können je nach Datenbankgröße lange dauern.

Dinge zum Ausprobieren

Wenn Sie den Vorgang wirklich abbrechen müssen, können Sie den Kundensupport bitten, den Neustart der Instanz zu erzwingen.

Wiederherstellung aus Backup schlägt fehl

Eine Wiederherstellungsoperation kann fehlschlagen, wenn ein oder mehrere Benutzer, auf die in der SQL-Dumpdatei verwiesen wird, nicht vorhanden sind.

Das Problem könnte sein

Vor dem Wiederherstellen eines SQL-Dumps müssen alle Datenbankbenutzer vorhanden sein, die Objekte besitzen oder denen Berechtigungen für Objekte in der gesicherten Datenbank erteilt wurden. Wenn dies nicht der Fall ist, können die Objekte bei der Wiederherstellung nicht mit dem ursprünglichen Besitz und/oder den ursprünglichen Berechtigungen neu erstellt werden.

Dinge zum Ausprobieren

Erstellen Sie die Datenbankbenutzer, bevor Sie aus dem SQL-Dump wiederherstellen.

Vorgang ist für diese Instanz nicht gültig

Die Fehlermeldung HTTP-Fehler 400: Dieser Vorgang ist für diese Instanz von einem API-Aufruf an instances.restoreBackup nicht gültig.

Das Problem könnte sein

Sie können nicht aus einer Sicherung einer Instanz mit einer Speichergröße (XX GB) wiederherstellen, die kleiner als die Sicherungsgröße (YY GB) ist.

Dinge zum Ausprobieren

Bearbeiten Sie die Zielinstanz, um ihre Speichergröße zu erhöhen.

Instanz bleibt hängen und wechselt zwischen Fehler- und Backup-Wiederherstellungsstatus

Eine Instanz schlägt wiederholt fehl, weil sie zwischen dem Fehlerstatus und dem Backup-Wiederherstellungsstatus wechselt. Versuche, nach der Wiederherstellung eine Verbindung zur Datenbank herzustellen und diese zu verwenden, schlagen fehl.

Das Problem könnte sein

  • Es könnte zu viele offene Verbindungen geben. Zu viele Verbindungen können aus Fehlern resultieren, die mitten in einer Verbindung auftreten, wenn keine Autovacuum-Einstellungen zum Bereinigen toter Verbindungen vorhanden sind.
  • Ein Zyklus kann auftreten, wenn benutzerdefinierter Code eine Wiederholungslogik verwendet, die nach einigen Fehlern nicht beendet wird.
  • Es könnte zu viel Verkehr sein. Verwenden Sie Verbindungspooling und andere bewährte Methoden für die Konnektivität.

Dinge zum Ausprobieren

  1. Stellen Sie sicher, dass die Datenbank für Autovacuum eingerichtet ist.
  2. Überprüfen Sie, ob im benutzerdefinierten Code eine Verbindungswiederholungslogik eingerichtet ist.
  3. Verringern Sie den Datenverkehr, bis die Datenbank wiederhergestellt ist, und erhöhen Sie dann den Datenverkehr langsam wieder.

Daten fehlen in einem Backup

Sie stellen fest, dass Ihnen Daten fehlen, wenn Sie einen Sicherungs-/Wiederherstellungsvorgang durchführen.

Das Problem könnte sein

Tabellen wurden als nicht protokolliert erstellt. Beispielsweise:

Diese Tabellen sind nicht in einer Wiederherstellung aus einer Sicherung enthalten:

  • Der Inhalt nicht protokollierter Tabellen überlebt kein Failover auf einer HA-Instanz.
  • Nicht protokollierte Tabellen überleben Postgres-Abstürze nicht.
  • Nicht protokollierte Tabellen werden nicht in Lesereplikate repliziert.
  • UNLOGGED-Tabellen werden während der Sicherungswiederherstellung automatisch gelöscht.

Dinge zum Ausprobieren

Die Lösung besteht darin, die Verwendung nicht protokollierter Tabellen zu vermeiden, wenn Sie diese Tabellen durch eine Sicherung wiederherstellen möchten. Wenn Sie aus einer Datenbank wiederherstellen, die bereits nicht protokollierte Tabellen enthält, können Sie die Datenbank in eine Datei sichern und die Daten erneut laden, nachdem Sie die gesicherte Datei in ALTER TABLE in SET LOGGED für diese Tabellen geändert haben.

Erhöhen Sie die Anzahl der Tage, um automatisierte Backups aufzubewahren

Sie möchten die Anzahl der Tage, die Sie automatische Backups aufbewahren können, von sieben auf 30 Tage oder länger erhöhen.

Das Problem könnte sein

Es werden nur sieben Backups aufbewahrt. Backups werden aufgrund der Kosten und des Umfangs der Aufbewahrung von Backups regelmäßig beschnitten. Dies bedeutet leider, dass die derzeit sichtbaren Backups die einzigen automatisierten Backups sind, aus denen Sie wiederherstellen können.

Dinge zum Ausprobieren

Um Backups auf unbestimmte Zeit aufzubewahren, können Sie selbst ein On-Demand-Backup erstellen, da diese nicht wie automatisierte Backups gelöscht werden. On-Demand-Backups bleiben auf unbestimmte Zeit erhalten. Das heißt, sie bleiben erhalten, bis sie gelöscht werden oder die Instanz, zu der sie gehören, gelöscht wird. Da diese Art von Backup nicht automatisch gelöscht wird, kann dies Auswirkungen auf die Abrechnung haben.

Unbekannter Fehler bei Backup-Fehler

Backup fehlgeschlagen und Unbekannter Fehler wird angezeigt.

Das Problem könnte sein

Die Backup-Erstellung erreicht das Timeout.

Dinge zum Ausprobieren

Es gibt zwei Flags, die die Backup-Erstellung beeinflussen: checkpoint_timeout und checkpoint_completion_target . Beim Start des Backups wird ein langsamer Checkpoint ausgeführt und es wird checkpoint_completion_target multipliziert mit checkpoint_timeout benötigt.

Zum Beispiel 900 Sek. * 0,9 Sek. = 810 Sek. = 13,5 Min. . Aus diesem Grund tritt ein Timeout auf. Das Verringern des Wertes von checkpoint_completion_target behebt das Problem in diesem Fall.

Keine Benachrichtigung über Backup-Fehler

Eine automatische Sicherung ist fehlgeschlagen und Sie haben keine E-Mail-Benachrichtigung erhalten.

Das Problem könnte sein

Bei Sicherungsfehlern werden keine Benachrichtigungen unterstützt.

Wenn eine automatische Sicherung fehlschlägt, wird auf der Seite Details der Cloud SQL-Instanz eine Fehlermeldung für den Vorgang angezeigt.

Dinge zum Ausprobieren

Sie können den Status einer Sicherung entweder über die REST-API oder die gcloud-Befehle ermitteln. Listen Sie beispielsweise zuerst die Backups für eine Instanz auf und beschreiben Sie dann ein bestimmtes Backup anhand seiner ID:


In PostgreSQL ist nichts eingebaut. Am besten verschlüsseln Sie es mit einem externen Programm.

Ein Systemadministrator, der die DB sichert, kann IMHO immer in die Tabellen einsehen, daher müssen die Tabelleninhalte selbst gesperrt werden. Die einzige Möglichkeit, dies zu erreichen, besteht darin, die Daten zu verschlüsseln, bevor Sie sie in der Datenbank speichern. Dies kann jedoch die Abfragekomplexität und die Indexerstellung etwas erhöhen.

Ist es möglich sicherzustellen, dass Dumps aus einer PostgreSQL-Datenbank immer verschlüsselt werden?

Jawohl. Sie müssten einen Mechanismus (wahrscheinlich ein Skript oder Programm) erstellen, der die Sicherung durchführt und als Ergebnis einen verschlüsselten Dump liefert. Die Administratoren würden dann das Skript ausführen und den Prozess beobachten, wären jedoch nicht in der Lage, den Inhalt des Dumps zu bestimmen.

Sie müssen die Rohdaten auch so sichern, dass sie nicht eingesehen werden können, indem Sie sie wahrscheinlich auf ein verschlüsseltes Volume mit einem Passwort legen, das nur von bestimmten Personen eingegeben werden kann. Der Zugriff auf dieses Volumen wäre dann auf eine ganz bestimmte Gruppe von Benutzern und Diensten beschränkt, wodurch jede Möglichkeit zur Replikation der Daten für die Prüfung an anderer Stelle ausgeschlossen wäre. Dies bedeutet auf Windows-Rechnern, dass sie nicht Domänenadministratoren sein (die die Sicherheit umgehen können) auf Linux/BSD, würden sie nicht in der Lage sein, 'root' zu werden (was auch die Sicherheit umgeht). Dies führt zu einem enormen Verwaltungsaufwand für die von Ihnen verwendeten Maschinen, da viele Verwaltungsfunktionen Zugriff auf dieser Ebene erfordern. Das heißt nicht, dass es nicht geht, aber dass dies einen enormen Mehraufwand bei der Erfüllung ihrer Aufgaben verursacht. Sie müssen kreative Wege finden, um Skripte dazu zu bringen, andere Skripte mit erhöhten Rechten auszuführen (und so weiter).

Die einfachste Lösung wäre, den Server physisch zu isolieren und nur bestimmtes, vertrauenswürdiges Personal die Sicherungssequenz durchführen zu lassen, indem ein Skript ausgeführt wird, das die verschlüsselte Dump-Datei erstellt. Der Zugriff auf die Daten würde über eine normale (Port 5432) PostgreSQL-Verbindung erfolgen, aber kein anderer Netzwerkzugriff wäre erlaubt. Dies impliziert auch, dass Ihren SysAdmins kein Zugriff auf den betreffenden Server gewährt wird.

Die Daten in der Datenbank sind hochsensibel und wir können es uns nicht leisten, dass unbefugtes Personal, einschließlich Systemadministratoren, die die Datenbank sichern müssen, auf die tatsächlichen Daten zugreifen.

Dann haben Sie ein grundsätzliches Dilemma. Ihre Admins sind Personen, denen Sie vertrauen sollten. Dies liegt daran, dass der Großteil des Administratorzugriffs auf einem Computer Sicherheitsprüfungen umgeht, damit der Administrator seine Aufgaben erfüllen kann.

Sie können sicherlich Tools und Methoden erstellen, die sie vom direkten Zugriff auf die Daten trennen, aber um ehrlich zu sein, ein cleverer Admin wird das mit wenig Aufwand umgehen können. Hier kommt Vertrauen ins Spiel.

Denken Sie daran, Integrität und Vertrauen sind der wahre Wert eines SysAdmin, und was sie von anderen Benutzern unterscheidet. Es liegt an ihnen, die Integrität Ihrer Daten zu gewährleisten und das Vertrauen Ihrer Benutzer in ihre Systeme zu wahren. Ohne beides, gut. Sie sind besser dran, die Pflicht selbst zu erfüllen.


Merkmale

Funktionen

Funktionen ermöglichen die Ausführung von Codeblöcken durch den Server. Obwohl diese Blöcke in SQL geschrieben werden können, hat das Fehlen grundlegender Programmieroperationen, die vor Version 8.4 existierten, wie Verzweigungen und Schleifen, die Einführung anderer Sprachen innerhalb von Funktionen vorangetrieben. Einige der Sprachen können sogar innerhalb von Triggern ausgeführt werden. Funktionen in PostgreSQL können in den folgenden Sprachen geschrieben werden:

  • Eine eingebaute Sprache namens PL/pgSQL ähnelt der Prozedursprache PL/SQL von Oracle.
  • Skriptsprachen werden durch PL/Lua, PL/LOLCODE, PL/Perl, plPHP, PL/Python, PL/Ruby, PL/sh, PL/Tcl und PL/Scheme unterstützt.
  • Kompilierte Sprachen C, C++, Java (über PL/Java)
  • Die statistische Sprache R bis PL/R.

PostgreSQL unterstützt Zeilenrückgabefunktionen, bei denen die Ausgabe der Funktion eine Reihe von Werten ist, die in Abfragen ähnlich wie eine Tabelle behandelt werden können. Benutzerdefinierte Aggregate und Fensterfunktionen können ebenfalls definiert werden.

Funktionen können so definiert werden, dass sie mit den Rechten des Aufrufers oder des Benutzers, der die Funktion definiert hat, ausgeführt werden. Funktionen werden manchmal als . bezeichnet Gespeicherte Prozeduren, obwohl es einen leichten technischen Unterschied zwischen den beiden gibt.

Indizes

PostgreSQL enthält integrierte Unterstützung für B+-Baum, Hash-Tabellen, GiST- und GiN-Indizes. Außerdem können benutzerdefinierte Indexmethoden erstellt werden, obwohl dies ein ziemlich aufwendiger Prozess ist. Indizes in PostgreSQL unterstützen auch die folgenden Funktionen:

  • Ausdrucksindizes kann mit einem Index des Ergebnisses eines Ausdrucks oder einer Funktion erstellt werden, anstatt einfach dem Wert einer Spalte.
  • Teilindizes, die nur einen Teil einer Tabelle indizieren, können erstellt werden, indem eine WHERE-Klausel am Ende der CREATE INDEX-Anweisung hinzugefügt wird. Dadurch kann ein kleinerer Index erstellt werden.
  • Der Planer ist in der Lage, mehrere Indizes zusammen zu verwenden, um komplexe Abfragen zu erfüllen, indem er temporäre In-Memory-Bitmap-Indexoperationen verwendet.

Löst aus

Trigger sind Ereignisse, die durch die Aktion von SQL-DML-Anweisungen ausgelöst werden. Beispielsweise kann eine INSERT-Anweisung einen Trigger aktivieren, der überprüft, ob die Werte der Anweisung gültig sind. Die meisten Trigger werden nur durch INSERT- oder UPDATE-Anweisungen aktiviert.

Datenbank-Trigger werden vollständig unterstützt und können an Tabellen, aber nicht an Ansichten angehängt werden. Ansichten können jedoch Regeln haben. Mehrere Trigger werden in alphabetischer Reihenfolge ausgelöst. Zusätzlich zum Aufrufen von Funktionen, die in nativem PL/PgSQL geschrieben sind, können Trigger auch Funktionen aufrufen, die in anderen Sprachen wie PL/Perl geschrieben sind.

PostgreSQL verwaltet die Parallelität über ein System, das als Multi-Version Concurrency Control (MVCC) bekannt ist und jedem Benutzer einen "Schnappschuss" der Datenbank bietet, sodass Änderungen vorgenommen werden können, ohne für andere Benutzer sichtbar zu sein, bis eine Transaktion festgeschrieben ist. Dies macht Lesesperren weitgehend überflüssig und stellt sicher, dass die Datenbank die ACID-Prinzipien effizient einhält.

Regeln

Regeln ermöglichen das Umschreiben des "Abfragebaums" einer eingehenden Abfrage. Eine häufige Verwendung besteht darin, Ansichten zu implementieren, einschließlich aktualisierbarer Ansichten. Regeln, oder genauer "Abfrage-Neu-Schreib-Regeln", werden an eine Tabelle/Klasse angehängt und "Neu-Schreiben" der eingehenden DML (Auswählen, Einfügen, Aktualisieren und/oder Löschen) in eine oder mehrere Abfragen, die entweder ersetzen die ursprüngliche DML-Anweisung oder führen Sie sie zusätzlich aus. Das erneute Schreiben von Abfragen erfolgt nach dem Parsen von DML-Anweisungen, jedoch vor der Abfrageplanung.

Datentypen

Es wird eine Vielzahl nativer Datentypen unterstützt, darunter:

  • Arrays mit variabler Länge (einschließlich Text- und Composite-Typen) bis zu 1 GB Gesamtspeichergröße.
  • Zahlen mit beliebiger Genauigkeit
  • Geometrische Primitive
  • IPv4- und IPv6-Adressen
  • CIDR-Blöcke und MAC-Adressen
  • XML-unterstützende Xpath-Abfragen (ab 8.3)
  • UUID (ab 8.3)

Darüber hinaus können Benutzer ihre eigenen Datentypen erstellen, die in der Regel über die GiST-Infrastruktur von PostgreSQL vollständig indiziert werden können. Beispiele hierfür sind die Datentypen des geografischen Informationssystems (GIS) aus dem PostGIS-Projekt für PostgreSQL.

Benutzerdefinierte Objekte

Neue Typen von fast allen Objekten innerhalb der Datenbank können erstellt werden, einschließlich:

  • Besetzungen
  • Konvertierungen
  • Datentypen
  • Domänen
  • Funktionen, einschließlich Aggregatfunktionen
  • Indizes
  • Operatoren (bestehende können überladen werden)
  • Verfahrenssprachen

Nachlass

Tabellen können so eingestellt werden, dass sie ihre Eigenschaften von einer "übergeordneten" Tabelle erben. Daten in untergeordneten Tabellen scheinen in den übergeordneten Tabellen vorhanden zu sein, es sei denn, Daten werden mit dem Schlüsselwort ONLY aus der übergeordneten Tabelle ausgewählt, d. h. wählen Sie * aus ONLY PARENT_TABLE. Wenn Sie eine Spalte in der übergeordneten Tabelle hinzufügen, wird diese Spalte in der untergeordneten Tabelle angezeigt.

Die Vererbung kann verwendet werden, um die Tabellenpartitionierung zu implementieren, indem entweder Trigger oder Regeln verwendet werden, um Einfügungen in die übergeordnete Tabelle in die richtigen untergeordneten Tabellen zu leiten.

Diese Funktion wird noch nicht vollständig unterstützt – insbesondere sind Tabelleneinschränkungen derzeit nicht vererbbar. Ab Release 8.4 werden alle Check-Constraints und Not-Null-Constraints einer Elterntabelle automatisch von ihren Kindern geerbt. Andere Arten von Einschränkungen (Eindeutigkeits-, Primärschlüssel- und Fremdschlüsseleinschränkungen) werden nicht vererbt.

Die Vererbung bietet eine Möglichkeit, die Funktionen von Generalisierungshierarchien, die in Entity-Relationship-Diagrammen (ERD) dargestellt sind, direkt in die PostgreSQL-Datenbank abzubilden.

Andere Eigenschaften

    Einschränkungen einschließlich Fremdschlüsseleinschränkungen, Spalteneinschränkungen und Zeilenprüfungen . Obwohl Ansichten standardmäßig nicht aktualisierbar sind, können sie dies durch Erstellen von "Einfügen", "Aktualisieren" und/oder "Löschen" von Abfrage-Neuschreibregeln für die Ansicht erfolgen.
  • Innere, äußere (vollständige, linke und rechte) und Kreuzverbindungen
  • Unterauswahl
    • Korrelierte Unterabfragen [5]

    Add-ons

    • Leistungsassistent – ​​in jedem Postgres-Download von EnterpriseDB enthalten. Quellcode ebenfalls verfügbar.
    • MySQL-Migrationsassistent - in jedem Postgres-Download von EnterpriseDB enthalten. Quellcode ebenfalls verfügbar.
    • Geographische Objekte über PostGIS. GPL.
    • Shortest-Path-Algorithmen mit pgRouting mit PostGIS. GPL. über Tsearch2 und OpenFTS. (Ab Version 8.3 ist Tsearch2 im Kern von PostgreSQL enthalten)
    • Es gibt einige synchrone Multi-Master-Derivate oder Erweiterungen, einschließlich
        (gleiche Lizenz wie PostgreSQL) (in frühen Entwicklungsstadien)
      • . verfügbar für eine Reihe von anderen Servern außer PostgreSQL.
  • Proprietär

    Eine Reihe von Unternehmen bietet proprietäre Tools für PostgreSQL an. Sie bestehen oft aus einem universellen Kern, der für verschiedene spezifische Datenbankprodukte angepasst ist. Diese Tools teilen sich größtenteils die Verwaltungsfunktionen mit den Open-Source-Tools, bieten jedoch Verbesserungen bei der Datenmodellierung, beim Importieren, Exportieren oder Berichten.


    Abschluss

    Wie wir gerade gesehen haben, sind Backup und Restore heute ein wichtiger Bestandteil des Datenschutzplans für jede Anwendung in Kubernetes. PX-Backup macht es einfach, zu verstehen, wer, wann, wo und wie die Sicherung durchgeführt wird – und gleichzeitig hyperkonfigurierbar für bestimmte Datendienste für zusätzliche Konsistenz und Anwendungsbewusstsein. Denken Sie daran, die Dokumentation zum Backup zu lesen – und nutzen Sie auch eine kostenlose Testversion .

    Portworx | Technischer Marketingleiter