Memigrasikan kunci utama

Dokumen ini menawarkan petunjuk untuk memigrasikan kunci utama dari tabel database sumber Anda ke Spanner. Anda harus memahami informasi yang tersedia di Ringkasan migrasi kunci utama.

Sebelum memulai

  • Untuk mendapatkan izin yang diperlukan guna memigrasikan kunci utama ke Spanner, minta administrator untuk memberi Anda peran IAM Cloud Spanner Database Admin (roles/spanner.databaseAdmin) di instance.

Memigrasikan kunci berurutan yang dibuat secara otomatis

Jika Anda bermigrasi dari database yang menggunakan kunci monoton berurutan, seperti AUTO_INCREMENT di MySQL, SERIAL di PostgreSQL, atau jenis IDENTITY standar di SQL Server atau Oracle, pertimbangkan strategi migrasi tingkat tinggi berikut:

  1. Di Spanner, replikasi struktur tabel dari database sumber Anda, menggunakan kunci utama bilangan bulat.
  2. Untuk setiap kolom di Spanner yang berisi nilai berurutan, buat urutan dan tetapkan fungsi GET_NEXT_SEQUENCE_VALUE (GoogleSQL, PostgreSQL) sebagai nilai default untuk kolom.
  3. Migrasikan data yang ada dengan kunci asli dari database sumber ke Spanner. Sebaiknya gunakan alat migrasi Spanner atau template Dataflow.
  4. Secara opsional, Anda dapat menetapkan batasan kunci asing untuk tabel dependen.
  5. Sebelum menyisipkan data baru, sesuaikan urutan Spanner untuk melewati rentang nilai kunci yang ada.
  6. Sisipkan data baru, sehingga urutan dapat menghasilkan kunci unik secara otomatis.

Contoh alur kerja migrasi

Kode berikut menentukan struktur tabel dan urutan terkait di Spanner menggunakan objek SEQUENCE dan menetapkan objek tersebut sebagai nilai utama default tabel tujuan:

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)
);

Opsi bit_reversed_positive menunjukkan bahwa nilai yang dihasilkan oleh urutan adalah jenis INT64, lebih besar dari nol, dan tidak berurutan.

Saat Anda memigrasikan baris yang ada dari database sumber ke Spanner, kunci utama tetap tidak berubah.

Untuk penyisipan baru yang tidak menentukan kunci utama, Spanner secara otomatis mengambil nilai baru dengan memanggil fungsi GET_NEXT_SEQUENCE_VALUE()(GoogleSQL atau PostgreSQL).

Nilai ini didistribusikan secara merata di seluruh rentang [1, 263] dan mungkin terjadi tabrakan dengan kunci yang ada. Untuk mencegah hal ini, Anda dapat mengonfigurasi urutan menggunakan ALTER_SEQUENCE (GoogleSQL atau PostgreSQL) untuk melewati rentang nilai yang tercakup oleh kunci yang ada.

Asumsikan tabel singers dimigrasikan dari PostgreSQL, dengan kunci utama singer_id berjenis SERIAL. PostgreSQL berikut menampilkan DDL database sumber Anda:

PostgreSQL

CREATE TABLE Singers (
SingerId SERIAL PRIMARY KEY,
Name varchar(1024),
Biography varchar
);

Nilai kunci utama meningkat secara monoton. Setelah migrasi, Anda dapat mengambil nilai maksimum kunci utama singer_id di Spanner. Gunakan kode berikut di Spanner:

GoogleSQL

SELECT MAX(SingerId) FROM Singers;

PostgreSQL

SELECT MAX(SingerId) FROM Singers;

Anggap nilai yang ditampilkan adalah 20.000. Anda dapat mengonfigurasi urutan Spanner untuk melewati rentang [1, 21000]. 1.000 tambahan berfungsi sebagai buffer untuk mengakomodasi operasi tulis ke database sumber setelah migrasi awal. Kunci baru yang dihasilkan di Spanner tidak bertentangan dengan rentang kunci utama yang dihasilkan di database PostgreSQL sumber. Gunakan kode berikut di Spanner:

GoogleSQL

ALTER SEQUENCE SingerIdSequence SET OPTIONS (
skip_range_min = 1,
skip_range_max = 21000
);

PostgreSQL

ALTER SEQUENCE SingerIdSequence SKIP RANGE 1 21000;

Menggunakan Spanner dan database sumber Anda

Anda dapat menggunakan konsep rentang lewati untuk mendukung skenario saat Spanner atau database sumber Anda menghasilkan kunci utama, misalnya untuk mengaktifkan replikasi dalam kedua arah untuk pemulihan dari bencana selama peralihan migrasi.

Untuk mendukung hal ini, kedua database menghasilkan kunci utama dan data disinkronkan di antara keduanya. Anda dapat mengonfigurasi setiap database untuk membuat kunci utama dalam rentang kunci yang tidak tumpang-tindih. Saat menentukan rentang untuk database sumber, Anda dapat mengonfigurasi urutan Spanner untuk melewati rentang tersebut.

Misalnya, setelah migrasi aplikasi trek musik, replikasi data dari PostgreSQL ke Spanner untuk mengurangi waktu yang diperlukan untuk melakukan pengalihan.

Setelah memperbarui dan menguji aplikasi di Spanner, Anda dapat berhenti menggunakan database PostgreSQL sumber dan menggunakan Spanner, sehingga menjadikannya sistem data untuk update dan kunci utama baru. Setelah Spanner mengambil alih, Anda dapat membalikkan aliran data antara database ke instance PostgreSQL.

Asumsikan database PostgreSQL sumber Anda menggunakan kunci utama SERIAL, yang merupakan bilangan bulat bertanda 32-bit. Kunci utama Spanner adalah angka 64-bit yang lebih besar. Di PostgreSQL, ubah kolom kunci utama menjadi kolom 64-bit, atau bigint. Gunakan kode berikut di database PostgreSQL sumber Anda:

PostgreSQL

ALTER TABLE Singers ALTER COLUMN SingerId TYPE bigint;

Anda dapat menetapkan batasan CHECK ke tabel di database PostgreSQL sumber untuk memastikan nilai kunci utama SingerId selalu lebih kecil dari atau sama dengan 231-1. Gunakan kode berikut di database PostgreSQL sumber Anda:

PostgreSQL

ALTER TABLE Singers ADD CHECK (SingerId <= 2147483647);

Di Spanner, kita dapat mengubah urutan untuk melewati rentang [1, 231-1]. Gunakan kode berikut di 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;

Database PostgreSQL sumber Anda selalu menghasilkan kunci dalam ruang bilangan bulat 32-bit, sedangkan kunci Spanner dibatasi pada ruang bilangan bulat 64-bit, yang lebih besar dari semua nilai bilangan bulat 32-bit. Hal ini memastikan kedua database Anda dapat menghasilkan kunci utama secara independen yang tidak bertentangan.

Memigrasikan kolom kunci UUID

Kunci UUIDv4 secara efektif unik, terlepas dari tempat kunci tersebut dibuat. Kunci UUID yang dibuat di tempat lain akan terintegrasi dengan kunci UUID baru yang dibuat di Spanner.

Pertimbangkan strategi tingkat tinggi berikut untuk memigrasikan kunci UUID ke Spanner:

  1. Tentukan kunci UUID Anda di Spanner menggunakan kolom string dengan ekspresi default. Gunakan fungsi GENERATE_UUID() (GoogleSQL, PostgreSQL).
  2. Mengekspor data dari sistem sumber, yang melakukan serialisasi kunci UUID sebagai string.
  3. Impor kunci utama ke Spanner.
  4. Opsional: Aktifkan kunci asing.

Berikut adalah contoh alur kerja migrasi:

Di Spanner, tentukan kolom kunci utama UUID sebagai jenis STRING atau TEXT dan tetapkan GENERATE_UUID() (GoogleSQL atau PostgreSQL) sebagai nilai defaultnya. Migrasikan semua data dari database sumber Anda ke Spanner. Setelah migrasi, saat baris baru disisipkan, Spanner memanggil GENERATE_UUID() untuk membuat nilai UUID baru untuk kunci utama. Misalnya, kunci utama FanClubId mendapatkan nilai UUIDv4 saat baris baru disisipkan di tabel FanClubs. Gunakan kode berikut di Spanner:

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');

Memigrasikan kunci utama Anda sendiri

Aplikasi Anda dapat mengandalkan urutan kunci utama untuk menentukan seberapa baru data atau untuk mengurutkan data yang baru dibuat. Untuk menggunakan kunci berurutan yang dibuat secara eksternal di Spanner, Anda dapat membuat kunci komposit yang menggabungkan nilai yang didistribusikan secara merata, seperti hash, sebagai komponen pertama dan kunci berurutan sebagai komponen kedua. Dengan cara ini, Anda dapat mempertahankan nilai kunci berurutan, tanpa membuat hot spot dalam skala besar. Pertimbangkan alur kerja migrasi berikut:

Anggap Anda perlu memigrasikan tabel MySQL students dengan kunci utama AUTO_INCREMENT ke Spanner. Gunakan kode berikut di database MySQL sumber Anda:

MySQL

CREATE TABLE Students (
StudentId INT NOT NULL AUTO_INCREMENT,
Info VARCHAR(2048),
PRIMARY KEY (StudentId)
);

Di Spanner, Anda dapat menambahkan kolom StudentIdHash yang dihasilkan dengan membuat hash kolom StudentId. Contoh:

  StudentIdHash = FARM_FINGERPRINT(CAST(StudentId AS STRING))

Anda dapat menggunakan kode berikut di Spanner:

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)
);

Langkah selanjutnya