Auf dieser Seite wird erläutert, wie Sie eine Open-Source-PostgreSQL-Datenbank (im Folgenden nur PostgreSQL) zu einer Datenbank mit dem Spanner-PostgreSQL-Dialekt (im Folgenden nur Spanner) migrieren.
Informationen zur Migration zu Spanner und zum GoogleSQL-Dialekt finden Sie unter Von PostgreSQL zu Spanner (GoogleSQL-Dialekt) migrieren.
Migrationseinschränkungen
Bei Spanner werden bestimmte Konzepte anders als bei anderen Verwaltungstools für Unternehmensdatenbanken verwendet. Daher müssen Sie möglicherweise die Architektur Ihrer Anwendung anpassen, um alle Funktionen nutzen zu können. Eventuell müssen Sie Spanner auch mit anderen Diensten vonGoogle Cloud ergänzen, damit Ihre Anforderungen erfüllt werden.
Gespeicherte Prozeduren und Trigger
Spanner unterstützt nicht die Ausführung von Nutzercode auf Datenbankebene. Daher muss im Rahmen der Migration die Geschäftslogik, die durch auf Datenbankebene gespeicherte Prozeduren und Trigger implementiert wird, in die Anwendung verschoben werden.
Sequenzen
Spanner empfiehlt, UUID-Version 4 als Standardmethode zum Generieren von Primärschlüsselwerten zu verwenden. Die Funktion GENERATE_UUID()
(GoogleSQL, PostgreSQL) gibt UUID-Version-4-Werte zurück, die als STRING
-Typ dargestellt werden.
Wenn Sie Ganzzahlwerte generieren müssen, unterstützt Spanner bitweise umgekehrte positive Sequenzen (GoogleSQL, PostgreSQL), die Werte erzeugen, die sich gleichmäßig über den positiven 64‑Bit-Zahlenbereich verteilen. Mit diesen Zahlen können Sie Probleme mit Hotspots vermeiden.
Weitere Informationen finden Sie unter Strategien für Standardwerte für Primärschlüssel.
Zugriffssteuerung
Spanner unterstützt eine detaillierte Zugriffssteuerung auf Tabellen- und Spaltenebene. Die detaillierte Zugriffssteuerung für Ansichten wird nicht unterstützt. Weitere Informationen finden Sie unter Detaillierte Zugriffssteuerung.
Migrationsprozess
Die Migration umfasst die folgenden Aufgaben:
- PostgreSQL-Schema zu Spanner zuordnen
- SQL-Abfragen übersetzen
- Spanner-Instanz, Datenbank und Schema erstellen
- Anwendung für die Arbeit mit der Spanner-Datenbank umgestalten
- Daten migrieren
- Neues System überprüfen und in Produktionsstatus übergehen
Schritt 1: PostgreSQL-Schema zu Spanner zuordnen
Bestimmen Sie beim Verschieben einer Datenbank von der Open-Source-Datenbank PostgreSQL zu Spanner zuerst, welche Änderungen am Schema erforderlich sind.
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 Ihrer Tabelle identifiziert jede Zeile in einer Tabelle eindeutig. Spanner verwendet den Primärschlüssel, um die Tabellenzeilen zu sortieren. Da Spanner stark verteilt ist, ist es wichtig, dass Sie eine Methode zur Generierung von Primärschlüsseln auswählen, die sich gut mit dem Wachstum Ihrer Daten skalieren lässt. Weitere Informationen finden Sie in den empfohlenen Strategien für die Migration von Primärschlüsseln.
Nachdem Sie den Primärschlüssel festgelegt haben, können Sie keine Primärschlüsselspalte hinzufügen oder entfernen und auch keinen Primärschlüsselwert ändern, ohne die Tabelle zu löschen und neu zu erstellen. Weitere Informationen zum Zuweisen 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 können Sie mit sekundären Indexen häufig gesuchte Spalten indizieren, um die Leistung zu verbessern, und UNIQUE
Einschränkungen in den Tabellen 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 können die folgende 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 Indizieren von kontinuierlich steigenden Spalten (wie solchen, die TIMESTAMP
-Daten enthalten) einen Hotspot verursachen kann.
Weitere Informationen zu diesem Ansatz 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 gelten für die als Indexschlüssel zu verwendenden Spaltenwerte dieselben Einschränkungen wie für 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 Kopien der Spaltenwerte aus der Originaltabelle mithilfe der INCLUDE
-Klausel im sekundären Index, was einem abdeckenden Index (Covering Index) entspricht.
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.
Aufrufe
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 Aufrufe.
Generierte Spalten
Spanner unterstützt generierte Spalten. Informationen zu Syntaxunterschieden und Einschränkungen finden Sie unter Generierte Spalten erstellen und verwalten.
Tabellen-Verschachtelung
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 zu bestimmen, was passiert, wenn die übergeordnete Zeile gelöscht wird: Entweder werden alle untergeordneten Zeilen gelöscht oder die übergeordnete Zeile kann nicht gelöscht werden, 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 Verschachtelte Tabellen erstellen.
Datentypen
In der folgenden Tabelle sind die Open-Source-PostgreSQL-Datentypen aufgeführt, die von der PostgreSQL-Schnittstelle für Spanner nicht unterstützt werden.
Datentyp | Verwenden Sie stattdessen |
---|---|
bigserial,serial8 | bigint, int8 |
bit [ (n) ] | - |
bit varying [ (n) ], varbit [ (n) ] | - |
box | - |
character [ (n) ], char [ (n) ] | character varying |
cidr | Text |
Kreis | - |
inet | Text |
integer, int4 | bigint, int8 |
interval [Felder] [ (p) ] | bigint |
json | jsonb |
Linie | - |
lseg | - |
macaddr | Text |
money | numeric, decimal |
Pfad | - |
pg_lsn | - |
point | - |
polygon | - |
realfloat4 | doppelte Genauigkeit, float8 |
smallint, int2 | bigint, int8 |
smallserial, serial2 | bigint, int8 |
serial, serial4 | 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. Sie können auch zwei Spalten verwenden. |
timestamp [ (p) ] [ ohne Zeitzone ] | text oder timestamptz |
tsquery | - |
tsvector | - |
txid_snapshot | - |
uuid | text oder bytea |
xml | Text |
Schritt 2: Alle SQL-Abfragen übersetzen
Spanner bietet viele der PostgreSQL-Funktionen, die in Open Source verfügbar sind, um die Umstellung zu erleichtern.
SQL-Abfragen können über die Spanner Studio-Seite in der Google Cloud -Console erstellt 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: Spanner-Instanz, Datenbank und Schema erstellen
Erstellen Sie die Instanz und eine Datenbank im PostgreSQL-Dialekt. Erstellen Sie dann Ihr Schema mit der PostgreSQL-Datendefinitionssprache (DDL).
Erstellen Sie mit pg_dump
DDL-Anweisungen, die Objekte in der PostgreSQL-Datenbank definieren. Verändern Sie dann die Anweisungen, wie in den vorherigen Abschnitten beschrieben. Nachdem Sie die DDL-Anweisungen aktualisiert haben, erstellen Sie mit den DDL-Anweisungen eine Datenbank in der Spanner-Instanz.
Weitere Informationen finden Sie unter:
Schritt 4: Anwendung neu strukturieren
Fügen Sie Anwendungslogik hinzu, um das geänderte Schema und die überarbeiteten SQL-Abfragen zu berücksichtigen und datenbankinterne Logik wie Prozeduren und Trigger zu ersetzen.
Schritt 5: Daten migrieren
Es gibt zwei Möglichkeiten, Ihre Daten zu migrieren:
Mit dem Spanner-Migrationstool
Das Spanner-Migrationstool unterstützt sowohl die Schema- als auch die Datenmigration. Sie können eine pg_dump-Datei oder eine CSV-Datei importieren oder Daten über eine direkte Verbindung zur Open-Source-PostgreSQL-Datenbank importieren.
Mit dem Befehl
COPY FROM STDIN
.Weitere Informationen finden Sie unter COPY-Befehl zum Importieren von Daten.