Bermigrasi dari PostgreSQL ke Spanner (dialek PostgreSQL)

Halaman ini menjelaskan cara memigrasikan database PostgreSQL open source (mulai sekarang disebut hanya sebagai PostgreSQL) ke database dialek PostgreSQL Spanner (mulai sekarang disebut sebagai Spanner).

Untuk informasi tentang migrasi ke Spanner dan dialek GoogleSQL, lihat Bermigrasi dari PostgreSQL ke Spanner (dialek GoogleSQL).

Batasan migrasi

Spanner menggunakan konsep tertentu secara berbeda dengan alat pengelolaan database perusahaan lainnya, sehingga Anda mungkin perlu menyesuaikan arsitektur aplikasi untuk memanfaatkan kemampuannya secara maksimal. Anda mungkin juga perlu melengkapi Spanner dengan layanan lain dari Google Cloud untuk memenuhi kebutuhan Anda.

Prosedur dan pemicu tersimpan

Spanner tidak mendukung menjalankan kode pengguna di level database. Jadi, sebagai bagian dari migrasi, logika bisnis yang diimplementasikan oleh prosedur dan pemicu tersimpan level database harus dipindahkan ke aplikasi.

Urutan

Spanner merekomendasikan penggunaan UUID Versi 4 sebagai metode default untuk menghasilkan nilai kunci utama. Fungsi GENERATE_UUID() (GoogleSQL, PostgreSQL) menampilkan nilai UUID Versi 4 yang direpresentasikan sebagai jenis STRING.

Jika Anda perlu menghasilkan nilai bilangan bulat, Spanner mendukung urutan positif terbalik bit (GoogleSQL, PostgreSQL), yang menghasilkan nilai yang didistribusikan secara merata di seluruh ruang angka 64-bit positif. Anda dapat menggunakan angka-angka ini untuk menghindari masalah hotspotting.

Untuk mengetahui informasi selengkapnya, lihat strategi nilai default utama utama.

Kontrol akses

Spanner mendukung kontrol akses terperinci di tingkat tabel dan kolom. Kontrol akses yang mendetail untuk tampilan tidak didukung. Untuk informasi selengkapnya, lihat Tentang kontrol akses terperinci.

Proses migrasi

Migrasi melibatkan tugas-tugas berikut:

  • Memetakan skema PostgreSQL ke Spanner.
  • Menerjemahkan kueri SQL.
  • Membuat instance, database, dan skema Spanner.
  • Memfaktorkan ulang aplikasi agar berfungsi dengan database Spanner Anda.
  • Memigrasikan data.
  • Memverifikasi sistem baru dan memindahkannya ke status produksi.

Langkah 1: Petakan skema PostgreSQL Anda ke Spanner

Langkah pertama Anda dalam memindahkan database dari PostgreSQL open source ke Spanner adalah menentukan perubahan skema yang harus dilakukan.

Kunci utama

Di Spanner, setiap tabel yang harus menyimpan lebih dari satu baris harus memiliki kunci utama yang terdiri dari satu atau beberapa kolom tabel. Kunci utama tabel Anda secara unik mengidentifikasi setiap baris dalam tabel, dan Spanner menggunakan kunci utama untuk mengurutkan baris tabel. Karena Spanner sangat terdistribusi, Anda harus memilih teknik pembuatan kunci utama yang diskalakan dengan baik seiring dengan pertumbuhan data Anda. Untuk informasi selengkapnya, lihat strategi migrasi utama yang kami rekomendasikan.

Perhatikan bahwa setelah menentukan kunci utama, Anda tidak dapat menambahkan atau menghapus kolom kunci utama, atau mengubah nilai kunci utama nanti tanpa menghapus dan membuat ulang tabel. Untuk mengetahui informasi selengkapnya tentang cara menetapkan kunci utama, lihat Model data dan skema - kunci utama.

Indeks

Indeks b-tree PostgreSQL mirip dengan indeks sekunder di Spanner. Dalam database Spanner, Anda menggunakan indeks sekunder untuk mengindeks kolom yang sering ditelusuri guna mendapatkan performa yang lebih baik, dan untuk mengganti batasan UNIQUE yang ditentukan dalam tabel Anda. Misalnya, jika DDL PostgreSQL Anda memiliki pernyataan ini:

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

Anda akan menggunakan pernyataan ini di DDL Spanner:

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

Anda dapat menemukan indeks untuk setiap tabel PostgreSQL dengan menjalankan perintah meta \di di psql.

Setelah menentukan indeks yang diperlukan, tambahkan pernyataan CREATE INDEX untuk membuatnya. Ikuti panduan di Indeks sekunder.

Spanner menerapkan indeks sebagai tabel, sehingga mengindeks kolom secara monoton (seperti yang berisi data TIMESTAMP) dapat menyebabkan hotspot. Lihat Yang perlu diketahui DBA tentang Spanner, bagian 1: Kunci dan indeks untuk mengetahui informasi selengkapnya tentang metode menghindari hotspot.

Spanner menerapkan indeks sekunder dengan cara yang sama seperti tabel, sehingga nilai kolom yang akan digunakan sebagai kunci indeks akan memiliki batasan yang sama dengan kunci utama tabel. Ini juga berarti bahwa indeks memiliki jaminan konsistensi yang sama dengan tabel Spanner.

Pencarian nilai menggunakan indeks sekunder pada dasarnya sama dengan kueri dengan gabungan tabel. Anda dapat meningkatkan performa kueri menggunakan indeks dengan menyimpan salinan nilai kolom tabel asli dalam indeks sekunder menggunakan klausa INCLUDE, sehingga menjadikannya indeks cakupan.

Pengoptimal kueri Spanner hanya secara otomatis menggunakan indeks sekunder saat indeks itu sendiri menyimpan semua kolom yang dikueri (kueri yang tercakup). Untuk memaksa penggunaan indeks saat membuat kueri kolom dalam tabel asli, Anda harus menggunakan perintah Force INDEX dalam pernyataan SQL, misalnya:

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

Berikut adalah contoh pernyataan DDL yang membuat indeks sekunder untuk tabel Album:

CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);

Jika Anda membuat indeks tambahan setelah data dimuat, pengisian indeks mungkin memerlukan waktu beberapa saat. Sebaiknya batasi frekuensi penambahan jumlah resource menjadi rata-rata tiga per hari. Untuk panduan lebih lanjut mengenai cara membuat indeks sekunder, lihat Indeks sekunder. Untuk mengetahui informasi selengkapnya tentang batasan pembuatan indeks, lihat Pembaruan skema.

Tabel Virtual

Tampilan Spanner bersifat hanya baca. Tidak dapat digunakan untuk menyisipkan, memperbarui, atau menghapus data. Untuk informasi lebih lanjut, lihat bagian Views.

Kolom yang dihasilkan

Spanner mendukung kolom yang dibuat. Lihat Membuat dan mengelola kolom yang dihasilkan untuk mengetahui perbedaan dan batasan sintaksis.

Tabel yang disisipkan

Spanner memiliki fitur yang memungkinkan Anda menentukan dua tabel sebagai hubungan induk-turunan 1-banyak. Fitur ini menyisipkan baris data turunan di samping baris induknya dalam penyimpanan, sehingga menggabungkan tabel terlebih dahulu dan meningkatkan efisiensi pengambilan data saat induk dan turunan dikueri bersama.

Kunci utama tabel turunan harus dimulai dengan kolom kunci utama dari tabel induk. Dari perspektif baris turunan, kunci utama baris induk disebut sebagai kunci asing. Anda dapat menentukan hingga 6 tingkat hubungan induk-turunan.

Anda dapat menentukan tindakan ON DELETE untuk tabel turunan guna menentukan apa yang terjadi jika baris induk dihapus: semua baris turunan dihapus, atau penghapusan baris induk diblokir saat baris turunan ada.

Berikut contoh pembuatan tabel Album yang disisipi di tabel Singers induk yang ditentukan sebelumnya:

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

Untuk informasi selengkapnya, lihat Membuat tabel sisipan.

Jenis data

Tabel berikut mencantumkan jenis data PostgreSQL open source yang tidak didukung oleh antarmuka PostgreSQL untuk Spanner.

Jenis data Gunakan sebagai gantinya
bigserial,serial8 Bigint, int8
bit [ (n) ] -
bit bervariasi [ (n) ], varbit [ (n) ] -
box -
karakter [ (n) ], karakter [ (n) ] karakter bervariasi
cidr teks
lingkaran -
inet teks
bilangan bulat, int4 Bigint, int8
interval [bidang] [ (p) ] bigint
json jsonb
baris -
lseg -
macaddr teks
uang numerik, desimal
jalur -
pg_lsn -
point -
polygon -
realfloat4 presisi ganda, float8
smallint, int2 Bigint, int8
serial kecil, serial2 Bigint, int8
serial, serial4 Bigint, int8
waktu [ (p) ] [ tanpa zona waktu ] teks, menggunakan notasi HH:MM:SS.sss
waktu [ (p) ] dengan zona waktu teks, menggunakan notasi HH:MM:SS.sss+ZZZZ. Atau gunakan dua kolom.
stempel waktu [ (p) ] [ tanpa zona waktu ] teks atau timestamptz
tsquery -
tsvector -
txid_snapshot -
uuid teks atau bytea
xml teks

Langkah 2: Terjemahkan kueri SQL apa pun

Spanner memiliki banyak fungsi PostgreSQL open source yang tersedia untuk membantu mengurangi beban konversi.

Kueri SQL dapat dibuat profilnya menggunakan halaman Spanner Studio di Google Cloud Console untuk menjalankan kueri. Secara umum, kueri yang melakukan pemindaian tabel penuh pada tabel besar sangat mahal, dan harus digunakan secara hemat. Untuk mengetahui informasi selengkapnya tentang cara mengoptimalkan kueri SQL, lihat dokumentasi praktik terbaik SQL.

Langkah 3: Buat instance, database, dan skema Spanner

Buat instance dan buat database dalam dialek PostgreSQL. Kemudian, buat skema menggunakan bahasa definisi data (DDL) PostgreSQL.

Gunakan pg_dump untuk membuat pernyataan DDL yang menentukan objek dalam database PostgreSQL Anda, lalu ubah pernyataan seperti yang dijelaskan di bagian sebelumnya. Setelah memperbarui pernyataan DDL, gunakan pernyataan DDL untuk membuat database di instance Spanner.

Untuk informasi selengkapnya, lihat:

Langkah 4: Faktorkan ulang aplikasi

Menambahkan logika aplikasi untuk memperhitungkan skema yang dimodifikasi dan kueri SQL yang direvisi, serta untuk mengganti logika database-Resident seperti prosedur dan pemicu.

Langkah 5: Migrasikan data Anda

Ada dua cara untuk memigrasikan data Anda:

  • Dengan menggunakan Harbourbridge.

    Harbourbridge mendukung migrasi skema dan data. Anda dapat mengimpor file pg_dump atau file CSV, atau mengimpor melalui koneksi langsung ke database PostgreSQL open source.

  • Dengan menggunakan perintah COPY FROM STDIN.

    Untuk mengetahui detailnya, lihat perintah SALIN untuk mengimpor data.