Von PostgreSQL zu Cloud Spanner migrieren (PostgreSQL-Dialekt)

Auf dieser Seite wird erläutert, wie Sie eine Open-Source-PostgreSQL-Datenbank (von jetzt an nur als PostgreSQL bezeichnet) zu einer PostgreSQL-Dialektdatenbank von Cloud Spanner (von nun an als Cloud Spanner bezeichnet) migrieren.

Informationen zur Migration zu Cloud Spanner und zum GoogleSQL-Dialekt finden Sie unter Von PostgreSQL zu Cloud Spanner migrieren (GoogleSQL-Dialekt).

Migrationseinschränkungen

Die Art und Weise, wie Cloud Spanner bestimmte Konzepte verwendet, unterscheidet sich von anderen Verwaltungstools für Unternehmensdatenbanken. Daher müssen Sie Ihre Anwendung möglicherweise anpassen, um die Funktionen optimal nutzen zu können. Möglicherweise müssen Sie Cloud Spanner auch durch andere Dienste von Google Cloud ergänzen, um Ihre Anforderungen zu erfüllen.

Gespeicherte Prozeduren und Trigger

Das Ausführen von Nutzercode auf Datenbankebene wird von Cloud Spanner nicht unterstützt. Daher müssen Sie im Rahmen der Migration die Geschäftslogik implementieren, die von gespeicherten Prozeduren und Triggern auf Datenbankebene in die Anwendung implementiert wird.

Sequenzen

Spanner empfiehlt, die UUID Version 4 als Standardmethode zum Generieren von Primärschlüsselwerten zu verwenden. Die Funktion GENERATE_UUID() (GoogleSQL, PostgreSQL) gibt Werte der UUID Version 4 zurück, die als STRING-Typ dargestellt werden.

Wenn Sie ganzzahlige Werte generieren müssen, unterstützt Cloud Spanner Bit-umgekehrte positive Sequenzen (GoogleSQL, PostgreSQL), die Werte erzeugen, die sich gleichmäßig über den positiven 64-Bit-Zahlenbereich verteilen. Sie können diese Nummern verwenden, um Heißlaufen zu vermeiden.

Weitere Informationen finden Sie unter Standard-Standardstrategien für Primärschlüssel.

Zugriffssteuerung

Cloud Spanner unterstützt eine fein abgestimmte Zugriffssteuerung auf Tabellen- und Spaltenebene. Eine detaillierte Zugriffssteuerung für Ansichten wird nicht unterstützt. Weitere Informationen finden Sie unter Detaillierte Zugriffssteuerung.

Migrationsprozess

Die Migration umfasst folgende Aufgaben:

  • PostgreSQL-Schema zu Cloud Spanner zuordnen
  • SQL-Abfragen übersetzen
  • Cloud Spanner-Instanz, -Datenbank und -Schema erstellen
  • Anwendung für die Arbeit mit der Cloud Spanner-Datenbank umgestalten
  • Daten migrieren
  • Neues System überprüfen und in Produktionsstatus übergehen

Schritt 1: PostgreSQL-Schema Cloud Spanner zuordnen

Der erste Schritt beim Verschieben einer Datenbank von Open-Source-PostgreSQL zu Cloud Spanner besteht darin, zu bestimmen, welche Schemaänderungen Sie vornehmen müssen.

Primärschlüssel

In Spanner muss jede Tabelle, die mehr als eine Zeile speichern muss, einen Primärschlüssel haben, der aus einer oder mehreren Spalten der Tabelle besteht. Der Primärschlüssel identifiziert jede Zeile in einer Tabelle eindeutig. Spanner verwendet den Primärschlüssel, um die Tabellenzeilen zu sortieren. Da Spanner hochgradig verteilt ist, ist es wichtig, dass Sie ein Verfahren zur Primärschlüsselgenerierung wählen, das gut mit dem Datenwachstum skaliert werden kann. Weitere Informationen finden Sie in den von uns empfohlenen Migrationsstrategien für Primärschlüssel.

Beachten Sie, dass Sie nach dem Festlegen des Primärschlüssels keine Primärschlüsselspalte hinzufügen oder entfernen oder später einen Primärschlüsselwert ändern können, ohne die Tabelle zu löschen und neu zu erstellen. Weitere Informationen zum Festlegen des Primärschlüssels finden Sie unter Schema und Datenmodell – Primärschlüssel.

Indexe

PostgreSQL-B-Tree-Indexe ähneln den sekundären Indexen in Spanner. In einer Spanner-Datenbank verwenden Sie sekundäre Indexe, um häufig gesuchte Spalten zu indexieren, was die Leistung verbessert, und um in den Tabellen angegebene UNIQUE-Einschränkungen zu ersetzen. Wenn die PostgreSQL-DDL beispielsweise folgende Anweisung enthält:

 CREATE TABLE customer (
    id CHAR (5) PRIMARY KEY,
    first_name VARCHAR (50),
    last_name VARCHAR (50),
    email VARCHAR (50) UNIQUE
 );

Sie würden diese Anweisung in Ihrer Spanner-DDL verwenden:

CREATE TABLE customer (
   id VARCHAR(5) PRIMARY KEY,
   first_name VARCHAR(50),
   last_name VARCHAR(50),
   email VARCHAR(50)
   );

CREATE UNIQUE INDEX customer_emails ON customer(email);

Wenn Sie die Indexe in PostgreSQL-Tabellen suchen, führen Sie den Meta-Befehl \di in psql aus.

Nachdem Sie die benötigten Indexe ermittelt haben, fügen Sie CREATE INDEX-Anweisungen hinzu, um sie zu erstellen. Folgen Sie der Anleitung unter Sekundäre Indexe.

Spanner implementiert Indexe als Tabellen, sodass das Indexieren von kontinuierlich steigenden Spalten (z. B. solchen, die TIMESTAMP-Daten enthalten) einen Hotspot verursachen kann. Weitere Informationen zu Methoden zur Vermeidung von Hotspots finden Sie unter Das sollten Datenbankadministratoren über Spanner wissen, Teil 1: Schlüssel und Indexe.

Spanner implementiert sekundäre Indexe auf dieselbe Weise wie Tabellen. Daher haben die Spaltenwerte, die als Indexschlüssel verwendet werden, die gleichen Einschränkungen wie die Primärschlüssel von Tabellen. Dies bedeutet auch, dass Indexe die gleichen Konsistenzgarantien wie Spanner-Tabellen haben.

Werte-Zuordnungen mit sekundären Indexen entsprechen praktisch einer Abfrage mit Tabellenverknüpfung. Sie können die Leistung von Abfragen mithilfe von Indexen verbessern. Speichern Sie dazu mithilfe der INCLUDE-Klausel Kopien der Spaltenwerte der ursprünglichen Tabelle im sekundären Index, wodurch dies ein abdeckender Index ist.

Die Abfrageoptimierung von Spanner verwendet nur dann automatisch einen sekundären Index, wenn der Index selbst alle abgefragten Spalten speichert (abgedeckte Abfrage). Wenn Sie erzwingen möchten, dass beim Abfragen von Spalten in der ursprünglichen Tabelle ein Index verwendet wird, müssen Sie in der SQL-Anweisung eine FORCE INDEX-Anweisung verwenden. Beispiel:

SELECT *
FROM MyTable /*@ FORCE_INDEX=MyTableIndex */
WHERE IndexedColumn=$1;

Hier ist ein Beispiel für eine DDL-Anweisung, die einen sekundären Index für die Album-Tabelle erstellt:

CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);

Wenn Sie nach dem Laden Ihrer Daten zusätzliche Indexe erstellen, kann das Auffüllen des Index einige Zeit in Anspruch nehmen. Daher wird empfohlen, maximal drei Indexe pro Tag hinzuzufügen. Eine ausführliche Anleitung zum Erstellen von sekundären Indexen finden Sie unter Sekundäre Indexe. Weitere Informationen zu den Einschränkungen bei der Indexerstellung finden Sie unter Schemaaktualisierungen.

Ansichten

Cloud Spanner-Ansichten sind schreibgeschützt. Sie können nicht zum Einfügen, Aktualisieren oder Löschen von Daten verwendet werden. Weitere Informationen finden Sie unter Ansichten.

Generierte Spalten

Spanner unterstützt generierte Spalten. Informationen zu Syntaxunterschieden und Einschränkungen finden Sie unter Generierte Spalten erstellen und verwalten.

Tabellenverschachtelung

Spanner hat ein Feature, mit dem Sie zwei Tabellen mit einer 1:n-Beziehung mit hierarchischer Struktur definieren können. Mit dieser Funktion werden die untergeordneten Datenzeilen mit der jeweils übergeordneten Zeile im Speicher verschränkt. Die Tabelle wird hierdurch vorab verknüpft und der Datenabruf erfolgt effizienter, wenn beide Tabellen (untergeordnet und übergeordnet) gemeinsam abgefragt werden.

Der Primärschlüssel der untergeordneten Tabelle muss mit der bzw. den Primärschlüsselspalten der übergeordneten Tabelle beginnen. Aus der Perspektive der untergeordneten Zeile wird der Primärschlüssel der übergeordneten Zeile als Fremdschlüssel bezeichnet. Sie können bis zu 6 Ebenen an hierarchischen Beziehungen definieren.

Sie können ON DELETE-Aktionen für untergeordnete Tabellen definieren, um festzulegen, was passiert, wenn die übergeordnete Zeile gelöscht wird: Entweder werden alle untergeordneten Zeilen gelöscht oder die übergeordnete Zeile wird blockiert, solange untergeordnete Zeilen vorhanden sind.

Hier sehen Sie anhand eines Beispiels, wie eine Album-Tabelle erstellt wird, die in der zuvor definierten übergeordneten Tabelle mit den Interpreten verschränkt ist:

CREATE TABLE Albums (
 SingerID      bigint,
 AlbumID       bigint,
 AlbumTitle    varchar,
 PRIMARY KEY (SingerID, AlbumID)
 )
 INTERLEAVE IN PARENT Singers ON DELETE CASCADE;

Weitere Informationen finden Sie unter Verschränkte Tabellen erstellen.

Datentypen

In der folgenden Tabelle sind die Open-Source-PostgreSQL-Datentypen aufgeführt, die von der PostgreSQL-Schnittstelle für Cloud Spanner nicht unterstützt werden.

Datentyp Stattdessen verwenden
Bigserial8 Bigint, int8
bit [ (n) ] -
Bit variieren [ (n) ], varbit [ (n) ] -
box -
Zeichen [ (n) ], char [ (n) ] Zeichen variieren
cidr Text
Kreis -
inet Text
Ganzzahl, Ganzzahl 4 Bigint, int8
Intervall [Felder] [ (p) ] bigint
json jsonb
Linie -
lseg -
macaddr Text
money numerisch, dezimal
Pfad -
pg_lsn -
point -
polygon -
realfloat4 Doppelte Genauigkeit, Gleitkommazahl
Smallint, Ganzzahl2 Bigint, int8
Smallserial, seriell2 Bigint, int8
seriell, seriell4 Bigint, int8
time [ (p) ] [ ohne Zeitzone ] Text mit der Schreibweise HH:MM:SS.sss
time [ (p) ] mit Zeitzonetimetz Text mit der Schreibweise HH:MM:SS.sss+ZZZZ Oder verwenden Sie zwei Spalten.
timestamp [ (p) ] [ ohne Zeitzone ] text odertimestamptz
tsquery -
tsvector -
txid_snapshot -
uuid Text oder Bytea
xml Text

Schritt 2: SQL-Abfragen übersetzen

In Cloud Spanner stehen viele der Open-Source-PostgreSQL-Funktionen zur Verfügung, mit denen sich der Konvertierungsaufwand verringern lässt.

SQL-Abfragen können mit der Spanner-Abfrageschnittstelle in der Google Cloud Console profiliert werden, um die Abfrage auszuführen. Im Allgemeinen sollten Abfragen, die vollständige Tabellenscans für große Tabellen ausführen, sparsam verwendet werden, da sie sehr teuer sind. Weitere Informationen zur Optimierung von SQL-Abfragen finden Sie in der Dokumentation zu Best Practices für SQL.

Schritt 3: Cloud Spanner-Instanz, -Datenbank und -Schema erstellen

Erstellen Sie die Instanz und eine Datenbank im PostgreSQL-Dialekt. Erstellen Sie dann das Schema mit der PostgreSQL-Datendefinitionssprache (DDL).

Erstellen Sie mit pg_dump DDL-Anweisungen, mit denen die Objekte in der PostgreSQL-Datenbank definiert werden, und ändern Sie die Anweisungen dann wie in den vorherigen Abschnitten beschrieben. Nachdem Sie die DDL-Anweisungen aktualisiert haben, erstellen Sie mit den DDL-Anweisungen die Datenbank in der Cloud Spanner-Instanz.

Weitere Informationen finden Sie unter:

Schritt 4: Anwendung refaktorieren

Fügen Sie Anwendungslogik hinzu, um das geänderte Schema und die überarbeiteten SQL-Abfragen zu berücksichtigen und datenbankbasierte Logik wie Prozeduren und Trigger zu ersetzen.

Schritt 5: Daten migrieren

Es gibt zwei Möglichkeiten, Ihre Daten zu migrieren:

  • Mit Harbourbridge

    Harbourbridge unterstützt sowohl Schema- als auch Datenmigration. Sie können eine pg_dump- oder CSV-Datei oder über eine direkte Verbindung zur Open-Source-PostgreSQL-Datenbank importieren.

  • Mit dem Befehl COPY FROM STDIN.

    Weitere Informationen finden Sie unter Befehl COPY zum Importieren von Daten kopieren.