Bermigrasi dari sistem OLTP Oracle® ke Spanner

Artikel ini menjelaskan cara memigrasikan database Anda dari sistem Pemrosesan Transaksi Online (OLTP) Oracle® ke Spanner.

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

Batasan migrasi

Saat memigrasikan aplikasi ke Spanner, Anda harus mempertimbangkan berbagai fitur yang tersedia. Anda mungkin perlu mendesain ulang arsitektur aplikasi agar sesuai dengan kumpulan fitur Spanner dan untuk berintegrasi dengan layanan Google Cloud tambahan.

Prosedur tersimpan dan pemicu

Spanner tidak mendukung kode pengguna yang berjalan di tingkat database, jadi sebagai bagian dari migrasi, Anda harus memindahkan logika bisnis yang diterapkan oleh prosedur dan pemicu tersimpan tingkat database ke dalam aplikasi.

Urutan

Sebaiknya gunakan UUID Versi 4 sebagai metode default untuk menghasilkan nilai kunci utama. Fungsi GENERATE_UUID() (GoogleSQL, PostgreSQL) menampilkan nilai UUID Versi 4 sebagai jenis STRING.

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

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

Kontrol akses

Spanner hanya mendukung kontrol akses tingkat database menggunakan izin dan peran akses IAM. Peran standar dapat memberikan akses baca-tulis atau hanya baca ke database.

Jika memerlukan izin yang lebih terperinci, Anda harus menerapkannya di lapisan aplikasi. Dalam skenario normal, hanya aplikasi yang boleh diizinkan untuk membaca dan menulis ke database.

Jika perlu mengekspos database kepada pengguna untuk pelaporan, dan ingin menggunakan izin keamanan terperinci (seperti izin tingkat tabel dan tampilan), Anda harus mengekspor database ke BigQuery.

Batasan validasi data

Spanner dapat mendukung sekumpulan batasan validasi data terbatas di lapisan database.

Jika Anda memerlukan batasan data yang lebih kompleks, terapkan di lapisan aplikasi.

Tabel berikut membahas jenis batasan yang biasa ditemukan di database Oracle®, dan cara menerapkannya dengan Spanner.

Batasan Implementasi dengan Spanner
Bukan null NOT NULLbatasan kolom
Unik Indeks sekunder dengan batasan UNIQUE
Kunci asing (untuk tabel normal) Lihat Membuat dan mengelola hubungan kunci asing.
Tindakan ON DELETE/ON UPDATE kunci asing Hanya dapat dilakukan untuk tabel yang diselingi, jika tidak, diterapkan di lapisan aplikasi
Pemeriksaan dan validasi nilai melalui pemicu atau batasan CHECK Diimplementasikan di lapisan aplikasi

Jenis data yang didukung

Database Oracle® dan Spanner mendukung kumpulan jenis data yang berbeda. Tabel berikut mencantumkan jenis data Oracle dan padanannya di Spanner. Untuk mengetahui definisi mendetail tentang setiap jenis data Spanner, lihat Jenis Data.

Anda mungkin juga harus melakukan transformasi tambahan pada data seperti yang dijelaskan di kolom Catatan agar data Oracle sesuai dengan database Spanner Anda.

Misalnya, Anda dapat menyimpan BLOB besar sebagai objek di bucket Cloud Storage, bukan di database, lalu menyimpan referensi URI ke objek Cloud Storage di database sebagai STRING.

Jenis data Oracle Padanan Spanner Catatan
Jenis karakter (CHAR, VARCHAR, NCHAR, NVARCHAR) STRING Catatan: Spanner menggunakan string Unicode di seluruh bagian.
Oracle mendukung panjang maksimum 32.000 byte atau karakter (bergantung pada jenis), sedangkan Spanner mendukung hingga 2.621.440 karakter.
BLOB, LONG RAW, BFILE BYTES atau STRING yang berisi URI ke objek. Objek kecil (kurang dari 10 MiB) dapat disimpan sebagai BYTES.
Pertimbangkan untuk menggunakan penawaran Google Cloud alternatif seperti Cloud Storage untuk menyimpan objek yang lebih besar.
CLOB, NCLOB, LONG STRING (berisi data atau URI ke objek eksternal) Objek kecil (kurang dari 2.621.440 karakter) dapat disimpan sebagai STRING. Pertimbangkan untuk menggunakan penawaran Google Cloud alternatif seperti Cloud Storage untuk menyimpan objek yang lebih besar.
NUMBER, NUMERIC, DECIMAL STRING, FLOAT64, INT64 Jenis data Oracle NUMBER mendukung presisi hingga 38 digit, sedangkan jenis data Spanner FLOAT64 mendukung presisi hingga 16 digit. Lihat Menyimpan data numerik presisi arbitrer untuk mekanisme alternatif.
INT, INTEGER, SMALLINT INT64
BINARY_FLOAT, BINARY_DOUBLE FLOAT64
DATE DATE Representasi STRING default dari jenis DATE Spanner adalah yyyy-mm-dd, yang berbeda dengan Oracle, jadi berhati-hatilah saat mengonversi secara otomatis ke dan dari representasi tanggal STRING. Fungsi SQL disediakan untuk mengonversi tanggal ke string berformat.
DATETIME TIMESTAMP Spanner menyimpan waktu secara independen dari zona waktu. Jika perlu menyimpan zona waktu, Anda harus menggunakan kolom STRING terpisah. Fungsi SQL disediakan untuk mengonversi stempel waktu menjadi string berformat menggunakan zona waktu.
XML STRING (berisi data atau URI ke objek eksternal) Objek XML kecil (kurang dari 2.621.440 karakter) dapat disimpan sebagai STRING. Pertimbangkan untuk menggunakan penawaran Google Cloud alternatif seperti Cloud Storage untuk menyimpan objek yang lebih besar.
URI, DBURI, XDBURI, HTTPURI STRING
ROWID PRIMARY KEY Spanner menggunakan kunci utama tabel untuk mengurutkan dan mereferensikan baris secara internal, sehingga di Spanner, kunci utama ini secara efektif sama dengan jenis data ROWID.
SDO_GEOMETRY, SDO_TOPO_GEOMETRY_SDO_GEORASTER   Spanner tidak mendukung jenis data geospasial. Anda harus menyimpan data ini menggunakan jenis data standar, dan menerapkan logika penelusuran dan pemfilteran di lapisan aplikasi.
ORDAudio, ORDDicom, ORDDoc, ORDImage, ORDVideo, ORDImageSignature Spanner tidak mendukung jenis data media. Pertimbangkan untuk menggunakan Cloud Storage untuk menyimpan data media.

Proses migrasi

Linimasa keseluruhan proses migrasi Anda adalah:

  1. Konversikan skema dan model data Anda.
  2. Menerjemahkan kueri SQL apa pun.
  3. Migrasikan aplikasi Anda untuk menggunakan Spanner selain Oracle.
  4. Mengekspor data secara massal dari Oracle dan mengimpor data ke Spanner menggunakan Dataflow.
  5. Pertahankan konsistensi antara kedua database selama migrasi.
  6. Migrasikan aplikasi Anda dari Oracle.

Langkah 1: Konversi database dan skema Anda

Anda mengonversi skema yang ada ke skema Spanner untuk menyimpan data. Hal ini harus cocok dengan skema Oracle yang ada sedekat mungkin untuk mempermudah modifikasi aplikasi. Namun, karena perbedaan fitur, beberapa perubahan akan diperlukan.

Menggunakan praktik terbaik dalam desain skema dapat membantu Anda meningkatkan throughput dan mengurangi hot spot di database Spanner.

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 baris tabel diurutkan berdasarkan kunci utama. 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 direkomendasikan.

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.

Menggabungkan tabel

Spanner memiliki fitur yang memungkinkan Anda menentukan dua tabel sebagai memiliki hubungan induk-turunan satu-ke-banyak. Tindakan ini akan menyisipkan baris data turunan dengan 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 saat penghapusan 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     INT64 NOT NULL,
  AlbumId      INT64 NOT NULL,
  AlbumTitle   STRING(MAX),
) PRIMARY KEY (SingerId, AlbumId)
INTERLEAVE IN PARENT (Singers)
ON DELETE CASCADE;

Membuat indeks sekunder

Anda juga dapat membuat indeks sekunder untuk mengindeks data dalam tabel di luar kunci utama.

Spanner menerapkan indeks sekunder dengan cara yang sama seperti tabel, sehingga nilai kolom yang akan digunakan sebagai kunci indeks memiliki batasan yang sama seperti 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 STORING, sehingga menjadi indeks cakupan.

Pengoptimal kueri Spanner hanya akan 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=@value

Indeks dapat digunakan untuk menerapkan nilai unik dalam kolom tabel, dengan menentukan indeks UNIQUE di kolom tersebut. Penambahan nilai duplikat akan dicegah oleh indeks.

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

CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);

Perhatikan bahwa jika Anda membuat indeks tambahan setelah data dimuat, pengisian indeks mungkin memerlukan waktu beberapa saat. Anda harus membatasi frekuensi penambahannya menjadi rata-rata tiga per hari. Untuk panduan lebih lanjut tentang cara membuat indeks sekunder, lihat Indeks sekunder. Untuk mengetahui informasi selengkapnya tentang batasan pembuatan indeks, lihat Pembaruan skema.

Langkah 2: Terjemahkan kueri SQL apa pun

Spanner menggunakan dialek SQL ANSI 2011 dengan ekstensi, dan memiliki banyak fungsi dan operator untuk membantu menerjemahkan dan menggabungkan data Anda. Anda harus mengonversi kueri SQL apa pun yang menggunakan sintaksis, fungsi, dan jenis khusus Oracle agar kompatibel dengan Spanner.

Meskipun Spanner tidak mendukung data terstruktur sebagai definisi kolom, data terstruktur dapat digunakan dalam kueri SQL menggunakan jenis ARRAY dan STRUCT.

Misalnya, kueri dapat ditulis untuk menampilkan semua Album untuk artis menggunakan ARRAY dari STRUCTs dalam satu kueri (mengambil keuntungan dari data yang telah digabungkan sebelumnya). Untuk informasi selengkapnya, lihat bagian Catatan tentang subkueri dalam dokumentasi.

Kueri SQL dapat dibuat profilnya menggunakan halaman Spanner Studio di Konsol Google Cloud untuk mengeksekusi kueri. Secara umum, kueri yang melakukan pemindaian tabel penuh pada tabel besar sangat mahal, dan harus digunakan seperlunya.

Lihat dokumentasi praktik terbaik SQL untuk mengetahui informasi selengkapnya tentang cara mengoptimalkan kueri SQL.

Langkah 3: Migrasikan aplikasi Anda untuk menggunakan Spanner

Spanner menyediakan kumpulan Library klien untuk berbagai bahasa, dan kemampuan untuk membaca dan menulis data menggunakan panggilan API khusus Spanner, serta menggunakan kueri SQL dan pernyataan Data modification language (DML). Menggunakan panggilan API mungkin lebih cepat untuk beberapa kueri, seperti pembacaan baris langsung berdasarkan kunci, karena pernyataan SQL tidak perlu diterjemahkan.

Anda juga dapat menggunakan driver Java Database Connectivity (JDBC) untuk terhubung ke Spanner, memanfaatkan alat dan infrastruktur yang ada yang tidak memiliki integrasi native.

Sebagai bagian dari proses migrasi, fitur yang tidak tersedia di Spanner harus diterapkan di aplikasi. Misalnya, pemicu untuk memverifikasi nilai data dan memperbarui tabel terkait harus diterapkan dalam aplikasi menggunakan transaksi baca/tulis untuk membaca baris yang ada, memverifikasi batasan, lalu menulis baris yang diperbarui ke kedua tabel.

Spanner menawarkan transaksi baca-tulis dan hanya baca, yang memastikan konsistensi eksternal data Anda. Selain itu, transaksi baca dapat menerapkan batas stempel waktu, dengan Anda membaca versi data yang konsisten yang ditentukan dengan cara berikut:

  • Pada waktu yang tepat di masa lalu (hingga 1 jam yang lalu).
  • Di masa mendatang (saat pembacaan akan diblokir hingga waktu tersebut tiba).
  • Dengan jumlah keusangan terbatas yang dapat diterima, yang akan menampilkan tampilan yang konsisten hingga beberapa waktu sebelumnya tanpa perlu memeriksa apakah data berikutnya tersedia di replika lain. Hal ini dapat memberikan manfaat performa, tetapi dengan mengorbankan data yang mungkin sudah tidak berlaku.

Langkah 4: Transfer data Anda dari Oracle ke Spanner

Untuk mentransfer data dari Oracle ke Spanner, Anda harus mengekspor database Oracle ke format file portabel, misalnya CSV, lalu mengimpor data tersebut ke Spanner menggunakan Dataflow.

Proses ekstrak, transformasi, dan pemuatan di Dataflow

Ekspor massal dari Oracle

Oracle tidak menyediakan utilitas bawaan untuk mengekspor atau membongkar seluruh database Anda ke dalam format file portabel.

Beberapa opsi untuk melakukan ekspor tercantum dalam FAQ Oracle.

Fitur tersebut meliputi:

Setiap metode ini memiliki kelemahan bahwa hanya satu tabel yang dapat diekspor sekaligus, yang berarti Anda harus menjeda aplikasi atau menonaktifkan database sehingga database tetap dalam status yang konsisten untuk diekspor.

Opsi lainnya mencakup alat pihak ketiga seperti yang tercantum di halaman FAQ Oracle, beberapa di antaranya dapat memuat ulang tampilan yang konsisten dari seluruh database.

Setelah di-unload, Anda harus mengupload file data ini ke bucket Cloud Storage agar dapat diakses untuk diimpor.

Impor massal ke Spanner

Karena skema database mungkin berbeda antara Oracle dan Spanner, Anda mungkin perlu melakukan beberapa konversi data sebagai bagian dari proses impor.

Cara termudah untuk melakukan konversi data ini dan mengimpor data ke dalam Spanner adalah dengan menggunakan Dataflow.

Dataflow adalah layanan Ekstrak Transformasi dan Pemuatan (ETL) yang didistribusikan Google Cloud. Layanan ini menyediakan platform untuk menjalankan pipeline data yang ditulis menggunakan Apache Beam SDK guna membaca dan memproses data dalam jumlah besar secara paralel di beberapa mesin.

Apache Beam SDK mengharuskan Anda menulis program Java sederhana untuk menetapkan pembacaan, transformasi, dan penulisan data. Konektor Beam ada untuk Cloud Storage dan Spanner, sehingga satu-satunya kode yang perlu ditulis adalah transformasi data itu sendiri.

Lihat contoh pipeline sederhana yang membaca dari file CSV dan menulis ke Spanner di repositori kode contoh yang menyertai artikel ini.

Jika tabel interleaved induk-turunan digunakan dalam skema Spanner, Anda harus berhati-hati dalam proses impor sehingga baris induk dibuat sebelum baris turunan. Kode pipeline Impor Spanner menangani hal ini dengan mengimpor semua data untuk tabel tingkat root terlebih dahulu, lalu semua tabel turunan tingkat 1, lalu semua tabel turunan tingkat 2, dan seterusnya.

Pipeline impor Spanner dapat digunakan secara langsung untuk mengimpor data secara massal, tetapi hal ini mengharuskan data Anda ada dalam file Avro menggunakan skema yang benar.

Langkah 5: Menjaga konsistensi antara kedua database

Banyak aplikasi memiliki persyaratan ketersediaan yang membuat aplikasi tidak dapat dibuat offline selama waktu yang diperlukan untuk mengekspor dan mengimpor data Anda. Saat Anda mentransfer data ke Spanner, aplikasi Anda akan terus mengubah database yang ada. Anda harus menduplikasi update ke database Spanner saat aplikasi berjalan.

Ada berbagai metode untuk menjaga sinkronisasi dua database Anda, termasuk Pengambilan Data Perubahan, dan menerapkan update serentak di aplikasi.

Pengambilan Data Perubahan

Oracle GoldenGate dapat menyediakan streaming pengambilan data perubahan (CDC) untuk database Oracle Anda. Oracle LogMiner atau Oracle XStream Out adalah antarmuka alternatif untuk database Oracle guna mendapatkan streaming CDC yang tidak melibatkan Oracle GoldenGate.

Anda dapat menulis aplikasi yang berlangganan ke salah satu aliran ini dan menerapkan modifikasi yang sama (tentunya setelah konversi data) ke database Spanner Anda. Aplikasi pemrosesan streaming tersebut harus menerapkan beberapa fitur:

  • Menghubungkan ke database Oracle (database sumber).
  • Menghubungkan ke Spanner (database target).
  • Melakukan hal berikut berulang kali:
    • Menerima data yang dihasilkan oleh salah satu aliran CDC database Oracle.
    • Menafsirkan data yang dihasilkan oleh aliran data CDC.
    • Mengonversi data menjadi pernyataan INSERT Spanner.
    • Menjalankan pernyataan INSERT Spanner.

Teknologi migrasi database adalah teknologi middleware yang telah mengimplementasikan fitur yang diperlukan sebagai bagian dari fungsinya. Platform migrasi database diinstal sebagai komponen terpisah di lokasi sumber atau lokasi target, sesuai dengan persyaratan pelanggan. Platform migrasi database hanya memerlukan konfigurasi konektivitas database yang terlibat untuk menentukan dan memulai transfer data berkelanjutan dari sumber ke database target.

Striim adalah platform teknologi migrasi database yang tersedia di Google Cloud. Alat ini menyediakan konektivitas ke streaming CDC dari Oracle GoldenGate serta dari Oracle LogMiner dan Oracle XStream Out. Striim menyediakan alat grafis yang memungkinkan Anda mengonfigurasi konektivitas database dan aturan transformasi apa pun yang diperlukan untuk mentransfer data dari Oracle ke Spanner.

Anda dapat menginstal Striim dari Google Cloud Marketplace yang terhubung ke database sumber dan target, menerapkan aturan transformasi apa pun, dan mulai mentransfer data tanpa harus membuat aplikasi pemrosesan streaming sendiri.

Update simultan ke kedua database dari aplikasi

Metode alternatifnya adalah mengubah aplikasi Anda untuk melakukan operasi tulis ke kedua database. Satu database (awalnya Oracle) akan dianggap sebagai sumber kebenaran, dan setelah setiap operasi tulis database, seluruh baris akan dibaca, dikonversi, dan ditulis ke database Spanner.

Dengan cara ini, aplikasi terus menimpa baris Spanner dengan data terbaru.

Setelah yakin bahwa semua data telah ditransfer dengan benar, Anda dapat mengalihkan sumber tepercaya ke database Spanner.

Mekanisme ini menyediakan jalur rollback jika masalah ditemukan saat beralih ke Spanner.

Memverifikasi konsistensi data

Saat data mengalir ke database Spanner, Anda dapat menjalankan perbandingan secara berkala antara data Spanner dan data Oracle untuk memastikan data tersebut konsisten.

Anda dapat memvalidasi konsistensi dengan membuat kueri pada kedua sumber data dan membandingkan hasilnya.

Anda dapat menggunakan Dataflow untuk melakukan perbandingan mendetail pada set data besar menggunakan Transformasi join. Transformasi ini menggunakan 2 set data dengan kunci, dan mencocokkan nilai menurut kunci. Nilai yang cocok kemudian dapat dibandingkan untuk kesetaraan.

Anda dapat menjalankan verifikasi ini secara rutin hingga tingkat konsistensinya sesuai dengan persyaratan bisnis Anda.

Langkah 6: Beralih ke Spanner sebagai sumber tepercaya aplikasi Anda

Jika yakin dengan migrasi data, Anda dapat mengalihkan aplikasi untuk menggunakan Spanner sebagai sumber tepercaya. Terus tulis kembali perubahan ke database Oracle agar database Oracle selalu yang terbaru, sehingga Anda memiliki jalur rollback jika terjadi masalah.

Terakhir, Anda dapat menonaktifkan dan menghapus kode update database Oracle serta menonaktifkan database Oracle.

Mengekspor dan mengimpor database Spanner

Anda dapat mengekspor tabel dari Spanner ke bucket Cloud Storage secara opsional menggunakan template Dataflow untuk melakukan ekspor. Folder yang dihasilkan berisi kumpulan file Avro dan file manifes JSON yang berisi tabel yang diekspor. File ini dapat digunakan untuk berbagai tujuan, termasuk:

  • Mencadangkan database Anda untuk kepatuhan kebijakan retensi data atau pemulihan dari bencana.
  • Mengimpor file Avro ke penawaran Google Cloud lainnya seperti BigQuery.

Untuk informasi selengkapnya tentang proses ekspor dan impor, lihat Mengekspor Database dan Mengimpor Database.

Langkah selanjutnya