All Products
Search
Document Center

AnalyticDB:Oracle Golden Gate

Last Updated:Jul 30, 2026

Oracle GoldenGate (OGG) menyinkronkan data Oracle ke AnalyticDB for MySQL secara real time. Topik ini mencakup pemetaan tipe data antara Oracle dan AnalyticDB for MySQL serta memandu Anda melalui penyiapan sinkronisasi end-to-end menggunakan OGG.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Database Oracle dengan OGG yang diinstal di /odata/ogg_o_12202

  • Instance Elastic Compute Service (ECS) yang menjalankan database Oracle

  • Instance AnalyticDB for MySQL

  • Instance MySQL untuk menyimpan metadata checkpoint OGG

Kompatibilitas tipe data

OGG mengarahkan data dari Oracle melalui MySQL sebelum menulisnya ke AnalyticDB for MySQL. Tabel-tabel berikut menunjukkan cara tipe data Oracle dipetakan ke tipe data AnalyticDB for MySQL pada setiap tahap serta operasi DML yang didukung.

Tipe data dikelompokkan berdasarkan kategori. Untuk setiap baris, periksa kolom Exact match: Yes berarti tipe Oracle dipetakan ke tipe ekuivalen tanpa kehilangan presisi atau makna semantik; No berarti pemetaannya bersifat perkiraan dan Anda harus memverifikasi kompatibilitasnya untuk data Anda.

Tipe numerik

Oracle type Oracle type notes MySQL type AnalyticDB for MySQL type Exact match INSERT UPDATE DELETE
NUMBER(3) bilangan bulat 3 digit BOOL atau TINYINT(1) BOOLEAN No Didukung Didukung Didukung
NUMBER(3) bilangan bulat 3 digit TINYINT TINYINT Yes Didukung Didukung Didukung
NUMBER(5) bilangan bulat 5 digit SMALLINT SMALLINT Yes Didukung Didukung Didukung
NUMBER(10) bilangan bulat 10 digit INT INT atau INTEGER Yes Didukung Didukung Didukung
NUMBER(19) bilangan bulat 19 digit BIGINT BIGINT Yes Didukung Didukung Didukung
FLOAT(24) float presisi tunggal FLOAT FLOAT Yes Didukung Didukung Didukung
FLOAT(24) float presisi tunggal DOUBLE DOUBLE No Didukung Didukung Didukung
FLOAT(24) float presisi tunggal DECIMAL DECIMAL No Didukung Didukung Didukung

Tipe karakter

Oracle type Oracle type notes MySQL type AnalyticDB for MySQL type Exact match INSERT UPDATE DELETE
VARCHAR2(128) string dengan panjang variabel, hingga 128 byte CHAR VARCHAR(128) No Didukung Didukung Didukung
VARCHAR2(2000) string dengan panjang variabel, hingga 2000 byte VARCHAR(255) VARCHAR(255) No — dipotong menjadi 255 karakter Didukung Didukung Didukung
VARCHAR2(4000) string dengan panjang variabel, hingga 4000 byte TEXT VARCHAR(65535) No Didukung Didukung Didukung

Tipe tanggal dan waktu

Oracle type Oracle type notes MySQL type AnalyticDB for MySQL type Exact match INSERT UPDATE DELETE
DATE Menyimpan komponen tanggal dan waktu (tahun, bulan, hari, jam, menit, detik) DATE DATE No — komponen waktu hilang Didukung Didukung Didukung
DATE Menyimpan komponen tanggal dan waktu (tahun, bulan, hari, jam, menit, detik) TIME TIME No — komponen tanggal hilang N/A N/A N/A
DATE Menyimpan komponen tanggal dan waktu (tahun, bulan, hari, jam, menit, detik) DATETIME DATETIME Yes Didukung Didukung Didukung
DATE Menyimpan komponen tanggal dan waktu (tahun, bulan, hari, jam, menit, detik) TIMESTAMP TIMESTAMP Yes Didukung Didukung Didukung
Catatan

Tipe DATE Oracle menyimpan komponen tanggal dan waktu. Memetakan DATE Oracle ke TIME MySQL akan menghilangkan komponen tanggal dan tidak mendukung sinkronisasi DML. Petakan DATE Oracle ke DATETIME atau TIMESTAMP untuk mempertahankan informasi tanggal dan waktu secara lengkap.

Menyinkronkan data Oracle ke AnalyticDB for MySQL

Alur sinkronisasi terdiri dari tiga fase utama: buat tabel sumber di Oracle dan konfigurasikan OGG, buat tabel metadata checkpoint di MySQL, lalu buat tabel target di AnalyticDB for MySQL.

Pernyataan DDL berikut menampilkan tabel sumber Oracle dan tabel target AnalyticDB for MySQL yang sesuai secara berdampingan sehingga Anda dapat melihat pemetaan tipe lengkap dalam konteks sebelum menjalankan langkah-langkahnya satu per satu.

Sumber (Oracle):

create table users.xqtest15 (
  c1  number(10),   -- dipetakan ke int
  c2  number(1),    -- dipetakan ke boolean
  c3  number(3),    -- dipetakan ke tinyint
  c4  number(5),    -- dipetakan ke smallint
  c5  number(19),   -- dipetakan ke bigint
  c6  float(24),    -- dipetakan ke float
  c7  float(24),    -- dipetakan ke double
  c8  float(24),    -- dipetakan ke decimal(24, 0)
  c9  char(1),      -- dipetakan ke varchar(128)
  c10 varchar2(2000), -- dipetakan ke varchar(255)
  c11 varchar2(4000), -- dipetakan ke varchar(65535)
  c12 date,         -- dipetakan ke date
  c13 date,         -- dipetakan ke time (DML tidak didukung)
  c14 date,         -- dipetakan ke datetime
  c15 date,         -- dipetakan ke timestamp
  primary key(c1)
);

Target (AnalyticDB for MySQL):

CREATE TABLE `xqtest15` (
  `c1`  int,
  `c2`  boolean,
  `c3`  tinyint,
  `c4`  smallint,
  `c5`  bigint,
  `c6`  float,
  `c7`  double,
  `c8`  decimal(24, 0),
  `c9`  varchar(128),
  `c10` varchar(255),
  `c11` varchar(65535),
  `c12` date,
  `c13` time,
  `c14` datetime,
  `c15` timestamp,
  primary key (c1)
) DISTRIBUTED BY HASH(`c1`) INDEX_ALL='Y';

Langkah 1: Masuk ke instance ECS

Masuk ke instance ECS menggunakan akun Oracle:

sqlplus ogg/ogg

Langkah 2: Buat tabel sumber di Oracle

Jalankan pernyataan SQL berikut untuk membuat tabel sumber users.xqtest15:

drop table users.xqtest15;
create table users.xqtest15 (
  c1  number(10),
  c2  number(1),
  c3  number(3),
  c4  number(5),
  c5  number(19),
  c6  float(24),
  c7  float(24),
  c8  float(24),
  c9  char(1),
  c10 varchar2(2000),
  c11 varchar2(4000),
  c12 date,
  c13 date,
  c14 date,
  c15 date,
  primary key(c1)
);

Langkah 3: Konfigurasikan trandata OGG

Setelah membuat tabel sumber, aktifkan pencatatan tambahan untuk tabel tersebut di OGG:

# Buka direktori instalasi OGG dan jalankan ggsci
cd /odata/ogg_o_12202
./ggsci

Jalankan perintah berikut di prompt ggsci:

ggsci> dblogin userid goldengate, password ogg
ggsci> add trandata users.xqtest15
Penting

Jangan tambahkan tanda titik koma (;) di akhir perintah add trandata. Menambahkan tanda titik koma menyebabkan error No viable tables matched specification.

Langkah 4: Buat tabel metadata checkpoint di MySQL

OGG memerlukan dua tabel checkpoint di MySQL untuk melacak status replikasi. Jalankan pernyataan SQL berikut untuk membuatnya:

-- Tabel checkpoint
CREATE TABLE `ckpt1220` (
  `group_name`      varchar(8)      NOT NULL,
  `group_key`       decimal(19,0)   NOT NULL,
  `seqno`           decimal(10,0)   DEFAULT NULL,
  `rba`             decimal(19,0)   NOT NULL,
  `audit_ts`        varchar(29)     DEFAULT NULL,
  `create_ts`       datetime        NOT NULL,
  `last_update_ts`  datetime        NOT NULL,
  `current_dir`     varchar(255)    NOT NULL,
  `log_bsn`         varchar(128)    DEFAULT NULL,
  `log_csn`         varchar(128)    DEFAULT NULL,
  `log_xid`         varchar(128)    DEFAULT NULL,
  `log_cmplt_csn`   varchar(128)    DEFAULT NULL,
  `log_cmplt_xids`  varchar(2000)   DEFAULT NULL,
  `version`         decimal(3,0)    DEFAULT NULL,
  PRIMARY KEY (`group_name`, `group_key`)
) DISTRIBUTED BY HASH(`group_key`) INDEX_ALL='Y';

-- Tabel checkpoint LOX
CREATE TABLE `ckpt1220_lox` (
  `group_name`          varchar(8)      NOT NULL,
  `group_key`           decimal(19,0)   NOT NULL,
  `log_cmplt_csn`       varchar(128)    NOT NULL,
  `log_cmplt_xids_seq`  decimal(5,0)    NOT NULL,
  `log_cmplt_xids`      varchar(2000)   NOT NULL,
  PRIMARY KEY (`group_name`, `group_key`, `log_cmplt_csn`, `log_cmplt_xids_seq`)
) DISTRIBUTED BY HASH(`group_key`) INDEX_ALL='Y';

Langkah 5: Buat tabel target di AnalyticDB for MySQL

Buat tabel target yang menerima data yang disinkronkan dari Oracle. Tipe kolom mengikuti pemetaan pada bagian Kompatibilitas tipe data di atas.

CREATE TABLE `xqtest15` (
  `c1`  int,
  `c2`  boolean,
  `c3`  tinyint,
  `c4`  smallint,
  `c5`  bigint,
  `c6`  float,
  `c7`  double,
  `c8`  decimal(24, 0),
  `c9`  varchar(128),
  `c10` varchar(255),
  `c11` varchar(65535),
  `c12` date,
  `c13` time,
  `c14` datetime,
  `c15` timestamp,
  primary key (c1)
) DISTRIBUTED BY HASH(`c1`) INDEX_ALL='Y';

Lampiran

Contoh berikut menunjukkan hasil sinkronisasi untuk setiap operasi DML.

  • Sinkronisasi INSERT

    Struktur tabel Oracle dan hasil kueri:

    SQL> desc users.xqtest15
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     C1                                        NOT NULL NUMBER(10)
     C2                                                 NUMBER(1)
     C3                                                 NUMBER(3)
     C4                                                 NUMBER(5)
     C5                                                 NUMBER(19)
     C6                                                 FLOAT(24)
     C7                                                 FLOAT(24)
     C8                                                 FLOAT(24)
     C9                                                 CHAR(1)
     C10                                                VARCHAR2(2000)
     C11                                                VARCHAR2(4000)
     C12                                                DATE
     C13                                                DATE
     C14                                                DATE
     C15                                                DATE
    
    SQL> select * from users.xqtest15;
    
           C1        C2         C3         C4         C5         C6         C7
    --------- --------- ---------- ---------- ---------- ---------- ----------
           C8 C9
    --------- ---
    
    C10
    
    C11
    
           C12           C13           C14           C15
    ------------- ------------- ------------- -------------
            1          1        100        100      65535       3.14       3.14
         3.14 a
    aaaaabbbbbb
    
    aaaaabbbbbbbbbb
    06-JAN-20     06-JAN-20     06-JAN-20     06-JAN-20

    Pernyataan pembuatan tabel ADB 3.0, hasil kueri, dan struktur tabel:

    mysql> Create Table `xqtest15` (
        ->  `c1` int,
        ->  `c2` boolean,
        ->  `c3` tinyint,
        ->  `c4` smallint,
        ->  `c5` bigint,
        ->  `c6` float,
        ->  `c7` double,
        ->  `c8` decimal(24,0),
        ->  `c9` varchar(128),
        ->  `c10` varchar(256),
        ->  `c11` varchar(65535),
        ->  `c12` date,
        ->  `c13` time,
        ->  `c14` datetime,
        ->  `c15` timestamp,
        ->  primary key (c1)
        -> ) DISTRIBUTE BY HASH(`c1`) INDEX_ALL='Y';
    Query OK, 0 rows affected (3.00 sec)
    
    mysql> select * from xqtest15;
    +------+------+------+------+-------+------+------+------+------+-------------+----------------+------------+----------+---------------------+---------------------+
    | c1   | c2   | c3   | c4   | c5    | c6   | c7   | c8   | c9   | c10         | c11            | c12        | c13      | c14                 | c15                 |
    +------+------+------+------+-------+------+------+------+------+-------------+----------------+------------+----------+---------------------+---------------------+
    |    1 |    1 |  100 |  100 | 65535 | 3.14 | 3.14 |    3 | a    | aaaaabbbbbb | aaaaabbbbbbbbbb | 2020-01-06 | 21:01:38 | 2020-01-06 21:01:38 | 2020-01-06 21:01:38 |
    +------+------+------+------+-------+------+------+------+------+-------------+----------------+------------+----------+---------------------+---------------------+
    1 row in set (0.05 sec)
    
    mysql> desc xqtest15;
    +-------+----------------+------+-----+---------+---------------------+
    | Field | Type           | Null | Key | Default | Extra               |
    +-------+----------------+------+-----+---------+---------------------+
    | c1    | int            | NO   | PRI | NULL    | distribute(0) PRI(0)|
    | c2    | boolean        | YES  | MUL | NULL    |                     |
    | c3    | tinyint        | YES  | MUL | NULL    |                     |
    | c4    | smallint       | YES  | MUL | NULL    |                     |
    | c5    | bigint         | YES  | MUL | NULL    |                     |
    | c6    | float          | YES  | MUL | NULL    |                     |
    | c7    | double         | YES  | MUL | NULL    |                     |
    | c8    | decimal(24, 0) | YES  | MUL | NULL    |                     |
    | c9    | varchar        | YES  | MUL | NULL    |                     |
    | c10   | varchar        | YES  | MUL | NULL    |                     |
    +-------+----------------+------+-----+---------+---------------------+
  • Sinkronisasi UPDATE

    SQL> update users.xqtest15 set c2=0,c3=120,c4=120,c5=32765,c6=99.99,c7=99.99,c8=99.99,c9='c',c10='ccc c',c11='cccc',c12=sysdate,c13=sysdate,c14=sysdate,c15=sysdate where c1=1;
    
    1 row updated.
    
    SQL> commit;
    
    Commit complete.
    
    SQL>
    SQL>
    SQL>
    SQL>
    SQL>
    
    mysql> select * from xqtest15;
    +------+------+------+------+-------+-------+-------+------+------+------+------+------------+---------------------+---------------------+---------------------+
    | c1   | c2   | c3   | c4   | c5    | c6    | c7    | c8   | c9   | c10  | c11  | c12        | c13                 | c14                 | c15                 |
    +------+------+------+------+-------+-------+-------+------+------+------+------+------------+---------------------+---------------------+---------------------+
    |    1 |    0 |  120 |  120 | 32765 | 99.99 | 99.99 |  100 | c    | cccc | cccc | 2020-01-06 | 21:28:23            | 2020-01-06 21:28:23 | 2020-01-06 21:28:23 |
    +------+------+------+------+-------+-------+-------+------+------+------+------+------------+---------------------+---------------------+---------------------+
    1 row in set (0.04 sec)
    
    mysql>
  • Sinkronisasi DELETE

    SQL> delete from users.xqtest15 where c1=1;
    
    1 row deleted.
    
    SQL> commit;
    
    Commit complete.
    
    SQL>
    
    mysql> select * from xqtest15;
    Empty set (0.03 sec)
    
    mysql>
    mysql>
    mysql>
    mysql>
    mysql>
    mysql>