Oracle GoldenGate (OGG) synchronise les données Oracle vers AnalyticDB for MySQL en temps réel. Cette rubrique présente le mappage des types de données entre Oracle et AnalyticDB for MySQL, et explique comment configurer une synchronisation de bout en bout avec OGG.
Prérequis
Avant de commencer, vérifiez que vous disposez des éléments suivants :
Une base de données Oracle avec OGG installé dans le répertoire
/odata/ogg_o_12202Une instance Elastic Compute Service (ECS) qui héberge la base de données Oracle
Une instance AnalyticDB for MySQL
Une instance MySQL pour stocker les métadonnées des points de contrôle OGG
Compatibilité des types de données
OGG achemine les données d'Oracle via MySQL avant de les écrire dans AnalyticDB for MySQL. Les tableaux ci-dessous illustrent le mappage des types de données Oracle vers les types de données AnalyticDB for MySQL à chaque étape, ainsi que les opérations DML prises en charge.
Les types sont regroupés par catégorie. Pour chaque ligne, consultez la colonne Exact match : Yes indique que le type Oracle correspond exactement à un type équivalent, sans perte de précision ni de sémantique ; No signifie que le mappage est approximatif et que vous devez vérifier la compatibilité avec vos données.
Types numériques
| Type Oracle | Remarques sur le type Oracle | Type MySQL | Type AnalyticDB for MySQL | Exact match | INSERT | UPDATE | DELETE |
|---|---|---|---|---|---|---|---|
| NUMBER(3) | Entier à 3 chiffres | BOOL ou TINYINT(1) | BOOLEAN | No | Pris en charge | Pris en charge | Pris en charge |
| NUMBER(3) | Entier à 3 chiffres | TINYINT | TINYINT | Yes | Pris en charge | Pris en charge | Pris en charge |
| NUMBER(5) | Entier à 5 chiffres | SMALLINT | SMALLINT | Yes | Pris en charge | Pris en charge | Pris en charge |
| NUMBER(10) | Entier à 10 chiffres | INT | INT ou INTEGER | Yes | Pris en charge | Pris en charge | Pris en charge |
| NUMBER(19) | Entier à 19 chiffres | BIGINT | BIGINT | Yes | Pris en charge | Pris en charge | Pris en charge |
| FLOAT(24) | Nombre à virgule flottante simple précision | FLOAT | FLOAT | Yes | Pris en charge | Pris en charge | Pris en charge |
| FLOAT(24) | Nombre à virgule flottante simple précision | DOUBLE | DOUBLE | No | Pris en charge | Pris en charge | Pris en charge |
| FLOAT(24) | Nombre à virgule flottante simple précision | DECIMAL | DECIMAL | No | Pris en charge | Pris en charge | Pris en charge |
Types de caractères
| Type Oracle | Remarques sur le type Oracle | Type MySQL | Type AnalyticDB for MySQL | Exact match | INSERT | UPDATE | DELETE |
|---|---|---|---|---|---|---|---|
| VARCHAR2(128) | Chaîne de longueur variable, jusqu'à 128 octets | CHAR | VARCHAR(128) | No | Pris en charge | Pris en charge | Pris en charge |
| VARCHAR2(2000) | Chaîne de longueur variable, jusqu'à 2000 octets | VARCHAR(255) | VARCHAR(255) | No — tronqué à 255 caractères | Pris en charge | Pris en charge | Pris en charge |
| VARCHAR2(4000) | Chaîne de longueur variable, jusqu'à 4000 octets | TEXT | VARCHAR(65535) | No | Pris en charge | Pris en charge | Pris en charge |
Types date et heure
| Type Oracle | Remarques sur le type Oracle | Type MySQL | Type AnalyticDB for MySQL | Exact match | INSERT | UPDATE | DELETE |
|---|---|---|---|---|---|---|---|
| DATE | Stocke la date et l'heure (année, mois, jour, heure, minute, seconde) | DATE | DATE | No — la composante horaire est perdue | Pris en charge | Pris en charge | Pris en charge |
| DATE | Stocke la date et l'heure (année, mois, jour, heure, minute, seconde) | TIME | TIME | No — la composante date est perdue | N/A | N/A | N/A |
| DATE | Stocke la date et l'heure (année, mois, jour, heure, minute, seconde) | DATETIME | DATETIME | Yes | Pris en charge | Pris en charge | Pris en charge |
| DATE | Stocke la date et l'heure (année, mois, jour, heure, minute, seconde) | TIMESTAMP | TIMESTAMP | Yes | Pris en charge | Pris en charge | Pris en charge |
Le type DATE d'Oracle stocke à la fois la date et l'heure. Le mappage du type DATE d'Oracle vers le type TIME de MySQL entraîne la perte de la composante date et ne prend pas en charge la synchronisation DML. Mappez le type DATE d'Oracle vers DATETIME ou TIMESTAMP afin de conserver l'intégralité des informations de date et d'heure.
Synchroniser les données Oracle vers AnalyticDB for MySQL
Le flux de synchronisation comporte trois phases principales : créer la table source dans Oracle et configurer OGG, créer les tables de métadonnées des points de contrôle dans MySQL, puis créer la table cible dans AnalyticDB for MySQL.
Les instructions DDL suivantes présentent côte à côte la table source Oracle et sa table cible correspondante dans AnalyticDB for MySQL, afin que vous puissiez visualiser le mappage complet des types dans son contexte avant d'exécuter les étapes individuelles.
Source (Oracle) :
create table users.xqtest15 (
c1 number(10), -- maps to int
c2 number(1), -- maps to boolean
c3 number(3), -- maps to tinyint
c4 number(5), -- maps to smallint
c5 number(19), -- maps to bigint
c6 float(24), -- maps to float
c7 float(24), -- maps to double
c8 float(24), -- maps to decimal(24, 0)
c9 char(1), -- maps to varchar(128)
c10 varchar2(2000), -- maps to varchar(255)
c11 varchar2(4000), -- maps to varchar(65535)
c12 date, -- maps to date
c13 date, -- maps to time (DML not supported)
c14 date, -- maps to datetime
c15 date, -- maps to timestamp
primary key(c1)
);
Cible (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';
Étape 1 : Se connecter à l'instance ECS
Connectez-vous à l'instance ECS en utilisant le compte Oracle :
sqlplus ogg/ogg
Étape 2 : Créer la table source dans Oracle
Exécutez l'instruction SQL suivante pour créer la table source 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)
);
Étape 3 : Configurer trandata OGG
Après avoir créé la table source, activez la journalisation supplémentaire pour celle-ci dans OGG :
# Navigate to the OGG installation directory and start ggsci
cd /odata/ogg_o_12202
./ggsci
Exécutez les commandes suivantes dans l'invite ggsci :
ggsci> dblogin userid goldengate, password ogg
ggsci> add trandata users.xqtest15
N'ajoutez pas de point-virgule (;) à la fin de la commande add trandata. L'ajout d'un point-virgule provoque l'erreur No viable tables matched specification.
Étape 4 : Créer les tables de métadonnées des points de contrôle dans MySQL
OGG nécessite deux tables de point de contrôle dans MySQL pour suivre l'état de la réplication. Exécutez les instructions SQL suivantes pour les créer :
-- Checkpoint table
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';
-- Checkpoint LOX table
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';
Étape 5 : Créer la table cible dans AnalyticDB for MySQL
Créez la table cible qui recevra les données synchronisées depuis Oracle. Les types de colonnes suivent le mappage indiqué dans la section Compatibilité des types de données ci-dessus.
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';
Annexe
Les exemples suivants montrent les résultats de la synchronisation pour chaque opération DML.
-
Synchronisation INSERT
Structure de la table Oracle et résultats de la requête :
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-20Instruction de création de table ADB 3.0, résultats de la requête et structure de la table :
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 | | +-------+----------------+------+-----+---------+---------------------+ -
Synchronisation 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> -
Synchronisation 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>