Bermigrasi dari sistem OLTP Oracle® ke Spanner

Artikel ini menjelaskan cara memigrasikan database 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 set fitur Spanner dan untuk berintegrasi dengan layanan Google Cloud tambahan.

Prosedur dan pemicu tersimpan

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

Urutan

Sebaiknya gunakan UUID Versi 4 sebagai metode default untuk membuat 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 terbalik bit positif (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 hanya mendukung kontrol akses level database menggunakan peran dan izin akses IAM. Peran yang telah ditetapkan dapat memberikan akses baca-tulis atau hanya baca ke database.

Jika memerlukan izin yang lebih terperinci, Anda harus menerapkannya pada 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 yang mendetail (seperti izin tingkat tabel dan tampilan), Anda harus mengekspor database ke BigQuery.

Batasan validasi data

Spanner dapat mendukung kumpulan batasan validasi data yang terbatas di lapisan database.

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

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

Batasan Implementasi dengan Spanner
Bukan null NOT NULLbatasan kolom
Unik Indeks sekunder dengan batasan UNIQUE
{i>Foreign key<i} (untuk tabel normal) Lihat Membuat dan mengelola hubungan kunci asing.
Tindakan ON DELETE/ON UPDATE kunci asing Hanya memungkinkan untuk tabel yang disisipkan, jika tidak diterapkan di lapisan aplikasi
Pemeriksaan nilai dan validasi melalui batasan atau pemicu CHECK Diimplementasikan di lapisan aplikasi

Jenis data yang didukung

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

Anda mungkin juga harus melakukan transformasi tambahan pada data seperti yang dijelaskan dalam kolom Catatan untuk menyesuaikan data Oracle dengan database Spanner.

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

Jenis data Oracle Setara dengan Spanner Notes
Jenis karakter (CHAR, VARCHAR, NCHAR, NVARCHAR) STRING Catatan: Spanner menggunakan string Unicode secara keseluruhan.
Oracle mendukung panjang maksimum 32.000 byte atau karakter (bergantung pada jenisnya), 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 ke dan dari representasi tanggal STRING secara otomatis. Fungsi SQL disediakan untuk mengonversi tanggal menjadi string yang diformat.
DATETIME TIMESTAMP Spanner menyimpan waktu secara terpisah 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 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 dari proses migrasi Anda adalah:

  1. Mengonversi skema dan model data.
  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 tersebut ke Spanner menggunakan Dataflow.
  5. Pertahankan konsistensi di antara kedua database selama migrasi.
  6. Memigrasikan aplikasi Anda dari Oracle.

Langkah 1: Konversi database dan skema Anda

Anda mengonversi skema yang ada menjadi skema Spanner untuk menyimpan data Anda. Skema ini harus semirip mungkin dengan skema Oracle yang ada agar modifikasi aplikasi menjadi lebih sederhana. Namun, karena perbedaan fitur, beberapa perubahan akan diperlukan.

Menggunakan praktik terbaik dalam desain skema dapat membantu Anda meningkatkan throughput dan mengurangi hot spot dalam 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 secara unik mengidentifikasi setiap baris dalam tabel, dan baris tabel diurutkan berdasarkan kunci utama. Karena Spanner sangat terdistribusi, Anda harus memilih teknik pembuatan kunci utama yang diskalakan dengan baik seiring pertumbuhan data Anda. Untuk informasi selengkapnya, lihat strategi migrasi utama yang direkomendasikan.

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.

Menyisipkan tabel

Spanner memiliki fitur yang memungkinkan Anda menentukan dua tabel sebagai hubungan induk-turunan one-to-many. Fungsi ini menyisipkan baris data turunan dengan baris induknya di 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 saat penghapusan untuk tabel turunan guna menentukan apa yang terjadi jika baris induk dihapus: semua baris turunan akan 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     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 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 STORING, sehingga menjadikannya 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, mengisi indeks mungkin memerlukan waktu beberapa saat. Anda harus membatasi tingkat penambahan rata-rata sebanyak tiga item 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.

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 seorang artis menggunakan ARRAY sebesar STRUCTs dalam satu kueri (memanfaatkan data yang telah digabungkan sebelumnya). Untuk informasi lebih lanjut, lihat bagian Catatan tentang subkueri pada dokumentasi.

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 dengan hemat.

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

Langkah 3: Migrasikan aplikasi Anda untuk menggunakan Spanner

Spanner menyediakan sekumpulan Library klien untuk berbagai bahasa, dan kemampuan untuk membaca dan menulis data menggunakan panggilan API khusus Spanner, serta dengan menggunakan Kueri SQL dan pernyataan Bahasa modifikasi data (DML). Penggunaan panggilan API untuk beberapa kueri dapat lebih cepat, seperti pembacaan baris langsung berdasarkan kunci, karena pernyataan SQL tidak harus diterjemahkan.

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

Sebagai bagian dari proses migrasi, fitur yang tidak tersedia di Spanner harus diimplementasikan dalam aplikasi. Misalnya, pemicu untuk memverifikasi nilai data dan memperbarui tabel terkait harus diterapkan di aplikasi menggunakan transaksi baca/tulis untuk membaca baris yang ada, memverifikasi batasan, lalu menulis baris yang telah 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, di mana Anda membaca versi konsisten dari data yang ditentukan dengan cara berikut:

  • Pada waktu yang tepat di masa lalu (hingga 1 jam yang lalu).
  • Di masa mendatang (ketika pembacaan akan diblokir hingga waktu tersebut tiba).
  • Dengan jumlah penghentian yang dibatasi dalam jumlah yang dapat diterima, yang akan menampilkan tampilan yang konsisten hingga beberapa waktu di masa lalu tanpa perlu memeriksa apakah data baru telah tersedia di replika lain. Hal ini dapat memberikan manfaat performa dengan mengorbankan data yang mungkin 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 ekstraksi, transformasi, dan pemuatan di Dataflow

Ekspor massal dari Oracle

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

Beberapa opsi untuk melakukan ekspor tercantum di FAQ Oracle.

Fitur tersebut meliputi:

Masing-masing memiliki kelemahan, yaitu hanya satu tabel yang dapat diekspor dalam satu waktu, yang berarti Anda harus menjeda aplikasi atau mendiamkan database agar database tetap dalam status konsisten untuk diekspor.

Opsi lainnya termasuk alat pihak ketiga seperti yang tercantum di halaman FAQ Oracle, yang beberapa di antaranya dapat menghapus pemuatan tampilan yang konsisten dari seluruh database.

Setelah dihapus muatannya, Anda harus mengupload file data ini ke bucket Cloud Storage agar dapat diakses untuk diimpor.

Mengimpor secara massal ke Spanner

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

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

Dataflow adalah layanan Google Cloud Distribute Extract Transform and Load (ETL). Library ini menyediakan platform untuk menjalankan pipeline data yang ditulis menggunakan Apache Beam SDK agar dapat membaca dan memproses data dalam jumlah besar secara paralel di beberapa mesin.

Apache Beam SDK mengharuskan Anda menulis program Java sederhana untuk menyetel pembacaan, transformasi, dan penulisan data. Konektor Beam tersedia 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 sisipan induk-turunan digunakan dalam skema Spanner, kehati-hatian dalam proses impor harus diperhatikan 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 level 1, lalu semua tabel turunan level 2, dan seterusnya.

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

Langkah 5: Pertahankan konsistensi di antara kedua database

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

Ada berbagai metode untuk menjaga sinkronisasi kedua database Anda, termasuk Pengambilan Data Perubahan, dan penerapan update simultan dalam aplikasi.

Ubah Pengambilan Data

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

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

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

Teknologi migrasi database adalah teknologi middleware yang telah menerapkan 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. Layanan ini menyediakan konektivitas ke stream 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, serta mulai mentransfer data tanpa harus membuat aplikasi stream processing.

Update simultan pada kedua database dari aplikasi

Metode alternatifnya adalah dengan memodifikasi aplikasi Anda untuk melakukan penulisan ke kedua database. Satu database (awalnya Oracle) akan dianggap sebagai sumber kebenaran, dan setelah setiap database menulis, 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 ditemukan masalah saat beralih ke Spanner.

Memverifikasi konsistensi data

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

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

Anda dapat menggunakan Dataflow untuk melakukan perbandingan terperinci atas set data besar menggunakan Transformasi Join. Transformasi ini menggunakan 2 set data dengan kunci, dan mencocokkan nilai berdasarkan 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 kebenaran aplikasi Anda

Setelah yakin dengan migrasi data, Anda dapat mengalihkan aplikasi untuk menggunakan Spanner sebagai sumber kebenaran. Terus tulis kembali perubahan pada database Oracle untuk menjaga database Oracle tetap terbaru, sehingga Anda akan mendapatkan jalur rollback jika terjadi masalah.

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

Mengekspor dan mengimpor database Spanner

Secara opsional, Anda dapat mengekspor tabel dari Spanner ke bucket Cloud Storage 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 memiliki berbagai tujuan, termasuk:

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

Untuk mengetahui informasi selengkapnya tentang proses ekspor dan impor, baca artikel Mengekspor Database dan Mengimpor Database.

Langkah selanjutnya