Dieses Dokument enthält eine Anleitung zum Migrieren von Primärschlüsseln von Ihre Quelldatenbanktabellen in Spanner übertragen. Sie müssen mit die verfügbaren Informationen Übersicht über die Migration von Primärschlüsseln.
Hinweis
-
So erhalten Sie die Berechtigungen, die Sie zum Migrieren von Primärschlüsseln zu Spanner benötigen: bitten Sie Ihren Administrator, Ihnen IAM-Rolle Cloud Spanner-Datenbankadministrator (
roles/spanner.databaseAdmin
) für die Instanz.
Automatisch generierte sequenzielle Schlüssel migrieren
Wenn Sie von einer Datenbank mit sequenziellen monotonen Schlüsseln migrieren,
z. B. AUTO_INCREMENT
in MySQL, SERIAL
in PostgreSQL oder den Standard-IDENTITY
-Typ in SQL Server oder Oracle,
stellen Sie sich folgende allgemeine Migrationsstrategie vor:
- Replizieren Sie die Tabellenstruktur aus Ihrer Quelldatenbank in Spanner mit einem Ganzzahlprimärschlüssel.
- Erstellen Sie für jede Spalte in Spanner, die sequenzielle Werte enthält, eine Sequenz und weisen Sie die Funktion
GET_NEXT_SEQUENCE_VALUE
(GoogleSQL, PostgreSQL) als Standardwert für die Spalte zu. - Vorhandene Daten mit ursprünglichen Schlüsseln aus der Quelle migrieren in Spanner importieren können. Erwägen Sie die Verwendung des Spanner-Migrationstool oder Dataflow-Vorlage.
- Optional können Sie auch Fremdschlüsseleinschränkungen für beliebige abhängigen Tabellen.
- Passen Sie den Spanner an, bevor Sie neue Daten einfügen , um den Bereich der vorhandenen Schlüssel/Wert-Paare zu überspringen.
- Fügen Sie neue Daten ein, damit die Sequenz automatisch eindeutige Schlüssel generieren kann.
Beispiel für einen Migrationsworkflow
Mit dem folgenden Code werden die Tabellenstruktur und die zugehörige Reihenfolge in
Spanner mit einer
SEQUENCE
-Objekt und legt das Objekt fest.
als primären Standardwert der Zieltabelle:
GoogleSQL
CREATE SEQUENCE singer_id_sequence OPTIONS ( SequenceKind = 'bit_reversed_positive' ); CREATE TABLE Singers ( SingerId INT64 DEFAULT (GET_NEXT_SEQUENCE_VALUE(SEQUENCE SingerIdSequence)), Name STRING(1024), Biography STRING(MAX), ) PRIMARY KEY (SingerId); CREATE TABLE Albums ( AlbumId INT64, SingerId INT64, AlbumName STRING(1024), SongList STRING(MAX), CONSTRAINT FK_singer_album FOREIGN KEY (SingerId) REFERENCES Singers (SingerId) ) PRIMARY KEY (AlbumId);
PostgreSQL
CREATE SEQUENCE SingerIdSequence BIT_REVERSED_POSITIVE; CREATE TABLE Singers ( SingerId BIGINT DEFAULT nextval('SingerIdSequence') PRIMARY KEY, Name VARCHAR(1024) NOT NULL, Biography TEXT ); CREATE TABLE Albums ( AlbumId BIGINT PRIMARY KEY, SingerId BIGINT, AlbumName VARCHAR(1024), SongList TEXT, CONSTRAINT FK_singer_album FOREIGN KEY (SingerId) REFERENCES Singers (SingerId) );
Die Option bit_reversed_positive
gibt an, dass die von der Sequenz generierten Werte vom Typ INT64
sind, größer als null und nicht sequenziell sind.
Wenn Sie vorhandene Zeilen aus Ihrer Quelldatenbank zu Spanner migrieren, bleiben die Primärschlüssel unverändert.
Bei neuen Einträgen, für die kein Primärschlüssel angegeben ist, ruft Spanner automatisch die Funktion GET_NEXT_SEQUENCE_VALUE()
(GoogleSQL oder PostgreSQL) auf, um einen neuen Wert abzurufen.
Diese Werte sind gleichmäßig über den Bereich [1, 263]
verteilt und es kann zu Kollisionen mit den vorhandenen Schlüsseln kommen. Um dies zu verhindern,
Konfigurieren Sie die Sequenz mit ALTER_SEQUENCE
(GoogleSQL oder PostgreSQL), um den Bereich
Werte, die von den vorhandenen Schlüsseln abgedeckt werden.
Angenommen, die Tabelle singers
wurde von PostgreSQL migriert, wobei ihr Primärschlüssel
singer_id
ist vom Typ SERIAL
. Das folgende PostgreSQL zeigt die DDL Ihrer Quelldatenbank:
PostgreSQL
CREATE TABLE Singers ( SingerId SERIAL PRIMARY KEY, Name varchar(1024), Biography varchar );
Die Primärschlüsselwerte werden kontinuierlich erhöht. Nach der Migration können Sie den Maximalwert des Primärschlüssels singer_id
in Spanner abrufen.
Verwenden Sie den folgenden Code in Spanner:
GoogleSQL
SELECT MAX(SingerId) FROM Singers;
PostgreSQL
SELECT MAX(SingerId) FROM Singers;
Angenommen,der zurückgegebene Wert ist 20.000. Sie können die Spanner-Sequenz so konfigurieren, dass der Bereich [1, 21000]
übersprungen wird. Die zusätzlichen 1.000 dienen als Puffer, um Schreibvorgänge in der Quelldatenbank nach der anfänglichen Migration zu ermöglichen.
In Spanner generierte neue Schlüssel stehen nicht im Konflikt mit dem Bereich der Primärschlüssel, die in der PostgreSQL-Quelldatenbank generiert wurden.
Verwenden Sie in Spanner den folgenden Code:
GoogleSQL
ALTER SEQUENCE SingerIdSequence SET OPTIONS ( skip_range_min = 1, skip_range_max = 21000 );
PostgreSQL
ALTER SEQUENCE SingerIdSequence SKIP RANGE 1 21000;
Spanner und die Quelldatenbank verwenden
Sie können das Konzept des Sprungbereichs verwenden, um Szenarien zu unterstützen, in denen entweder Spanner oder Ihre Quelldatenbank Primärschlüssel generiert, z. B. um die Replikation in beide Richtungen für die Notfallwiederherstellung während einer Migrationsumstellung zu ermöglichen.
Dazu werden in beiden Datenbanken Primärschlüssel generiert und die Daten werden zwischen ihnen synchronisiert. Sie können jede Datenbank so konfigurieren, dass Primärschlüssel in nicht überlappenden Schlüsselbereichen erstellt werden. Wenn Sie einen Bereich für Ihre Quelldatenbank definieren, können Sie die Spanner-Sequenz so konfigurieren, dass dieser Bereich übersprungen wird.
Nach der Migration der Anwendung für Musiktitel können Sie beispielsweise die Daten von PostgreSQL zu Spanner replizieren, um die Umstellungszeit zu verkürzen.
Nachdem Sie die Anwendung in Spanner aktualisiert und getestet haben, können Sie die PostgreSQL-Quelldatenbank nicht mehr verwenden und stattdessen Spanner verwenden. Spanner wird dann zum System of Record für Aktualisierungen und neue Primärschlüssel. Sobald Spanner die Übernahme übernommen hat, können Sie den Vorgang rückgängig machen. zwischen den Datenbanken in die PostgreSQL-Instanz übertragen.
Angenommen, Ihre PostgreSQL-Quelldatenbank verwendet SERIAL
Primärschlüssel, die 32-Bit-ganze Zahlen mit Vorzeichen sind. Primärschlüssel von Spanner sind größer als 64 Bit.
Zahlen. Ändern Sie in PostgreSQL die Primärschlüsselspalte in eine 64-Bit-Spalte.
oder bigint
. Verwenden Sie den folgenden Code in Ihrer PostgreSQL-Quelldatenbank:
PostgreSQL
ALTER TABLE Singers ALTER COLUMN SingerId TYPE bigint;
Sie können der Tabelle in der PostgreSQL-Quelldatenbank eine CHECK
-Einschränkung festlegen, damit die Werte des SingerId
-Primärschlüssels immer kleiner oder gleich 231-1
sind.
Verwenden Sie den folgenden Code in Ihrer PostgreSQL-Quelldatenbank:
PostgreSQL
ALTER TABLE Singers ADD CHECK (SingerId <= 2147483647);
In Spanner können wir die Sequenz so ändern, dass der Bereich [1, 231-1]
übersprungen wird.
Verwenden Sie den folgenden Code in Spanner:
GoogleSQL
ALTER SEQUENCE SingerIdSequence SET OPTIONS (
skip_range_min = 1,
skip_range_max = 2147483647 -- 231-1
);
PostgreSQL
ALTER SEQUENCE SingerIdSequence SKIP RANGE 1 2147483648;
Ihre PostgreSQL-Quelldatenbank generiert immer Schlüssel im Bereich der 32‑Bit-Ganzzahlen, während Spanner-Schlüssel auf den Bereich der 64‑Bit-Ganzzahlen beschränkt sind, der größer als alle 32‑Bit-Ganzzahlwerte ist. So können beide Datenbanken unabhängig voneinander Primärschlüssel generieren, die nicht in Konflikt stehen.
UUID-Schlüsselspalten migrieren
UUIDv4-Schlüssel sind unabhängig von ihrem Ursprung eindeutig. UUID-Schlüssel, die an anderer Stelle generiert wurden, werden in neue UUID-Schlüssel integriert, die in Spanner.
Betrachten Sie die folgende allgemeine Strategie für die Migration UUID-Schlüssel für Spanner:
- Definieren Sie Ihre UUID-Schlüssel in Spanner mithilfe von Stringspalten mit einer
Standardausdruck. Verwenden Sie die Funktion
GENERATE_UUID()
(GoogleSQL, PostgreSQL). - Exportieren Sie die Daten aus dem Quellsystem und serialisieren Sie die UUID-Schlüssel als Strings.
- Importieren Sie die Primärschlüssel in Spanner.
- Optional: Aktivieren Sie Fremdschlüssel.
Hier ein Beispiel für einen Migrationsworkflow:
Definieren Sie in Spanner eine UUID-Primärschlüsselspalte als STRING
- oder TEXT
-Typ und weisen Sie GENERATE_UUID()
(GoogleSQL oder PostgreSQL) als Standardwert zu. Migrieren Sie alle Daten aus Ihrer Quelldatenbank zu Spanner. Nach der Migration ruft Spanner GENERATE_UUID()
auf, um neue UUID-Werte für die Primärschlüssel zu generieren, wenn neue Zeilen eingefügt werden. Der Primärschlüssel
FanClubId
ruft einen UUIDv4-Wert ab, wenn eine neue Zeile in die Tabelle FanClubs
eingefügt wird.
Verwenden Sie in Spanner den folgenden Code:
GoogleSQL
CREATE TABLE Fanclubs ( FanClubId STRING(36) DEFAULT (GENERATE_UUID()), ClubName STRING(1024), ) PRIMARY KEY (FanClubId); INSERT INTO FanClubs (ClubName) VALUES ("SwiftFanClub");
PostgreSQL
CREATE TABLE FanClubs ( FanClubId TEXT DEFAULT spanner.generate_uuid() PRIMARY KEY, ClubName VARCHAR(1024) ); INSERT INTO FanClubs (ClubName) VALUES ('SwiftFanClub');
Eigene Primärschlüssel migrieren
Ihre Anwendung kann die Reihenfolge der Primärschlüssel verwenden, um zu bestimmen, wie aktuell die Daten sind, oder um neu erstellte Daten zu sequenzieren. Wenn Sie extern generierte sequenzielle Schlüssel in Spanner verwenden möchten, können Sie einen zusammengesetzten Schlüssel erstellen, der einen gleichmäßig verteilten Wert, z. B. einen Hash, als erste Komponente und den sequenziellen Schlüssel als zweite Komponente kombiniert. So können Sie die sequenziellen Schlüsselwerte beibehalten, ohne Hotspots im großen Maßstab zu schaffen. Beachten Sie den folgenden Migrationsablauf:
Angenommen, Sie müssen eine MySQL-Tabelle students
mit einem
Primärschlüssel von AUTO_INCREMENT
für Spanner.
Verwenden Sie den folgenden Code in Ihrer MySQL-Quelldatenbank:
MySQL
CREATE TABLE Students ( StudentId INT NOT NULL AUTO_INCREMENT, Info VARCHAR(2048), PRIMARY KEY (StudentId) );
In Spanner können Sie eine generierte Spalte StudentIdHash
hinzufügen, indem Sie den Hashwert von
der Spalte StudentId
.
Beispiel:
StudentIdHash = FARM_FINGERPRINT(CAST(StudentId AS STRING))
Sie können den folgenden Code in Spanner verwenden:
GoogleSQL
CREATE TABLE student ( StudentIdHash INT64 AS (FARM_FINGERPRINT(cast(StudentId as string))) STORED, StudentId INT64 NOT NULL, Info STRING(2048), ) PRIMARY KEY(StudentIdHash, StudentId);
PostgreSQL
CREATE TABLE Student ( StudentIdHash bigint GENERATED ALWAYS AS (FARM_FINGERPRINT(cast(StudentId AS varchar))) STORED, StudentId bigint NOT NULL, Info varchar(2048), PRIMARY KEY (StudentIdHash, StudentId) );