Schéma et données

Module N2

Dalibo SCOP

24.09

29 août 2024

Sur ce document

Formation Module N2
Titre Schéma et données
Révision 24.09
PDF https://dali.bo/n2_pdf
EPUB https://dali.bo/n2_epub
HTML https://dali.bo/n2_html
Slides https://dali.bo/n2_slides
TP https://dali.bo/n2_tp
TP (solutions) https://dali.bo/n2_solutions

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.

Schéma et données

Introduction

Ce module est organisé en trois parties :

  • Configuration d’Ora2Pg
  • Migration du schéma
  • Migration des données

Configuration d’Ora2Pg

Étapes de la configuration :

  • Syntaxe du fichier de configuration
  • Connexion et schéma Oracle
  • Validation de la configuration
  • La base Oracle vue par Ora2Pg
  • Estimation de la charge de migration
  • Création d’une configuration générique

Structure du fichier

Structure

  • Fichier de configuration simple
  • Les lignes en commentaires débutent par un dièse (#)
  • Les variables sont en majuscules
  • Plusieurs paramètres sont du type binaire : 0 pour désactivé et 1 pour activé

Configuration locale

  • IMPORT fichier.conf
  • ORACLE_HOME /path/.../
  • DEBUG [0|1]
  • LOGFILE /path/.../migration.log

Connexion à Oracle

  • ORACLE_DSN
    • dbi:Oracle:host=serveur;sid=INSTANCE
    • dbi:Oracle:TNSNAME
    • dbi:Oracle://serveur:1521/service
  • ORACLE_USER (system par défaut)
  • ORACLE_PWD (manager par défaut)
  • SCHEMA
    • NOM_SCHEMA versus SYSUSERS
  • USER_GRANTS [0|1]
    • l’utilisateur Oracle a-t-il les droits DBA ?

Exploration de la base distante

Cette étape d’exploration permet d’obtenir des informations sur la base Oracle :

  • Liste des tables et colonnes
  • Recherche de l’encodage de la base

Découverte de la base

Certaines informations sont disponibles immédiatement, sans plus de configuration :

  • SHOW_VERSION affiche la version de l’instance Oracle.
  • SHOW_SCHEMA liste les schémas définis sous Oracle.
  • SHOW_TABLE affiche la liste des tables de la base Oracle.
  • SHOW_COLUMN affiche la liste des colonnes par table d’une base Oracle.

Gestion de l’encodage - 1

Recherche de l’encodage utilisé par l’instance Oracle :

  • SHOW_ENCODING : affiche les valeurs utilisées par Ora2Pg pour
    • NLS_LANG
    • CLIENT_ENCODING
  • NLS_LANG
    • AMERICAN_AMERICA.AL32UTF8
    • French_France.WE8ISO8895P1
  • NLS_NCHAR
    • AL32UTF8

Gestion de l’encodage - 2

  • CLIENT_ENCODING
    • utf8, latin1, latin9
  • BINMODE
    • utf8, raw

Configuration générique

Le but du fichier de configuration générique est multiple :

  • éviter de faire des allers/retours en édition sur ce fichier
  • éviter d’avoir une multitude de fichiers de configuration dédiés à chaque opération
  • utiliser la souplesse des options de ligne de commande

Fichiers de sortie

Utilisation de fichiers de sortie dédiés

  • FILE_PER_CONSTRAINT 1
  • FILE_PER_INDEX 1
  • FILE_PER_FKEYS 1
  • FILE_PER_TABLE 1
  • FILE_PER_FUNCTION 1

Ordres SQL additionnels

  • Ajout d’ordres SQL :
    • DISABLE_TRIGGERS 1
    • TRUNCATE_TABLE 1
    • DISABLE_SEQUENCE 1
    • COMPILE_SCHEMA [0|1]
  • Désactivation de la conversion automatique du PL/SQL :
    • PLSQL_PGSQL 0

Comportement côté PostgreSQL

Utilisation d’un schéma sous PostgreSQL ?

  • EXPORT_SCHEMA [0|1]
  • PG_SCHEMA nom_du_shema
  • CREATE_SCHEMA 0

Versions de PostgreSQL

  • Indiquer la version majeure cible de PostgreSQL
    • PG_VERSION 9.6
    • PG_VERSION 11
  • Par défaut : 11
  • Autres contrôles lié à la version :
    • BITMAP_AS_GIN : export des index bitmap en btree_gin
    • STANDARD_CONFORMING_STRINGS échappement dans les chaines de caractères

Bases spatiales

La base contient des champs de type SDO_GEOMETRY.

  • Faut-il utiliser les contraintes sur les géométries ?
    • AUTODETECT_SPATIAL_TYPE [0|1]
  • Quel système de référence spatial par défaut ?
    • DEFAULT_SRID 4326
    • CONVERT_SRID [0|1|N]
  • PostGIS est-il installé dans un schéma spécifique ?
    • POSTGIS_SCHEMA schema_name
  • Format d’export des géométries :
    • GEOMETRY_EXTRACT_TYPE [INTERNAL|WKT|WKB]

Configuration liée aux LOB

L’export des champs CLOB et BLOB sont contrôlés par :

  • LONGREADLEN 1047552
  • LONGTRUNCOK 0
  • NO_LOB_LOCATOR 0
  • BLOB_LIMIT 500

Migration du schéma

Étapes :

  • Organisation de l’espace de travail
  • Utilisation de la configuration générique
  • Export du schéma Oracle
  • Import du schéma dans PostgreSQL

Organisation de l’espace de travail

  • Arborescence d’un projet de migration
    • dossier de la configuration
    • dossier du schéma source Oracle
    • dossier du schéma converti à PostgreSQL
    • dossier des fichiers de données exportées
ora2pg --init_project dirname --project_base dirname

Utilisation de la configuration générique

  • Fichier ora2pg.conf générique
    • création du fichier ora2pg.conf générique dans le dossier de configuration
  • Utilisation des options de ligne de commande du script ora2pg
    • -t type d’export
    • -b répertoire de stockage des fichiers
    • -o nom du fichier de sortie
    • -p conversion automatique du code

Export de la structure de la base

  • Export des tables, contraintes et index
ora2pg -p -t TABLE -o table.sql -b schema/tables -c config/ora2pg.conf
  • Export des séquences
ora2pg -t SEQUENCE -o sequences.sql -b schema/sequences -c config/ora2pg.conf
  • Export des vues
ora2pg -p -t VIEW -o views.sql -b schema/views -c config/ora2pg.conf
  • Préservation des tablespaces Oracle : USE_TABLESPACE

Modification de la structure des objets

  • Renommer les objets
    • REPLACE_TABLES ORIG_TABLE1:DEST_TABLE1
    • REPLACE_COLS TABLE1(ORIG_COL1:DEST_COL1, [..])
    • INDEXES_SUFFIX _idx
    • INDEXES_RENAMING
  • Changer les types de données
    • DATA_TYPE NUMBER(*\,0):bigint
    • MODIFY_TYPE TABLE1:COL1:integer TABLE1:COL2:timestamptz
    • REPLACE_AS_BOOLEAN TABLE1:COL1 [..]

Export des objets globaux

  • Les rôles et droits
ora2pg -t GRANT -o users.sql -b schema/users -c config/ora2pg.conf
  • Les tablespaces
ora2pg -t TABLESPACE -o tablespaces.sql -b schema/tablespaces \
-c config/ora2pg.conf
  • Les types composites
ora2pg -p -t TYPE -o types.sql -b schema/types -c config/ora2pg.conf

Export des routines stockées

  • Export des objets avec conversion de code
ora2pg -p -t TRIGGER -o triggers.sql -b schema/triggers -c config/ora2pg.conf
ora2pg -p -t FUNCTION -o functions.sql -b schema/functions -c config/ora2pg.conf
ora2pg -p -t PROCEDURE -o procedures.sql -bschema/procedures -c config/ora2pg.conf
ora2pg -p -t PACKAGE -o packages.sql -b schema/packages -c config/ora2pg.conf

Export des sources PL/SQL

  • Extraction du code brut d’Oracle
ora2pg -t TYPE -o types.sql -b sources/types -c config/ora2pg.conf
ora2pg -t VIEW -o views.sql -b sources/views -c config/ora2pg.conf
ora2pg -t MVIEW -o mviews.sql -b sources/mviews -c config/ora2pg.conf
ora2pg -t TRIGGER -o triggers.sql -b sources/triggers -c config/ora2pg.conf
ora2pg -t FUNCTION -o functions.sql -b sources/functions -c config/ora2pg.conf
ora2pg -t PROCEDURE -o procedures.sql -b sources/procedures -c config/ora2pg.conf
ora2pg -t PACKAGE -o packages.sql -b sources/packages -c config/ora2pg.conf

Export des partitions

  • Partitions par range, list et hash
  • Partitions et sous-partitions
ora2pg -t PARTITION -o partitions.sql -b schema/partitions -c config/ora2pg.conf
  • Paramètrage : DISABLE_PARTITION et PG_SUPPORTS_PARTITION

Export des vues matérialisées

ora2pg -t MVIEW -o mviews.sql -b schema/mviews -c config/ora2pg.conf

Export des synonymes

PostgreSQL ne possède pas d’objet de type SYNONYM

  • Ce sont des alias vers des objets d’autres schémas ou bases de données
  • Il existe deux méthodes pour les émuler sous PostgreSQL :
    • modification du search_path
    • utilisation de vues
  • Ora2Pg utilise la deuxième méthode :
ora2pg -t SYNONYM -o synonyms.sql -b schema/synonyms -c config/ora2pg.conf

Export des tables externes

PostgreSQL ne possède pas d’objets de type DIRECTORY ni de tables EXTERNAL

  • Ce sont des répertoires et fichiers de données utilisés comme des tables
  • Sous PostgreSQL, il faut utiliser le Foreign Data Wrapper file_fdw
    • ne fonctionne qu’en lecture
    • ces tables doivent respecter le format CSV de COPY
ora2pg -t DIRECTORY -o directories.sql -b schema/directories -c config/ora2pg.conf

PostgreSQL ne possède pas d’objets de type DATABASE LINK

  • Ce sont des objets permettant l’accès à des bases distantes
  • Sous PostgreSQL il faut utiliser le Foreign Data Wrapper oracle_fdw
    • fonctionne en lecture / écriture
    • les tables distantes sont vues comme des tables locales
ora2pg -t DBLINK -o dblinks.sql -b schema/dblinks -c config/ora2pg.conf

Export des BFILE et DIRECTORY - 1

  • Sous PostgreSQL il n’y a pas d’équivalent aux types DIRECTORY et BFILE
    • Ora2Pg exporte les BFILE en donnée bytea par défaut
    • Si le type BFILE est redéfini en TEXT, stockage du chemin du fichier externe

Export des BFILE et DIRECTORY - 2

  • Pour avoir la même fonctionnalité : extension external_file
    • type EFILE correspondant au type BFILE : (directory_name, filename)
    • les fichiers sont stockés sur le système de fichier
    • fichier accessible en lecture / écriture
    • activé lorsque BFILE est redéfini en EFILE (directive DATA_TYPE)

Recherche Plein Texte

Oracle Index Texte

  • CONTEXT
    • indexation de documents volumineux
    • opérateur CONTAINS
  • CTXCAT
    • indexation de petits documents
    • opérateur CATSEARCH

Recherche Plein Texte

PostgreSQL : Full Text Search/Recherche Plein Texte

  • correspond à CONTEXT
  • opérateur @@ équivalent à CONTAINS
    SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');
  • S’appuie sur GIN ou GiST
  • Extension pg_trgm pour les recherches LIKE '%mot%mot%’, équivalent de CTXCAT

Préparation de l’import

  • Préparation de l’import du schéma
    • création du propriétaire de la base
    • création de la base
  • Si EXPORT_SCHEMA est activé
    • création du schéma
    • utilisation d’un schéma par défaut
  • Création des tablespaces

Import du schéma

Création des objets du schéma :

psql -U myuser -f schema/tables/tables.sql mydb >> create_mydb.log 2>&1
psql -U myuser -f schema/partitions/partitions.sql mydb >> create_mydb.log 2>&1
psql -U myuser -f schema/views/views.sql mydb >> create_mydb.log 2>&1
psql -U myuser -f schema/tablespaces/tablespaces.sql mydb >> create_mydb.log 2>&1

Import différé

Chargement différé de certains objets :

  • Séquences
  • Contraintes
  • Déclencheurs
  • Index

Bilan de l’export/import

Bilan de l’export/import du schéma :

  • Lecture des logs et étude des problèmes
  • Sensibilité à la casse
  • Encodage des valeurs de contraintes CHECK et conditions des index
  • Possibilité de code spécifique à Oracle dans les contraintes et les index
  • Champs numériques

Exemple d’erreurs

  • Accents dans les noms d’objets
  • Mots réservés
  • Certaines conversions implicites
    • CHECK (WYEAR between 0 and 9);
    • CHECK (wyear::integer between 0 and 9);

Migration des données

Étapes :

  • Export / import des données
  • Problèmes rencontrés
  • Restauration des séquences, contraintes, triggers et index
  • Performances de l’import des données
  • Utilisation du parallélisme
  • Limitation des données à importer

Exporter les données

  • Création des fichiers de données :
ora2pg -t COPY -o datas.sql -b data/ -c config/ora2pg.conf
ora2pg -t INSERT -o datas.sql -b data/ -c config/ora2pg.conf
  • Un fichier de données par table :
    • FILE_PER_TABLE 1
  • Compression des fichiers de données

Cas des données CLOB/BLOB

  • Les champs bytea
    • export des champs BLOB et CLOB en bytea très lent
    • exclusion temporaire des tables avec LOB
    • utilisation de la parallélisation pour ces tables

Cas des données spatiales

  • Le SRID, système spatial de référence
    • CONVERT_SRID converti la valeur Oracle dans la norme EPSG
    • DEFAULT_SRID force la valeur du SRID par défaut
  • Mode d’extraction des données GEOMETRY_EXTRACT_TYPE [WKT|WKB|INTERNAL]

Import des données

  • Import des fichiers de données :
psql -U myuser -f data/datas.sql mydb >> data_mydb.log 2>&1
gunzip -c data/datas.sql.gz | psql  -U myuser  mydb >> data_mydb.log 2>&1
bunzip2 -c data/datas.sql.bz2 | psql  -U myuser  mydb >> data_mydb.log 2>&1
  • Chargement direct dans PostgreSQL lors de l’export

Restauration des contraintes

Restauration des contraintes, triggers, séquences et index

psql -U myuser -f schema/tables/CONSTRAINTS_tables.sql mygdb >> create_mydb.log 2>&1
psql -U myuser -f schema/tables/INDEXES_tables.sql mygdb >> create_mydb.log 2>&1
psql -U myuser -f schema/sequences/sequences.sql mygdb >> create_mydb.log 2>&1
psql -U myuser -f schema/triggers/triggers.sql mygdb >> create_mydb.log 2>&1

Restauration parallélisée des contraintes

Action :

  • LOAD permet de paralléliser des ordres SQL sur N processus
ora2pg -c config/ora2pg -t LOAD -j 4 -i schema/tables/INDEXES_tables.sql
ora2pg -c config/ora2pg -t LOAD -j 4 -i schema/tables/CONSTRAINTS_tables.sql

Problèmes d’import des données

  • Problème d’échappement de caractères : utiliser COPY
  • Encodage des données : CLIENT_ENCODING
  • Erreur de type numérique : DEFAULT_NUMERIC ou ALTER TABLE
  • CLOB, BLOB et XML : LONGREADLEN

Performances de l’import des données

  • Type d’export COPY
  • Import direct dans PostgreSQL
    PG_DSN  dbi:Pg:dbname=test_db;host=localhost;port=5432
    PG_USER [nom_utilisateur]
    PG_PWD  [mot_de_passe]
  • Nombre d’enregistrements traités en mémoire : DATA_LIMIT

Utiliser le parallélisme

  • Parallélisme pour le traitement et l’import des données dans PostgreSQL
    • JOBS Ncores
  • Parallélisme pour l’extraction des données d’Oracle
    • ORACLE_COPIES Ncores
    • DEFINED_PKEY EMPLOYEE:ID
  • Parallélisme par tables exportées
    • PARALLEL_TABLES Ncores
  • Nombre de processus utilisés
    • JOBS x ORACLE_COPIES | PARALLEL_TABLES = Total Nombre cœurs

Limitation des données exportées

  • Contrôle des tables à exporter
    • ALLOW TABLE1 TABLE2 [..] TABLEN
    • EXCLUDE TABLE1 TABLE2 [..] TABLEN
  • Contrôle des données à exporter
    • WHERE TABLE[condition valide] GLOBAL_CONDITION
    • WHERE TABLE_TEST[ID1='001']
    • WHERE DATE_CREATION > '2001-01-01
    • REPLACE_QUERY TABLENAME[SQL_QUERY]

Après la migration

  • Supervision
  • Optimisation
  • VACUUM FREEZE préventif

Conclusion

  • Le temps de migration du schéma et des données est très rapide…
  • …il est souvent marginal par rapport au temps de la migration du code
  • Préférer toujours la dernière version d’Ora2Pg
  • Faites un retour d’expérience de votre migration à l’auteur

Pour aller plus loin

Questions

N’hésitez pas, c’est le moment !

Quiz

Travaux pratiques

Travaux pratiques (solutions)