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.