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 mengetahui informasi tentang cara bermigrasi 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 secara maksimal. Anda mungkin juga perlu melengkapi Spanner dengan layanan lain dari Google Cloud untuk memenuhi kebutuhan Anda.

Prosedur tersimpan dan pemicu

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

Urutan

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

Jika Anda perlu membuat nilai bilangan bulat, Spanner mendukung urutan positif yang dibalik bitnya (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 terperinci untuk tampilan tidak didukung. Untuk mengetahui 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 dapat berfungsi dengan database Spanner Anda.
  • Memigrasikan data Anda.
  • Memverifikasi sistem baru dan memindahkannya ke status produksi.

Langkah 1: Petakan skema PostgreSQL Anda ke Spanner

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

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 primer yang dapat diskalakan dengan baik seiring pertumbuhan data Anda. Untuk mengetahui 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 dicari agar performanya lebih baik, dan untuk menggantikan 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
     );

You can use the following statement in your Spanner DDL:

    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 Anda dengan menjalankan perintah meta \di di psql.

Setelah menentukan indeks yang Anda butuhkan, 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. Artinya, indeks juga memiliki karakteristik konsistensi yang sama dengan tabel Spanner.

Pencarian nilai menggunakan indeks sekunder pada dasarnya sama dengan kueri dengan penggabungan 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 lebih cenderung menggunakan indeks sekunder jika indeks itu sendiri menyimpan semua kolom yang dikueri (kueri tercakup). Untuk memaksa penggunaan indeks saat membuat kueri kolom yang tidak disimpan dalam indeks, Anda harus menggunakan direktif 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 kecepatan penambahan hingga 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.

Tampilan

Tampilan Spanner bersifat hanya baca. Objek ini tidak dapat digunakan untuk memasukkan, memperbarui, atau menghapus data. Untuk mengetahui 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.

Penyisipan tabel

Spanner memiliki fitur yang memungkinkan Anda menentukan dua tabel yang memiliki hubungan induk-turunan 1-ke-banyak. Fitur ini menyisipkan baris data turunan di samping baris induknya dalam penyimpanan, secara efektif menggabungkan tabel sebelumnya dan meningkatkan efisiensi pengambilan data saat induk dan turunan dikueri bersama-sama.

Kunci utama tabel turunan harus dimulai dengan kolom kunci utama tabel induk. Dari perspektif baris anak, 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: baik semua baris turunan dihapus, atau penghapusan baris induk diblokir saat baris turunan ada.

Berikut adalah contoh pembuatan tabel Album yang disisipkan dalam tabel induk Penyanyi 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 di-interleave.

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) ] character varying
cidr teks biasa
lingkaran -
inet teks biasa
integer, 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 waktu timetz 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 diprofilkan 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 dengan 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 Anda menggunakan bahasa definisi data (DDL) PostgreSQL.

Gunakan pg_dump untuk membuat pernyataan DDL yang menentukan objek di 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: Refaktorkan 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.