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 |
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
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-20Pernyataan 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>