Oracle GoldenGate (OGG) は、Oracle のデータを AnalyticDB for MySQL にリアルタイムで同期します。このトピックでは、Oracle と AnalyticDB for MySQL 間のデータ型マッピングについて説明し、OGG を使用したエンドツーエンドの同期を設定する手順を解説します。
前提条件
開始する前に、以下が準備できていることを確認してください。
-
OGG が
/odata/ogg_o_12202にインストールされている Oracle データベース -
Oracle データベースをホストする Elastic Compute Service (ECS) インスタンス
-
AnalyticDB for MySQL インスタンス
-
OGG のチェックポイントメタデータを格納するための MySQL インスタンス
データ型の互換性
OGG は、AnalyticDB for MySQL に書き込む前に、Oracle から MySQL を経由してデータをルーティングします。以下の表は、Oracle のデータ型が各段階で AnalyticDB for MySQL のデータ型にどのようにマッピングされるか、およびどの DML 操作がサポートされているかを示しています。
データ型はカテゴリ別にグループ化されています。各行で [完全一致] 列を確認してください。[はい] は、Oracle のデータ型が精度や意味的な損失なしに同等の型にマッピングされることを意味します。[いいえ] は、マッピングが近似的であり、ご自身のデータとの互換性を検証する必要があることを意味します。
数値データ型
| Oracle のデータ型 | Oracle のデータ型の注釈 | MySQL のデータ型 | AnalyticDB for MySQL のデータ型 | 完全一致 | INSERT | UPDATE | DELETE |
|---|---|---|---|---|---|---|---|
| NUMBER(3) | 3桁の整数 | BOOL or TINYINT(1) | BOOLEAN | いいえ | サポート済み | サポート済み | サポート済み |
| NUMBER(3) | 3桁の整数 | TINYINT | TINYINT | はい | サポート済み | サポート済み | サポート済み |
| NUMBER(5) | 5桁の整数 | SMALLINT | SMALLINT | はい | サポート済み | サポート済み | サポート済み |
| NUMBER(10) | 10桁の整数 | INT | INT or INTEGER | はい | サポート済み | サポート済み | サポート済み |
| NUMBER(19) | 19桁の整数 | BIGINT | BIGINT | はい | サポート済み | サポート済み | サポート済み |
| FLOAT(24) | 単精度浮動小数点 | FLOAT | FLOAT | はい | サポート済み | サポート済み | サポート済み |
| FLOAT(24) | 単精度浮動小数点 | DOUBLE | DOUBLE | いいえ | サポート済み | サポート済み | サポート済み |
| FLOAT(24) | 単精度浮動小数点 | DECIMAL | DECIMAL | いいえ | サポート済み | サポート済み | サポート済み |
文字データ型
| Oracle のデータ型 | Oracle のデータ型の注釈 | MySQL のデータ型 | AnalyticDB for MySQL のデータ型 | 完全一致 | INSERT | UPDATE | DELETE |
|---|---|---|---|---|---|---|---|
| CHAR(n) | 最大 n バイトの固定長文字列 | CHAR | VARCHAR | いいえ | サポート済み | サポート済み | サポート済み |
| VARCHAR2(128) | 最大 128 バイトの可変長文字列 | CHAR | VARCHAR(128) | いいえ | サポート済み | サポート済み | サポート済み |
| VARCHAR2(2000) | 最大 2000 バイトの可変長文字列 | VARCHAR(255) | VARCHAR(255) | いいえ、255 文字に切り捨てられます | サポート済み | サポート済み | サポート済み |
| VARCHAR2(4000) | 最大 4000 バイトの可変長文字列 | TEXT | VARCHAR(65535) | いいえ | サポート済み | サポート済み | サポート済み |
日時データ型
| Oracle のデータ型 | Oracle のデータ型の注釈 | MySQL のデータ型 | AnalyticDB for MySQL のデータ型 | 完全一致 | INSERT | UPDATE | DELETE |
|---|---|---|---|---|---|---|---|
| DATE | 日付と時刻 (年、月、日、時、分、秒) を格納 | DATE | DATE | いいえ、時刻部分が失われます | サポート済み | サポート済み | サポート済み |
| DATE | 日付と時刻 (年、月、日、時、分、秒) を格納 | TIME | TIME | いいえ、日付部分が失われます | 非対応 | 非対応 | 非対応 |
| DATE | 日付と時刻 (年、月、日、時、分、秒) を格納 | DATETIME | DATETIME | はい | サポート済み | サポート済み | サポート済み |
| DATE | 日付と時刻 (年、月、日、時、分、秒) を格納 | TIMESTAMP | TIMESTAMP | はい | サポート済み | サポート済み | サポート済み |
Oracle の DATE 型は、日付部分と時刻部分の両方を格納します。Oracle DATE を MySQL TIME にマッピングすると、日付部分が失われ、DML 同期はサポートされません。Oracle DATE を DATETIME または TIMESTAMP にマッピングして、完全な日時情報を保持してください。
Oracle から AnalyticDB for MySQL へのデータ同期
同期フローには、Oracle でのソーステーブルの作成と OGG の設定、MySQL でのチェックポイントメタデータテーブルの作成、そして AnalyticDB for MySQL でのターゲットテーブルの作成という 3 つの主要なフェーズがあります。
以下の DDL ステートメントは、ソースの Oracle テーブルと、それに対応するターゲットの AnalyticDB for MySQL テーブルを並べて示しているため、個々の手順を実行する前に、コンテキスト内で完全なデータ型マッピングを確認できます。
ソース (Oracle):
create table users.xqtest15 (
c1 number(10), -- int にマッピング
c2 number(1), -- boolean にマッピング
c3 number(3), -- tinyint にマッピング
c4 number(5), -- smallint にマッピング
c5 number(19), -- bigint にマッピング
c6 float(24), -- float にマッピング
c7 float(24), -- double にマッピング
c8 float(24), -- decimal(24, 0) にマッピング
c9 char(1), -- varchar(128) にマッピング
c10 varchar2(2000), -- varchar(255) にマッピング
c11 varchar2(4000), -- varchar(65535) にマッピング
c12 date, -- date にマッピング
c13 date, -- time にマッピング (DML はサポートされていません)
c14 date, -- datetime にマッピング
c15 date, -- timestamp にマッピング
primary key(c1)
);
ターゲット (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';
ステップ1:ECS インスタンスへのログイン
Oracle アカウントを使用して ECS インスタンスにログインします:
sqlplus ogg/ogg
ステップ2:Oracle でのソーステーブルの作成
次の SQL ステートメントを実行して、ソーステーブル 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)
);
ステップ3:OGG trandata の設定
ソーステーブルを作成した後、OGG でそのテーブルのサプリメンタル・ロギングを有効にします:
# OGG のインストールディレクトリに移動し、ggsci を起動します
cd /odata/ogg_o_12202
./ggsci
ggsci プロンプトで次のコマンドを実行します:
ggsci> dblogin userid goldengate, password ogg
ggsci> add trandata users.xqtest15
add trandata コマンドの末尾にセミコロン (;) を追加しないでください。セミコロンを追加すると、"No viable tables matched specification" エラーが発生します。
ステップ4:MySQL でのチェックポイントメタデータテーブルの作成
OGG は、レプリケーションの状態を追跡するために、MySQL に 2 つのチェックポイントテーブルを必要とします。次の SQL ステートメントを実行して、これらのテーブルを作成します:
-- チェックポイントテーブル
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';
-- チェックポイント 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';
ステップ5:AnalyticDB for MySQL でのターゲットテーブルの作成
Oracle から同期されたデータを受信するターゲットテーブルを作成します。列の型は、上記の「データ型の互換性」セクションのマッピングに従います。
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';
付録
以下の例は、各 DML 操作の同期結果を示しています。
-
INSERT 同期
Oracle のテーブル構造とクエリ結果:
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-20ADB 3.0 のテーブル作成ステートメント、クエリ結果、およびテーブル構造:
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) -> ) 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 | | | c11 | varchar(65535) | YES | MUL | NULL | | | c12 | date | YES | MUL | NULL | | | c13 | time | YES | MUL | NULL | | | c14 | datetime | YES | MUL | NULL | | | c15 | timestamp | YES | MUL | NULL | | +-------+----------------+------+-----+---------+---------------------+ -
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 | ccc c | 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> -
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>