Comment utiliser les règles de mappage AWS DMS pour migrer un schéma Oracle en minuscules dans PostgreSQL ?
Date de la dernière mise à jour : 01/09/2020
Je veux déplacer mon schéma de base de données Oracle dans PostgreSQL, mais la casse n'est pas compatible. Quelles sont les options qui s'offrent à moi ?
Brève description
Oracle stocke les métadonnées en majuscules dans son dictionnaire de données, et PostgreSQL en minuscules. Avec l'une ou l'autre des bases de données, il est possible de remplacer ces formats par défaut en mettant les noms d'objets entre guillemets lors de leur création. Cette pratique n'est toutefois pas recommandée, car elle peut entraîner un fonctionnement inattendu. Dans la mesure où AWS Database Migration Service (AWS DMS) ne peut pas corriger automatiquement le formatage des métadonnées, il place les objets créés entre guillemets. Pour contourner ce problème, vous pouvez remplacer les guillemets AWS DMS par des règles de mappage. Pour plus d'informations, consultez la section Utiliser AWS Schema Conversion Tool (AWS SCT) pour convertir votre schéma Oracle en PostgreSQL.
Solution
Cet exemple montre comment migrer le schéma Oracle SCOTT vers PostgreSQL. Si vous disposez d'une base de données Oracle sur site, vous pouvez créer ce schéma en exécutant la commande suivante :
$ORACLE_HOME/rdbms/admin/utlsampl.sql
Si vous disposez d'une instance de base de données Amazon Relational Database Service (Amazon RDS) exécutant Oracle, recherchez un script similaire en ligne.
Ce script crée quatre tables pour le schéma SCOTT : les tables EMP, DEPT, BONUS et SALGRADE. Celles-ci contiennent toutes un petit nombre de lignes.
Assurez-vous qu'aucune table de la base de données Oracle ne comporte de minuscules dans la table ou les noms de colonnes. Si l'application induit habituellement une casse mixte pour les noms de tables et de colonnes, il est recommandé d'autoriser AWS DMS à répliquer les tables exactement telles qu'elles sont détectées. Pour cette raison, n'utilisez pas ces règles de mappage.
oracle> SELECT table_name from dba_tables where owner='SCOTT' and table_name <> upper(table_name);
oracle> SELECT table_name, column_name from dba_tab_columns where owner='SCOTT' and column_name <> upper(column_name);
Créer des points de terminaison et une instance de réplication :
1. Utilisez la console AWS DMS ou AWS Command Line Interface (AWS CLI) pour créer l'instance de réplication puis créer les points de terminaison source et cible.
2. Créez une tâche. Veillez à choisir l'option Enable logging (Activer la journalisation).
3. Dans la vue Table mappings (Mappages des tables), sélectionnez l'onglet JSON, puis choisissez Enable JSON editing (Activer l'édition JSON). Utilisez ensuite un code similaire à celui de l'exemple suivant pour créer les règles de transformation pour la gestion de la casse pour les schémas, les tables et les colonnes. Pour plus d'informations, consultez la section Utilisation du mappage de table pour définir les paramètres de tâche.
{
"rules": [
{
"rule-type": "selection",
"rule-id": "1",
"rule-name": "select-scott",
"object-locator": {
"schema-name": "SCOTT",
"table-name": "%"
},
"rule-action": "include"
},
{
"rule-type": "transformation",
"rule-id": "2",
"rule-name": "convert-schemas-to-lower",
"rule-action": "convert-lowercase",
"rule-target": "schema",
"object-locator": {
"schema-name": "%"
}
},
{
"rule-type": "transformation",
"rule-id": "3",
"rule-name": "convert-tables-to-lower",
"rule-action": "convert-lowercase",
"rule-target": "table",
"object-locator": {
"schema-name": "%",
"table-name": "%"
}
},
{
"rule-type": "transformation",
"rule-id": "4",
"rule-name": "convert-columns-to-lowercase",
"rule-action": "convert-lowercase",
"rule-target": "column",
"object-locator": {
"schema-name": "%",
"table-name": "%",
"column-name": "%"
}
}
]
}
4. Choisissez Créer une tâche.
Remarque : au lieu de convertir le contenu du schéma en minuscules, vous pouvez également appliquer une règle de changement de nom.
Une fois la tâche créée, vérifiez que tous les objets sont créés en minuscules dans PostgreSQL :
postgres> select table_name from information_schema.tables where table_schema='scott';
table_name
------------
bonus
dept
salgrade
emp
(4 rows)
postgres> select table_name, column_name from information_schema.columns where table_schema='scott' order by table_name;
table_name | column_name
------------+-------------
bonus | ename
bonus | job
bonus | sal
bonus | comm
dept | deptno
dept | dname
dept | loc
emp | deptno
emp | hiredate
emp | sal
emp | comm
emp | empno
emp | ename
emp | job
emp | mgr
salgrade | losal
salgrade | hisal
salgrade | grade
(18 rows)
Informations connexes
Cet article vous a-t-il été utile ?
Besoin d'aide pour une question technique ou de facturation ?