Bermigrasi dari PostgreSQL ke Spanner (dialek PostgreSQL)

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

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

Batasan migrasi

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

Prosedur tersimpan dan pemicu

Spanner tidak mendukung kode pengguna yang berjalan di tingkat database, sehingga sebagai bagian dari migrasi, logika bisnis yang diterapkan oleh prosedur dan pemicu yang disimpan di tingkat 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 yang dibalik bit-nya (GoogleSQL, PostgreSQL), yang menghasilkan nilai yang didistribusikan secara merata di seluruh ruang angka 64-bit positif. Anda dapat menggunakan angka ini untuk menghindari masalah hotspotting.

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

Kontrol akses

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

Proses migrasi

Migrasi melibatkan 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 Anda.
  • Memverifikasi sistem baru dan memindahkannya ke status produksi.

Langkah 1: Petakan skema PostgreSQL ke Spanner

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

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 mengidentifikasi setiap baris dalam tabel secara unik, dan Spanner menggunakan kunci utama untuk mengurutkan baris tabel. Karena Spanner sangat terdistribusi, Anda harus memilih teknik pembuatan kunci utama yang diskalakan dengan baik sesuai dengan pertumbuhan data Anda. Untuk informasi selengkapnya, lihat strategi migrasi kunci utama yang kami rekomendasikan.

Perhatikan bahwa setelah menetapkan 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 Skema dan model data - kunci utama.

Indeks

Indeks b-tree PostgreSQL mirip dengan indeks sekunder di Spanner. Di database Spanner, Anda menggunakan indeks sekunder untuk mengindeks kolom yang sering ditelusuri untuk performa yang lebih baik, dan untuk mengganti batasan UNIQUE yang ditentukan dalam tabel. 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 dapat menggunakan pernyataan berikut 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 tabel PostgreSQL apa pun dengan menjalankan meta-perintah \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 yang meningkat 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 untuk 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. Hal ini juga berarti bahwa indeks memiliki jaminan konsistensi yang sama dengan tabel Spanner.

Pencarian nilai menggunakan indeks sekunder secara efektif sama dengan kueri dengan join tabel. Anda dapat meningkatkan performa kueri menggunakan indeks dengan menyimpan salinan nilai kolom tabel asli di indeks sekunder menggunakan klausa INCLUDE, sehingga menjadi indeks cakupan.

Pengoptimal kueri Spanner hanya otomatis menggunakan indeks sekunder jika 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 penambahannya menjadi rata-rata tiga per hari. Untuk panduan selengkapnya tentang cara membuat indeks sekunder, lihat Indeks sekunder. Untuk mengetahui informasi selengkapnya tentang batasan pembuatan indeks, lihat Pembaruan skema.

Dilihat

Tampilan Spanner bersifat hanya baca. Set data tersembunyi tidak dapat digunakan untuk menyisipkan, memperbarui, atau menghapus data. Untuk informasi selengkapnya, lihat Tampilan.

Kolom yang dihasilkan

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

Interleaving tabel

Spanner memiliki fitur yang memungkinkan Anda menentukan dua tabel sebagai memiliki hubungan induk-turunan 1-banyak. Fitur ini menyisipkan baris data turunan di samping baris induknya dalam penyimpanan, yang secara efektif melakukan pra-penggabungan tabel 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 saat baris induk dihapus: semua baris turunan dihapus, atau penghapusan baris induk diblokir saat baris turunan ada.

Berikut adalah contoh pembuatan tabel Albums yang diselingi dalam tabel Penyanyi 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 mengetahui informasi selengkapnya, lihat Membuat tabel yang diselang-seling.

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) ], char [ (n) ] variasi karakter
cidr teks biasa
lingkaran -
inet teks biasa
bilangan bulat, int4 bigint, int8
interval [kolom] [ (p) ] bigint
json jsonb
baris -
lseg -
macaddr teks biasa
uang numerik, desimal
jalur -
pg_lsn -
point -
polygon -
realfloat4 presisi ganda, float8
smallint, int2 bigint, int8
smallserial, serial2 bigint, int8
serial, serial4 bigint, int8
waktu [ (p) ] [ tanpa zona waktu ] teks, menggunakan notasi HH:MM:SS.sss
waktu [ (p) ] dengan zona waktutimetz teks, menggunakan notasi HH:MM:SS.sss+ZZZZ. Atau gunakan dua kolom.
stempel waktu [ (p) ] [ tanpa zona waktu ] text atau timestamptz
tsquery -
tsvector -
txid_snapshot -
uuid text atau bytea
xml teks biasa

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 konsol Google Cloud untuk menjalankan kueri. Secara umum, kueri yang melakukan pemindaian tabel penuh pada tabel besar sangat mahal, dan harus digunakan seperlunya. Untuk 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 PostgreSQL (DDL).

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

Untuk informasi selengkapnya, lihat:

Langkah 4: Faktorkan ulang aplikasi

Tambahkan logika aplikasi untuk memperhitungkan skema yang diubah dan kueri SQL yang direvisi, serta untuk mengganti logika yang ada di database seperti prosedur dan pemicu.

Langkah 5: Migrasikan data Anda

Ada dua cara untuk memigrasikan data Anda:

  • Dengan menggunakan alat migrasi Spanner.

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

  • Dengan menggunakan perintah COPY FROM STDIN.

    Untuk mengetahui detailnya, lihat Perintah COPY untuk mengimpor data.