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.