Dans cet article, je montre comment vous pouvez migrer une application Web complète d’Oracle Database vers YugabyteDB à l’aide du moteur de migration de données open source YugabyeDB Voyager. Pour améliorer la disponibilité, l’évolutivité et les performances de leurs applications, de nombreux développeurs migrent des bases de données relationnelles traditionnelles à serveur unique vers des clusters de bases de données distribuées. La migration vers YugabyteDB permet aux ingénieurs d’utiliser l’interface SQL bien connue, tout en bénéficiant des caractéristiques de résilience des données et de performances des bases de données distribuées.
Que vous préfériez lire ou regarder, migrons un exemple d’application de location de films vers YugabyteDB.
Application YugaRentals
J’ai développé une application appelée YugaRentals, conçue pour fonctionner à la fois sur Oracle Database et YugabyteDB.
L’application YugaRentals est une application de tableau de bord de location de films qui exploite le schéma Sakila populaire. Cette application affiche les locations de films les plus récentes, ainsi qu’une liste des ventes de location par catégorie de films.
Commençons par déployer et connecter à un Amazon RDS pour une instance Oracle. Plus tard, nous migrerons nos données vers un cluster managé YugabyteDB multi-nœuds.
Premiers pas avec la base de données Oracle
Nous pourrions exécuter Oracle Database dans Oracle Cloud, ou localement à l’aide de Docker ou d’une installation spécifique à la plate-forme. Dans ce cas, je vais montrer comment migrer une base de données hébergée sur Amazon RDS vers YugabyteDB Managed.
Configuration d’Amazon RDS pour Oracle
J’ai déployé une instance sur Amazon RDS pour Oracle et l’ai configurée pour qu’elle soit accessible depuis la machine exécutant l’application YugaRentals.
Connexion de YugaRentals à la base de données Oracle dans Node.js
La connexion à notre instance Oracle Database dans le cloud à partir de Node.js nécessite une configuration supplémentaire.
Le package node-oracledb peut être utilisé pour se connecter à notre base de données. Ce package nécessite l’installation des bibliothèques Oracle Client pour votre plate-forme. Ce guide de démarrage rapide est utile pour les utilisateurs novices.
Après avoir installé avec succès le package npm pour node-oracledb
et les bibliothèques clientes pour Oracle Database v19, nous pouvons utiliser l’extrait de code suivant pour nous connecter à notre instance.
// index.js
const oracledb = require("oracledb");
oracledb.initOracleClient({ libDir: process.env.ORACLE_CLIENT_LIB_PATH });
let connection = await oracledb.getConnection({
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
connectionString: `${process.env.DB_HOST}/${process.env.DB_NAME}`
});
console.log("Successfully connected to Oracle Database");
En définissant des variables d’environnement avec notre configuration d’instance et en exécutant l’application, nous pouvons confirmer que notre base de données est correctement configurée.
> DB_USER=admin \
DB_PASSWORD=foobar \
DB_HOST=[AMAZON_RDS_HOST] \
DB_NAME=ORCL \
ORACLE_CLIENT_LIB_PATH=/path/to/client/lib \
node index.js
Server running on port 8000
> DB_USER=admin \
DB_PASSWORD=foobar \
DB_HOST=[AMAZON_RDS_HOST] \
DB_NAME=ORCL \
ORACLE_CLIENT_LIB_PATH=/path/to/client/lib \
node index.js
Server running on port 8000
Successfully connected to Oracle Database
Après avoir vérifié que notre base de données Oracle s’exécute dans le cloud, nous pouvons commencer à migrer vers YugabyteDB Managed.
Configuration de YugabyteDB géré
Il faut moins de cinq minutes pour démarrer avec YugabyteDB Managed. Tout d’abord, créez un compte ; puis suivez les étapes pour créer un cluster YugabyteDB.
J’ai choisi de déployer un cluster à trois nœuds sur AWS, dans la région us-west-2. Cette configuration fournira une tolérance aux pannes dans les zones de disponibilité.
Ajoutez votre adresse IP à la liste d’autorisation du cluster afin de pouvoir vous connecter depuis votre ordinateur à la base de données distante, puis téléchargez les informations d’identification de la base de données avant de créer votre cluster.
Une fois notre cluster déployé, nous sommes prêts à commencer la migration avec YugabyteDB Voyager.
Migrer vers YugabyteDB avec YugabyteDB Voyager
Après avoir vérifié notre déploiement de base de données Oracle, il est temps de migrer d’Amazon RDS pour Oracle vers YugabyteDB à l’aide de l’interface de ligne de commande YugabyteDB Voyager.
YugabyteDB Voyager est un puissant moteur de migration de données open source, qui gère l’intégralité du cycle de vie de la migration des données.
Préparer les bases de données
Après avoir installé YugabyteDB Voyager, nous commençons par créer des utilisateurs dans nos bases de données source et cible et leur attribuer des rôles.
C’est ainsi que vous pouvez utiliser la bibliothèque cliente Oracle SQL*Plus précédemment installée.
> sqlplus 'admin@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=AMAZON_RDS_HOST)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))'
// SQL Shell
SQL >
1. Créez un rôle avec des privilèges d’accès en lecture.
CREATE ROLE ADMIN_reader_role;
BEGIN
FOR R IN (SELECT owner, object_name FROM all_objects WHERE owner="ADMIN" and object_type in ('VIEW','SEQUENCE','TABLE PARTITION','TABLE','SYNONYM','MATERIALIZED VIEW'))
LOOP
EXECUTE IMMEDIATE 'grant select on '||R.owner||'."'||R.object_name||'" to ADMIN_reader_role';
END LOOP;
END;
/
BEGIN
FOR R IN (SELECT owner, object_name FROM all_objects WHERE owner="ADMIN" and object_type="TYPE")
LOOP
EXECUTE IMMEDIATE 'grant execute on '||R.owner||'."'||R.object_name||'" to ADMIN_reader_role';
END LOOP;
END;
/
GRANT SELECT_CATALOG_ROLE TO ADMIN_reader_role;
GRANT SELECT ANY DICTIONARY TO ADMIN_reader_role;
GRANT SELECT ON SYS.ARGUMENT$ TO ADMIN_reader_role;
2. Créez un utilisateur et attribuez des rôles.
CREATE USER ybvoyager IDENTIFIED BY password;
GRANT CONNECT TO ybvoyager;
GRANT ADMIN_reader_role TO ybvoyager;
3. Répétez ce processus pour l’instance YugabyteDB Managed en vous connectant via Cloud Shell :
// Optionally, you can create a database for import. Otherwise, the target database will default to 'yugabyte'.
yugabyte=> CREATE USER ybvoyager PASSWORD 'password';
yugabyte=> GRANT yb_superuser TO ybvoyager;
Exporter le schéma
Nos bases de données source et cible sont maintenant équipées pour utiliser Voyager.
1. Créez un répertoire d’exportation et une variable d’environnement associée. Il hébergera des fichiers de schéma et de données, ainsi que des journaux, des métadonnées et des rapports d’analyse de schéma.
> mkdir ~/export-dir
> export EXPORT_DIR=$HOME/export-dir
2. Exportez le schéma depuis la base de données Oracle.
> yb-voyager export schema --export-dir ~/export-dir \
--source-db-type oracle \
--source-db-host ORACLEDB_HOST \
--source-db-user ybvoyager \
--source-db-password password \
--source-db-name ORCL \
--source-db-schema ADMIN
...
export of schema for source type as 'oracle'
oracle version: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
exporting TYPE done
exporting SEQUENCE done
exporting TABLE done
exporting PARTITION done
exporting PACKAGE done
exporting VIEW done
exporting TRIGGER done
exporting FUNCTION done
exporting PROCEDURE done
exporting MVIEW done
exporting SYNONYM done
Exported schema files created under directory: /export-dir/schema
3. Analysez le schéma exporté.
> yb-voyager analyze-schema --export-dir ~/export-dir --output-format txt
-- find schema analysis report at: /export-dir/reports/report.txt
En analysant notre schéma avant d’exporter les données, nous avons la possibilité d’apporter les modifications nécessaires à nos déclarations DDL. Le rapport d’analyse de schéma signalera toutes les déclarations nécessitant une intervention manuelle.
Le rapport d’analyse de schéma généré montre que le schéma exporté peut être migré sans aucune modification. Bonnes nouvelles!
Cependant, c’est une chance de faire des optimisations de schéma basées sur notre connaissance des différences entre PostgreSQL et Oracle Database.
Optimiser le schéma
Oracle Database utilise des déclencheurs avec des séquences pour définir des valeurs pour les colonnes à incrémentation automatique si aucune valeur n’est fournie. Dans PostgreSQL, nous pouvons accéder à la séquence pour définir une valeur par défaut directement dans la définition de la table, comme ceci :
CREATE TABLE city (
city_id INT DEFAULT nextval('city_sequence') NOT NULL
...
)
Après avoir optimisé la définition de la table, nous pouvons modifier le déclencheur associé.
//NEW
CREATE OR REPLACE FUNCTION trigger_fct_city_before_trigger() RETURNS trigger AS $BODY$
BEGIN
NEW.last_update:=current_date;
RETURN NEW;
END
$BODY$
LANGUAGE 'plpgsql';
//OLD
CREATE OR REPLACE FUNCTION trigger_fct_city_before_trigger() RETURNS trigger AS $BODY$
BEGIN
IF (NEW.city_id IS NULL) THEN
SELECT nextval('city_sequence') INTO STRICT NEW.city_id
;
END IF;
NEW.last_update:=current_date;
RETURN NEW;
END
$BODY$
LANGUAGE 'plpgsql';
Ces optimisations peuvent être appliquées à plusieurs de nos tables. J’ai créé un script shell, qui peut être exécuté pour effectuer ces modifications de schéma automatiquement. Voici comment vous pouvez l’exécuter depuis la ligne de commande :
> ./optimize_schema.sh export_dir=$HOME/export-dir
Exporter des données
Maintenant que nous avons optimisé notre schéma, il est temps d’exporter nos données.
Exportez les données de la base de données Oracle.
> yb-voyager export data --export-dir ~/export-dir \
--source-db-type oracle \
--source-db-host ORACLEDB_HOST \
--source-db-user ybvoyager \
--source-db-password password \
--source-db-name ORCL \
--source-db-schema ADMIN
export of data for source type as 'oracle'
Num tables to export: 17
table list for data export: [ACTOR ADDRESS CATEGORY CITY COUNTRY CUSTOMER FILM FILM_ACTOR FILM_CATEGORY FILM_TEXT INVENTORY LANGUAGE PAYMENT RENTAL STAFF STORE TODOITEM]
calculating approx num of rows to export for each table...
Initiating data export.
Data export started.
Exported tables:- {ACTOR, ADDRESS, CATEGORY, CITY, COUNTRY, CUSTOMER, FILM_ACTOR, FILM_CATEGORY, FILM_TEXT, INVENTORY, LANGUAGE, STAFF, PAYMENT, STORE, RENTAL, TODOITEM, FILM}
TABLE ROW COUNT
ACTOR 200
ADDRESS 603 ...