Spanner zu einer Datenbank mit PostgreSQL-Dialekt migrieren

Auf dieser Seite werden wichtige Überlegungen und Schritte beschrieben, die Sie bei der Migration von Spanner zu einer anderen Datenbank mit PostgreSQL-Dialekt ausführen müssen, wenn Sie eine Anwendung aus Spanner oder Google Cloudverschieben möchten. Sie können die Informationen auf dieser Seite auch verwenden, wenn Sie die Umstellung Ihrer Datenbank nachvollziehen oder nachweisen möchten, z. B. für die Notfallplanung.

Die PostgreSQL-Schnittstelle von Spanner ist die beste Wahl für Anwendungen, die in einer anderen PostgreSQL-kompatiblen Umgebung bereitgestellt werden können, entweder in Google Cloudoder anderswo. Dank der vertrauten Syntax und Standardclients aus dem PostgreSQL-System können Entwickler und Betreiber ihre vorhandenen PostgreSQL-Kenntnisse und ‑Fähigkeiten mit der PostgreSQL-Oberfläche nutzen.

Es verwendet dieselbe Abfrageverarbeitung, Transaktionskoordination, verteilte Speicherung und Netzwerkinfrastruktur wie der GoogleSQL-Dialekt. Wenn Sie eine Datenbank benötigen, die Mobilität unterstützt, müssen Sie bei der Auswahl der PostgreSQL-Schnittstelle nicht auf die Skalierbarkeit, Konsistenz oder Preis-Leistungs-Vorteile von Spanner verzichten.

Weitere Informationen zu den Unterschieden zwischen den PostgreSQL- und Google SQL-Dialekten in Spanner

Die Schritte sind im Groben so:

  1. Spanner-spezifische Erweiterungen aus Abfragen und DDL-Anweisungen entfernen
  2. Schema migrieren
  3. Daten migrieren
  4. Anwendung migrieren

Spanner-spezifische Überlegungen

Die PostgreSQL-Schnittstelle von Spanner unterstützt PostgreSQL-Abfragen standardmäßig. Die meisten SQL-Abfragen, die in einer Spanner-Datenbank mit PostgreSQL-Dialekt ausgeführt werden, verhalten sich daher genauso wie in anderen PostgreSQL-kompatiblen Datenbanken. Bei diesem Ansatz ist die Anzahl der SQL-Änderungen und Änderungen am Datenzugriff, die zum Verschieben einer Anwendung von einer Plattform auf eine andere erforderlich sind, wahrscheinlich gering. Dadurch ist der Portierungsvorgang schneller, einfacher und weniger fehleranfällig als bei einer ähnlichen Datenbank mit GoogleSQL-Dialekt.

Neben der umfassenden PostgreSQL-Kompatibilität bietet die PostgreSQL-Schnittstelle eine Reihe von Spanner-spezifischen Erweiterungen. Wenn Sie diese Erweiterungen in Ihren Anwendungen verwenden, müssen Sie sie entfernen oder manuell PostgreSQL-Funktionen zuordnen. Einige bemerkenswerte Beispiele finden Sie unter Erweiterungen der Abfragesyntax und Erweiterungen der Schemaverwaltung (DDL).

Erweiterungen der Abfragesyntax

Die PostgreSQL-Schnittstelle von Spanner bietet eine Reihe von Spanner-spezifischen Erweiterungen. Die meisten verwenden das Präfix spanner. zur Identifizierung. In der folgenden Tabelle sind diese Erweiterungen und die Maßnahmen aufgeführt, die Sie möglicherweise ergreifen müssen, bevor dieselbe Anwendung in einer PostgreSQL-Datenbank ausgeführt werden kann.

Art der Erweiterung Bestimmte Erweiterungen Erforderliche Maßnahmen vor der Migration
Spanner-spezifische Funktionen Suchen Sie nach Funktionen mit dem Präfix spanner. und entfernen Sie diese Aufrufe.
Erweiterungen eingeben Entfernen Sie die VECTOR LENGTH-Syntax oder verwenden Sie pgvector.
Abfragesyntax Es sind keine Maßnahmen erforderlich, da Hinweise in Kommentaren dargestellt werden.
Weitere Informationen zu Leistungsüberlegungen finden Sie unter Abfragemigration.
Gespeicherte Systemprozeduren Entfernen Sie Anrufe an spanner.cancel_query().
Optional können Sie die Aufrufe durch ein PostgreSQL-Äquivalent ersetzen.
SET/SHOW-Vorgänge Kann ignoriert werden, da PostgreSQL keine integrierten Parameter hat, die mit spanner. beginnen. Das Festlegen von Variablen mit diesem Präfix hat daher keine Auswirkungen auf das erwartete Verhalten.

Schemaverwaltungs-Erweiterungen (DDL)

Spanner bietet eine Reihe von Erweiterungen für die Datenverwaltung, wie auf der Seite Datendefinitionssprache (DDL) beschrieben.

Erweiterung Erforderliche Maßnahmen vor der Migration
Verschränkte Tabellen
Hier werden viele-zu-eins-bezogene Daten gemeinsam im physischen Speicher gespeichert, was Joins zwischen ihnen erheblich effizienter macht.
Entfernen Sie die Klausel INTERLEAVE IN.
Commit-Zeitstempel
Ermöglicht das atomare Speichern des Commit-Zeitstempels einer Transaktion in einer Spalte.
Ersetzen Sie SPANNER.COMMIT_TIMESTAMP entweder durch einen PostgreSQL-Zeitstempeltyp und legen Sie den Zeitstempel in Ihrer Anwendung fest oder entfernen Sie diese Spalte.
Wiederherstellung zu einem bestimmten Zeitpunkt
Schützt vor versehentlichem Löschen oder Schreiben.
Entfernen Sie alle DDL-Anweisungen, die spanner.version_retention_period festlegen.
Gültigkeitsdauer (TTL)
Ermöglicht das automatische Löschen von Einträgen basierend auf ihrem Alter.
Entfernen Sie die Klausel TTL INTERVAL. Sie können eine cron oder eine geplante Aufgabe verwenden, um veraltete Dateien regelmäßig zu löschen. Zeilen.
Optimierungsoptionen
Mit diesen Optionen lässt sich das Risiko einer Leistungsregression minimieren, wenn sich das Abfrageoptimierungstool oder die Statistiken ändern.
Entfernen Sie DDL-Anweisungen, mit denen Optimierungsoptionen festgelegt werden.
Änderungsstreams
Beobachten und streamen Datenänderungen (Einfügen, Aktualisieren und Löschen) einer Spanner-Datenbank nahezu in Echtzeit.
Entfernen Sie alle DDL-Anweisungen, die sich auf Änderungsstreams beziehen.
Standard-Leiter
Hiermit können Sie den Leiter für Ihre Datenbank in bi- und multiregionalen Konfigurationen angeben.
Entfernen Sie alle DDL-Anweisungen, die spanner.default_leader festlegen.
Geopartitionierung
Mit dieser Funktion können Sie Zeilen in Ihrer Datenbanktabelle in verschiedenen Instanzkonfigurationen weiter segmentieren und speichern.
Entfernen Sie alle DDL-Anweisungen, die sich auf die Geopartitionierung beziehen.
Sequenzen
Spanner unterstützt nur die Sequenz bit_reversed_positive.
Ersetzen Sie bit_reversed_positive durch eine Sequenz, die in PostgreSQL verfügbar ist.

Schema-Migration

Sie können ein Datenbankschema in einem PostgreSQL-Dialekt in PostgreSQL-Syntax exportieren. Bei Datenbanken, die für die Verwendung der PostgreSQL-Schnittstelle konfiguriert sind, können Sie dies mit psql und dem PGAdapter tun. Der Sidecar-Proxy ermöglicht die Verwendung von Standard-PostgreSQL-Treibern oder Clientbibliotheken, um eine Verbindung zu Spanner herzustellen:

psql -v ON_ERROR_STOP=1 \
  --host "$PGADAPTER_HOST" \
  --port "$PGADAPTER_PORT" \
  --dbname "$SPANNER_DATABASE" \
  -qAtX \
  -c "show database ddl"

Sie können auch den folgenden gcloud-Befehl verwenden, um das Schema als PostgreSQL-kompatibles SQL-Script auszugeben:

gcloud spanner databases ddl describe databasename

Wenn in der Datenbank Spanner-spezifische Schemaerweiterungen verwendet werden, wie die unter Schemaverwaltungserweiterungen beschriebenen, werden diese beim Ausführen dieses Befehls aufgeführt. Sie müssen sie entfernen, bevor Sie das Schema zu PostgreSQL migrieren.

Datenmigration

Die PostgreSQL-Schnittstelle von Spanner unterstützt die COPY TO STDIN- und STDOUT-Erweiterungen von PostgreSQL mithilfe von PGAdapter. Dies ist eine Möglichkeit, Daten in Spanner zu laden und daraus zu exportieren. Weitere Informationen zum Befehl COPY finden Sie in der Dokumentation zum psql-Befehlszeilentool für Spanner.

Dieses Script exportiert kleinere Datenmengen (empfohlen für weniger als 100 GB Daten) von der PostgreSQL-Schnittstelle von Spanner in die neue PostgreSQL-Datenbank:

psql -h pgadapter-host -c "COPY $TABLE TO STDOUT BINARY" | \
psql -h postgresql-host -c "COPY $TABLE FROM STDIN BINARY"

Bei größeren Tabellen (mit mindestens 100 GB Daten) können Sie einen Dataflow-Export in eine CSV-Vorlage starten.

Mit dem Debezium-Kafka-Connector können Sie Live-Datenmigrationen durchführen, um Spanner-Aktualisierungen in PostgreSQL zu streamen. Sie können sie weiter anpassen, wenn Sie die Spanner Change Streams API verwenden, um direkt auf die CDC-Streams (Change Data Capture) zuzugreifen.

Abfragemigration

Die PostgreSQL-Schnittstelle für Spanner implementiert einen Großteil der gängigsten PostgreSQL-Abfragesyntaxen, -Funktionen und -Operatoren.

Wenn Sie Hinweise in Ihren Abfragen verwenden, müssen Sie diese nicht neu schreiben, da Abfragehinweise in Spanner in PostgreSQL-kompatiblen Kommentaren definiert werden:

SELECT s.FirstName, s.LastName,
 s.SingerInfo, a.AlbumTitle, a.Charts
FROM Singers AS s
LEFT OUTER JOIN/*@JOIN_METHOD=APPLY_JOIN*/ Albums AS a
 ON s.SingerId = a.SingerId;

Diese Kommentare werden vom Abfrageplaner von Spanner verarbeitet, aber in einer PostgreSQL-Datenbank ignoriert. Sie können sie also entweder einschließen oder entfernen.

Um in der neuen Umgebung eine optimale Leistung zu erzielen, müssen Abfragen und das Datenbankschema (z. B. Indexe) möglicherweise für die neue Umgebung optimiert werden. Wir empfehlen, Benchmark-Prüfungen durchzuführen, um dies empirisch zu bestätigen.

Anwendungsmigration

Die Migrationsstrategie für die Konnektivität Ihrer Anwendungen hängt von den ursprünglichen Entscheidungen ab, die bei der Konfiguration Ihrer Anwendung für die Verwendung von Spanner getroffen wurden, z. B. ob Sie PostgreSQL-Treiber, Spanner-Treiber oder Spanner-Clientbibliotheken verwenden. In diesem Abschnitt werden die Vor- und Nachteile der einzelnen Optionen beschrieben.

PostgreSQL-Treiber

Spanner unterstützt gängige PostgreSQL-Clients mit PGAdapter, einem leichten Proxy, der das PostgreSQL-Netzwerkprotokoll in die Low-Level-gRPC-Abfrage-APIs von Spanner übersetzt. Wenn Sie einen dieser Proxys verwenden, müssen Sie den Verbindungsstring aktualisieren, damit er direkt auf die neue PostgreSQL-Datenbank verweist, anstatt auf den PGAdapter-Proxy. Dieser Ansatz bietet eine gute Leistung und eine hohe Kompatibilität. Er eignet sich daher gut, wenn Portabilität an erster Stelle steht. Die meisten Abfragen, die über die PostgreSQL-Schnittstelle von Spanner ausgeführt werden, funktionieren auch in anderen PostgreSQL-Umgebungen. Das Gegenteil ist jedoch nicht unbedingt der Fall. PostgreSQL unterstützt Syntax und Funktionen, die Spanner nicht unterstützt.

Spanner-Treiber

Diese Treiber sind Spanner-spezifische Implementierungen für gängige Sprachen und Anwendungsframeworks. Der Spanner JDBC-Treiber (Java) implementiert beispielsweise dieselbe API wie der PostgreSQL JDBC-Treiber. Anwendungen, die den Spanner JDBC-Treiber verwenden, können ihren Buildprozess aktualisieren, um den entsprechenden integrierten PostgreSQL-Treiber zu verknüpfen, wenn sie die Anwendung mit PostgreSQL ausführen möchten. Diese Option eignet sich am besten, wenn Sie bereits Spanner verwenden oder eine leistungsstarke Lösung suchen, die Spanner-Features wie die Mutations API nutzt, die mit einem integrierten PostgreSQL-Treiber nicht verfügbar wären. Wenn Sie vollständige Kompatibilität mit integrierten Treibern und Wertübertragbarkeit benötigen, sollten Sie stattdessen die integrierten PostgreSQL-Treiber mit PGAdapter verwenden, um eine gewisse Anwendungsübertragbarkeit zu gewährleisten.

Weitere Informationen finden Sie unter PostgreSQL-Treiber und ORMs.

Spanner-Clientbibliotheken

Spanner bietet außerdem verschiedene idiomatische Clientbibliotheken, die direkten Zugriff auf Spanner bieten, ohne eine PostgreSQL-standardisierte Schnittstelle zu implementieren oder zu verwenden. Diese Clients bieten maximalen Zugriff auf Spanner-spezifische Funktionen, sind aber nicht API-kompatibel mit PostgreSQL-Treibern. Diese Optionen bieten die höchste Funktionsleistung, sind aber weniger portabel als die oben genannten Optionen.

Nächste Schritte