Mengonfigurasi database Amazon RDS Oracle untuk CDC

Datastream memungkinkan Anda melakukan streaming update change data capture (CDC) dari database Amazon RDS for Oracle ke tujuan yang didukung, seperti BigQuery atau Cloud Storage. Anda dapat mengonfigurasi sumber untuk pembaca log biner (Pratinjau) atau LogMiner API dengan mengaktifkan mode ARCHIVELOG dan logging tambahan, serta memberikan hak istimewa pengguna. Untuk mengetahui informasi selengkapnya tentang metode CDC ini, lihat Menggunakan file redo log database Oracle.

Mengonfigurasi database Oracle Amazon RDS untuk pembaca log biner

Untuk sumber Amazon RDS, Datastream hanya mendukung objek direktori database sebagai metode akses log untuk pembaca log biner. Anda perlu membuat direktori database yang mengarah ke file log redo online dan file log yang diarsipkan. Nama direktori ini bersifat statis dan tidak dapat diubah nanti. Anda harus memberikan nama ini ke Datastream saat membuat aliran.

  1. Hubungkan ke instance Amazon RDS sumber Anda.

  2. Di terminal, atau menggunakan dasbor Amazon RDS, jalankan perintah berikut:

    BEGIN
    rdsadmin.rdsadmin_master_util.create_archivelog_dir;
    END;
    BEGIN
    rdsadmin.rdsadmin_master_util.create_onlinelog_dir;
    END;
    COMMIT;
    GRANT READ ON DIRECTORY ONLINELOG_DIR TO USER_NAME;
    GRANT READ ON DIRECTORY ARCHIVELOG_DIR TO USER_NAME;
  3. Pastikan database Anda berjalan dalam mode ARCHIVELOG. Untuk melakukannya, login ke database Oracle Anda dan jalankan perintah berikut di prompt SQL:

    SELECT LOG_MODE FROM V$DATABASE;

    1. Jika hasilnya ARCHIVELOG, lanjutkan ke langkah c.
    2. Jika hasilnya adalah NOARCHIVELOG, Anda harus mengaktifkan mode ARCHIVELOG untuk database Anda.
    3. File log yang diarsipkan menggunakan kapasitas disk, jadi Anda harus mengonfigurasi parameter DB_RECOVERY_FILE_DEST_SIZE untuk database Anda. Gunakan parameter ini untuk menentukan (dalam byte) batas ketat total ruang yang akan digunakan oleh file pemulihan database target. Dengan menyetel parameter ini, Anda dapat mengelola kompromi antara melindungi database agar tidak kehabisan kapasitas disk dan kegagalan streaming karena hilangnya posisi log.
    4. Tentukan kebijakan retensi data untuk database Anda dengan menjalankan perintah ini:
      exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96);
      Sebaiknya Anda mempertahankan cadangan dan log arsip selama minimal 4 hari, dan sebaiknya 7 hari.
    5. Konfigurasikan kebijakan rotasi file log Oracle. Sebaiknya tetapkan ukuran file log maksimum ke nilai yang lebih rendah dari 1 GB.
  4. Aktifkan data log tambahan. Untuk melakukannya, aktifkan logging tambahan tingkat database minimal terlebih dahulu dengan menjalankan perintah berikut:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');

    Selanjutnya, pilih apakah akan mengaktifkan logging untuk tabel tertentu atau seluruh database.

    Untuk mencatat perubahan hanya untuk tabel tertentu, jalankan perintah berikut untuk setiap tabel yang ingin Anda replikasi:

    ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

    Ganti kode berikut:

    • SCHEMA: nama skema yang berisi tabel.
    • TABLE: nama tabel yang ingin Anda catat perubahannya.

    Untuk mereplikasi sebagian besar atau semua tabel dalam database, pertimbangkan untuk mengaktifkan logging untuk seluruh database. Di prompt SQL, jalankan perintah berikut untuk mengaktifkan data log tambahan untuk seluruh database:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','ALL');
  5. Berikan hak istimewa berikut kepada pengguna database:

    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$LOGFILE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$ARCHIVED_LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$INSTANCE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$STANDBY_LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$INSTANCE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PDBS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$TRANSPORTABLE_PLATFORM','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PARAMETER','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('COL$','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_ENCRYPTED_COLUMNS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_EXTENTS','USER_NAME','SELECT');
    GRANT CONNECT TO USER_NAME;
    GRANT CREATE SESSION TO USER_NAME;
    GRANT SELECT ANY TABLE TO USER_NAME;

    Ganti USER_NAME dengan nama akun pengguna yang ingin Anda gunakan untuk terhubung ke database Anda.

Mengonfigurasi database Amazon RDS Oracle untuk LogMiner

  1. Pastikan database Anda berjalan dalam mode ARCHIVELOG. Untuk melakukannya, login ke database Oracle Anda dan jalankan perintah berikut di prompt SQL:

    SELECT LOG_MODE FROM V$DATABASE;
    
    1. Jika hasilnya adalah ARCHIVELOG, lanjutkan ke langkah c.
    2. Jika hasilnya NOARCHIVELOG, Anda harus mengaktifkan mode ARCHIVELOG untuk database Anda.

      Poin penting: Agar database Anda dapat berjalan dalam mode ARCHIVELOG, Anda harus mengaktifkan pencadangan untuk database tersebut.

    3. File log yang diarsipkan menggunakan kapasitas disk, jadi Anda perlu mengonfigurasi parameter DB_RECOVERY_FILE_DEST_SIZE untuk database Anda. Gunakan parameter ini untuk menentukan (dalam byte) batas ketat total ruang yang akan digunakan oleh file pemulihan database target. Dengan menyetel parameter ini, Anda dapat mengelola kompromi antara melindungi database agar tidak kehabisan kapasitas disk dan kegagalan streaming karena hilangnya posisi log.

    4. Tentukan kebijakan retensi data untuk database Anda dengan menjalankan perintah ini:

      exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96);
      

      Sebaiknya simpan cadangan dan arsipkan log selama minimal 4 hari, dan 7 hari lebih disarankan.

  2. Aktifkan data log tambahan. Untuk melakukannya, pertama-tama aktifkan logging tambahan tingkat database minimal dengan menjalankan perintah berikut:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
    

    Selanjutnya, pilih apakah akan mengaktifkan logging untuk tabel tertentu atau seluruh database.

    Untuk mencatat perubahan hanya untuk tabel tertentu, jalankan perintah berikut untuk setiap tabel yang ingin Anda replikasi:

    ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
    

    Ganti kode berikut:

    • SCHEMA: nama skema yang berisi tabel.
    • TABLE: nama tabel yang ingin Anda catat perubahannya.

    Untuk mereplikasi sebagian besar atau semua tabel dalam database Anda, pertimbangkan untuk mengaktifkan logging untuk seluruh database.

    Di prompt SQL, jalankan perintah berikut untuk mengaktifkan data log tambahan bagi seluruh database:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','ALL');
    
  3. Berikan hak istimewa yang sesuai ke akun pengguna yang akan digunakan untuk terhubung ke database Anda. Untuk melakukannya, jalankan perintah berikut:

    GRANT EXECUTE_CATALOG_ROLE TO USER_NAME;
    GRANT CONNECT TO USER_NAME;
    GRANT CREATE SESSION TO USER_NAME;
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$ARCHIVED_LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOG','USER_NAME','SELECT'); -- for primary databases
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$STANDBY_LOG','USER_NAME','SELECT'); -- for standby databases
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGFILE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_LOGS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_CONTENTS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PARAMETER','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR','USER_NAME','EXECUTE');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR_D','USER_NAME','EXECUTE');
    GRANT SELECT ANY TRANSACTION TO USER_NAME;
    GRANT SELECT ANY TABLE TO USER_NAME;

    Jika database Anda menggunakan Transparent Data Encryption (TDE), berikan izin berikut:

    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_ENCRYPTED_COLUMNS','USER_NAME','SELECT');

    Jika organisasi Anda tidak mengizinkan pemberian izin GRANT SELECT ANY TABLE, gunakan solusi yang dijelaskan di bagian Oracle change data capture (CDC) di halaman FAQ Datastream.

    Jika database sumber Anda adalah Oracle 12c atau yang lebih baru, berikan hak istimewa tambahan berikut:

    GRANT LOGMINING TO USER_NAME;
  4. Beri akun pengguna SELECT akses ke tampilan DBA_EXTENTS di database Anda. Dengan hak istimewa ini, Anda dapat menggunakan ROWID pengisian ulang berbasis untuk sumber Oracle Anda:

    GRANT SELECT ON DBA_EXTENTS TO USER_NAME;

Langkah berikutnya

  • Pelajari lebih lanjut cara kerja Datastream dengan sumber Oracle.