Ora2Pg. Présentation, bonnes pratiques et futur du projet



Documents pareils
Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Ora2Pg Performances. (C) 2013 Gilles Darold

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

//////////////////////////////////////////////////////////////////// Administration bases de données

Bases de données avancées

Oracle Le langage procédural PL/SQL

Cours Bases de données 2ème année IUT

Devoir Data WareHouse

Notes de cours : bases de données distribuées et repliquées

TP Contraintes - Triggers

Auto-évaluation Oracle: cours de base

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

Création d'une nouvelle base de données

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Programme détaillé. Administrateur de Base de Données Oracle - SQLServer - MySQL. Objectifs de la formation. Les métiers

Architecture de la plateforme SBC

Performances. Gestion des serveurs (2/2) Clustering. Grid Computing

Gestion des utilisateurs et de leurs droits

Olivier Mondet

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

TP Bases de données réparties

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Tutoriel compte-rendu Mission 1

Jérôme FESSY. IUT de Paris 5. Base de Données. Cours Introductif. Base de Données

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Le Langage SQL version Oracle

Introduction au PL/SQL Oracle. Alexandre Meslé

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Configurer la supervision pour une base MS SQL Server Viadéis Services

Cours Bases de données 2ème année IUT

Réplication E-maj Foreign Data Wrapper PostGIS PostgreSQL-f

Administration des bases de données. Jean-Yves Antoine

Bases de SQL. Hacks 1-6 CHAPITRE UN

I/ Présentation. On considère une BD CIRQUE dont le schema conceptuel : PERSONNEL _CIRQUE (NOM, ROLE) ;

Bases de données et sites WEB

Historisation des données

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Guide d installation rapide

Le langage SQL (première partie) c Olivier Caron

Installation d'un serveur FTP géré par une base de données MySQL

Slony1 2.1 Londiste 3

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

Installation de Vmware serveur Windows

contact@nqicorp.com - Web :

Comment Créer une Base de Données Ab Initio

Installation de Zabbix

Installation des moteurs SQL Pour Micro-SESAME

Plan de formation : Certification OCA Oracle 11g. Les administrateurs de base de données (DBA) Oracle gèrent les systèmes informatiques

INSIA Bases de données ORACLE Installation SQL*Plus SQL-Developer

Partie 0 : Gestion des tablespace et des utilisateurs... 3

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Du 10 Fév. au 14 Mars 2014

Oracle 11g - Dataguard

Les déclencheurs. Version 1.0. Grégory CASANOVA

PostgreSQL. Formations. Catalogue Calendrier... 8

GUIDE D INSTALLATION DE L APPLICATION GECOL SUR

PPE GESTION PARC INFORMATIQUE

Administration des bases de données

Plan. Le système de transfert de fichiers d'internet. Introduction aux systèmes de transfert de fichiers Le protocole FTP.

Bases de Données Avancées PL/SQL

RECOVERY MANAGER G. Mopolo-Moké prof. MBDS UNSA 2005/ 2006

et Groupe Eyrolles, 2006, ISBN :

Déploiement OOo en environnement Windows Terminal Server

Installation d'un TSE (Terminal Serveur Edition)

Network Shutdown Module V3 Extension du Manuel Utilisateur pour architecture Virtualisée VMWare ESX Server 3, 3.5

CHAPITRE 4 POLITIQUES DE CONTRÔLES DES ACCÈS SOUS ORACLE ADMINISTRATION ET TUNING DE BASES DE DONNÉES 10/05/2015 RESPONSABLE DR K.

Cours: Administration d'une Base de Données

Guide d installation de SugarCRM Open Source version 4.5.1

TARGET SKILLS PlanningPME

Installation et configuration de VMware Workspace Portal

Ocs Inventory et GLPI s appuie sur un serveur LAMP. Je vais donc commencer par installer les paquets nécessaires.

Présentation du relais HTTP Open Source Vulture. Arnaud Desmons Jérémie Jourdin

Serveur Linux : FTP. Mise en place d un service FTP sous Linux. Bouron Dimitri 20/04/2014

NTP (Network Time Protocol)

PL langage de programmation côté serveur. SQL à la base : types, expressions, requêtes

Secteur Tertiaire Informatique Filière étude - développement. Accueil. Apprentissage. Période en entreprise. Evaluation.

Le Langage De Description De Données(LDD)

Procédure d'installation de PostgreSQL pour Windows

Le langage procédural PL-PGSQL

Titre: Version: Dernière modification: Auteur: Statut: Licence:

laposte.net) Ministère de l'éducation nationale Atelier sécurité Rabat RALL 2007

Réseaux Active Directory

Sommaire. Etablir une connexion avec une base de données distante sur PostGreSQL

HowTo Installer egroupware 1.2 sur SME Serveur 7.0

contact@nqicorp.com - Web :

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Guide d'installation et de configuration de Pervasive.SQL 7 dans un environnement réseau Microsoft Windows NT

Procédure serveur : gestion des environnements X3 et bases de données ORACLE

Comment Accéder à des Bases de Données MySQL avec Windows lorqu'elles sont sur un Serveur Linux

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

TP Administration Oracle

Création et Gestion des tables

Introduction à ORACLE WAREHOUSE BUILDER Cédric du Mouza

Transcription:

Ora2Pg Présentation, bonnes pratiques et futur du projet

Sommaire Historique et généralités Installation Bonnes pratiques Configuration générique Migration du schéma Migration des données Migration des procédures stockées Tests unitaires Conversion PL/SQL vers PLPGSQL Futur d'ora2pg

Historique 1/2 Créé en 2000 Outil de duplication de données Oracle vers PostgreSQL Copie table vers table (+/- certaines colonnes) Scanner de bases Oracle / reverse engineering Difficulté d'obtenir l'information Oracletool (http://www.oracletool.com/)) Outil Web en Perl pour DBAs Oracle par Adam vonnieda

Historique 2/2 Outil d'aide à la migration d'une base Oracle vers PostgreSQL Première version officielle : mai 2001 2002 : Ora2Pg est ajouté au répertoire contrib/ de PostgreSQL v7.2 2006 : il est supprimé du répertoire contrib/ de PostgreSQL v8.2 2008 : Ora2Pg migre sur PgFoundry 2010 : site d'ora2pg => http://ora2pg.darold.net/ 2011 : migration des sources sur SourceForge.net Version actuelle : Ora2Pg 8.8

A propos de la migration Oracle vers PostgreSQL Démystifier la migration des bases Oracle Migrations automatiques rarement possibles Lenteur des couches de compatibilité Autres outils d'aide à la migration Orafce (http://pgfoundry.org/projects/orafce/) EnterpriseDB Advanced Server Plus Bull (http://www.bull.us/liberatedb/) Pas de miracle, nécessite un minimum de réécriture

Architecture du code Ora2Pg.pm - module principal réalisant l'interface avec Oracle et permettant tous les types d'exports. Ora2Pg/PSQL.pm - module réalisant la conversion du code Oracle PL/SQL en code PLPGSQL. ora2pg - script Perl servant de frontend aux modules Perl. ora2pg.conf - fichier de configuration définissant le comportement du script Perl ora2pg et des actions à réaliser.

Prérequis Oracle >= 8i client ou serveur installé PostgreSQL >= 8.4 client ou serveur installé Perl 5.8+ et les modules DBI / DBD::Oracle Windows : Strawberry Perl 5.10+ Modules Perl optionnels : DBD::Pg - import direct dans PostgreSQL Compress::Zlib - compression des fichiers en sortie Multi-threading : Perl compilé avec le support des threads perl -V grep useithread=defined

Installation 1/2 Oracle / PostgreSQL : suivre la procédure d'installation de votre système. Définition de la variable ORACLE_HOME Export ORACLE_HOME=/usr/lib/oracle/10.2.0.4/client64 Fichier tnsnames.ora cat <<EOF > $ORACLE_HOME/network/admin/tnsnames.ora EOF XE = ( DESCRIPTION = ) (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.10) (port = 1521) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE) )

Installation 2/2 Vérifier l'installation Oracle avec tnsping ou sqlplus. Installation de DBD::Oracle et DBD::Pg Installation sous Unix/Linux perl Makefile.PL make && sudo make install Installation sous windows perl Makefile.PL dmake && dmake install Installer manuellement ora2pg.pl et ora2pg.conf

Espace de travail 1/2 mig_project/ mig_config/ ora2pg.conf mig_schema/ users/ tables/ sequences/ views/ triggers/ functions/ procedures/ types/ packages/ tablespaces/ mig_source/ oraviews/ oratriggers/ oratypes/ orafunctions/ oraprocedures/ Orapackages/ mig_data/

Espace de travail 2/2 Script de création de l'arborescence de travail #!/bin/sh mkdir mig_project/ && cd mig_project/ for d in users tables sequences views triggers functions procedures types packages tablespaces do done mkdir p mig_schema/$d for d in oratypes oraviews oratriggers orafunctions oraprocedures orapackages do done mkdir p mig_source/$d mkdir mig_config/ mkdir mig_data/ cp n /etc/ora2pg/ora2pg.conf mig_config/

Configuration générique 1/4 Connexion Oracle, le DataSourceName ORACLE_DSN dbi:oracle:host=192.168.1.10;sid=xe ORACLE_USER hr ORACLE_PWD mypassphrase Utilisateur Oracle : DBA ou pas DBA obligatoire pour l'export des GRANT, TYPE et TABLESPACE (accès aux tables DBA_*) Si l'utilisateur n'est pas DBA utilisation des tables ALL_* USER_GRANTS 1

Configuration générique 2/4 Le schéma Oracle doit-il être reporté dans PG? EXPORT_SCHEMA 1 Liste des schéma : ora2pg -t SHOW_SCHEMA Y a-t-il des tables à exclure de l'export? EXCLUDE table1 table2 table3 Liste des tables : ora2pl -t SHOW_TABLE Renommage des tables et colonnes REPLACE_TABLES REPLACE_COLS Liste des colonnes d'une table: ora2pl -t SHOW_COLUMN -x TABLE_NAME

Configuration générique 3/4 Quel est l'encodage de la base Oracle NLS_LANG AMERICAN_AMERICA.UTF8 ora2pg -t SHOW_ENCODING Obtenu par concaténation des valeurs de NLS_LANGUAGE, NLS_TERRITORY et NLS_CHARACTERSETS. Exemple : FRENCH_FRANCE.WE8ISO8859P1. Conversion de l'encodage par PostgreSQL CLIENT_ENCODING LATIN9 Jeux de caractères dans PostgreSQL http://www.postgresql.org/docs/9.1/static/multibyte.html

Configuration générique 4/4 DATA_LIMIT 10000 DROP_FKEY 0 DISABLE_TABLE_TRIGGERS 0 FILE_PER_CONSTRAINT 1 FILE_PER_INDEX 1 FILE_PER_TABLE 1 FILE_PER_FUNCTION 1 TRUNCATE_TABLE 1 PG_SUPPORTS_WHEN 1 PG_SUPPORTS_INSTEADOF 1 STANDARD_CONFORMING_STRINGS 1

Migration du Schéma 1/4 Les différents types d'export : TABLESPACE - GRANT - TYPE TABLE - SEQUENCE - VIEW - TRIGGER FUNCTION - PROCEDURE - PACKAGE Export par modification du fichier de configuration ou l'utilisation de INCLUDE Plus souple avec les options -t, -o, -b en ligne de commande. -t EXPORT_NAME : type d'export -o FILENAME : fichier de sortie (output.sql) -b DIRECTORY : répertoire de stockage des fichiers

Migration du Schéma 2/4 export ora2pg_conf=mig_configs/ora2pg.conf ora2pg -t TABLE -o table.sql -b mig_schema/tables -c $ora2pg_conf ora2pg -t SEQUENCE -o sequences.sql -b mig_schema/sequences -c $ora2pg_conf ora2pg -t GRANT -o users.sql -b mig_schema/users -c $ora2pg_conf ora2pg -t TABLESPACE -o tablespaces.sql -b mig_schema/tablespaces -c $ora2pg_conf ora2pg -p -t TYPE -o types.sql -b mig_schema/types -c $ora2pg_conf ora2pg -p -t VIEW -o views.sql -b mig_schema/views -c $ora2pg_conf ora2pg -p -t TRIGGER -o triggers.sql -b mig_schema/triggers -c $ora2pg_conf ora2pg -p -t FUNCTION -o functions.sql -b mig_schema/functions -c $ora2pg_conf ora2pg -p -t PROCEDURE -o procs.sql -b mig_schema/procedures -c $ora2pg_conf ora2pg -p -t PACKAGE -o packages.sql -b mig_schema/packages -c $ora2pg_conf ora2pg -t TYPE -o types.sql -b mig_schema/oratypes -c $ora2pg_conf ora2pg -t VIEW -o views.sql -b mig_schema/oraviews -c $ora2pg_conf ora2pg -t TRIGGER -o triggers.sql -b mig_schema/oratriggers -c $ora2pg_conf ora2pg -t FUNCTION -o functions.sql -b mig_schema/orafunctions -c $ora2pg_conf ora2pg -t PROCEDURE -o procs.sql -b mig_schema/oraprocedures -c $ora2pg_conf ora2pg -t PACKAGE -o packages.sql -b mig_schema/orapackages -c $ora2pg_conf

Migration du Schéma 3/4 Création du propriétaire de la base : createuser --no-superuser --no-createrole --no-createdb miguser Utilisation d'un schéma (EXPORT_SCHEMA) ALTER ROLE miguser SET search_path TO "migschema",public; Création de la base : createdb -E UTF-8 --owner miguser migdb Création des objets de la base : psql -U miguser -f sequences/sequences.sql migdb > create_migdb.log 2>&1 psql -U miguser -f tables/tables.sql migdb >> create_migdb.log 2>&1

Migration du Schéma 4/4 Lecture des logs et étude des problèmes Encodage des valeurs de contraintes CKECK Possibilité de code spécifique à Oracle dans les contraintes et les index Mots réservés PostgreSQL dans les noms de tables ou colonnes (ex: comment, user) Utilisation de types Oracle définis par l'utilisateur, voir TYPE Exemple de code en erreur : CREATE INDEX idx_userage ON user ( to_number(to_char('yyyy', user_age)) ); CREATE INDEX idx_userage ON «user» ( date_part('year', user_age) );

Migration des données 1/3 Création des fichiers de données : ora2pg -t COPY -o datas.sql -b mig_data/ -c mig_config/ora2pg.conf Import des données dans PostgreSQL psql -U miguser -f mig_data/datas.sql migdb >> migdb_data.log 2>&1 Restauration des contraintes et index psql -U miguser -f mig_schema/tables/constraints_table.sql migdb >> migdb_data.log 2>&1 psql -U miguser -f mig_schema/tables/indexes_table.sql migdb >> migdb_data.log 2>&1

Migration des données 2/3 L'export des champs BLOB en bytea est très lent en raison de l'échappement des données Exclure les tables avec colonne bytea lors de l'export global en utilisant la directive EXCLUDE Activer le multi-threading pour l'export de ces tables en utilisant la directive TABLES THREAD_COUNT à Ncore (<= 5 après on ne gagne pas grand chose en performance) DATA_LIMIT à 5000 max sinon risque d'oom Utilisation d'un ETL (par exemple Kettle) pour les très gros volumes de données

Migration des données 3/3 Problème de l'export des données avec des types composites ou XMLType Exemple d'insertion dans oracle: Insert into T_TEST (ID,OBJ) Values (1,"TEST_TYPE_A"(13,'obj')); Export par Ora2Pg INSERT INTO t_test (id,obj) VALUES (1,ARRAY(0x8772fb8)); COPY "t_test" ("id","obj") FROM stdin; 1 ARRAY(0xa555fb8) \. La solution nécessite de connaître le type des colonnes du type composite avant l'export des données. Ora2Pg >= 9.x

Migration des procédures stockées 1/2 Chargement des fonctions et procédures psql -U miguser -f procedures/procedures.sql migdb psql -U miguser -f functions/functions.sql migdb Chargement des paquets de fonctions psql -U miguser -f packages/packages.sql migdb Fichier dédié à chaque fonction de chaque paquet (un sous répertoire par paquet/schema) Arrêt sur erreur : \set ON_ERROR_STOP ON

Migration des procédures stockées 2/2 Il manque du code PL/SQL d'oracle? Activer COMPILE_SCHEMA force Oracle à valider de nouveau le PL/SQL avant l'export Manuellement : DBMS_UTILITY.compile_schema (schema => sys_context('userenv', 'SESSION_USER')); Activer EXPORT_INVALID pour exporter tout le code PL/SQL d'oracle même invalide. Par défaut Ora2Pg exporte seulement le code défini comme VALID par Oracle Ora2Pg préserve les commentaires défini dans le corps des fonctions.

Tests unitaires Validation du portage et du fonctionnement à l'identique de la version sous Oracle Il est possible que les résultats diffèrent: soit légèrement, par exemple avec le nombre de décimales après la virgule soit fortement, bien que le code PL/PGSQL ait été importé sans erreurs. Debugger le code PL/pgsql Edb-debugger (http://pgfoundry.org/projects/edb-debugger/) Pavel Stehule's plpgsql_lint (http://kix.fsv.cvut.cz/~stehule/download/)

Conversion PL/SQL vers PLPGSQL 1/5 Réécriture complète des en-têtes de triggers, fonctions, procédures et packages Remplacement de NVL par coalesce() Remplacement de trunc() en date_trunc('day', ) Remplacement de SYSDATE en LOCALTIMESTAMP (équivalent de CURRENT_TIMESTAMP sans le fuseau horaire) Supprime les appels à FROM DUAL Réécrit les appels aux séquences (nom.nextval nextval('nom')) Remplace les appels à MINUS par EXCEPT Remplace tous les types Oracle des définitions de variable en type PostgreSQL

Conversion PL/SQL vers PLPGSQL 2/5 Remplace dup_val_on_index en unique_violation Remplace raise_application_error en RAISE EXCEPTION Remplace les sorties Oracle DBMS_OUTPUT.(put_line put new_line) en RAISE NOTICE Supprime les DEFAULT NULL qui est la valeur par défaut sous PostgreSQL lorsqu'aucune valeur par défaut n'est précisée Réécrit les déclarations de curseur pour les rendre compatibles avec PostgreSQL Réécrit les RAISE EXCEPTION avec concaténation par le format à la sprintf utilisé par PostgreSQL

Conversion PL/SQL vers PLPGSQL 3/5 Ajout du mot clé STRICT aux SELECT INTO lorsqu'il y a un EXCEPTION NO_DATA_FOUND ou TOO_MANY_ROW Suppression des noms d'objets répétés après les END, exemple : END fct_name; est réécrit en END; Remplacement des WHERE ROWNUM = N ou AND ROWNUM = N par LIMIT N Déplacement des commentaires dans les CASE entre le WHEN et le THEN, non supporté par PostgreSQL Réécrit la clause HAVING GROUP BY en GROUP BY HAVING, inversée sous PostgreSQL Réécrit les appels aux fonctions add_months et add_years en + 'N months/year'::interval

Conversion PL/SQL vers PLPGSQL 4/5 Remplacement des conditions IS NULL et IS NOT NULL par des instructions à base de coalesce (pour Oracle, une chaîne vide est équivalente à NULL) Remplacement de SQLCODE par le presque équivalent SQLSTATE sous PostgreSQL Remplacement des TO_NUMBER(TO_CHAR( )) en to_char( )::integer, la fonction to_number() nécessitant deux paramètres sous PostgreSQL Remplacement de SYS_EXTRACT_UTC par AT TIME ZONE 'UTC' Inversement des bornes min et max dans les boucles FOR IN REVERSE min.. max

Conversion PL/SQL vers PLPGSQL 5/5 Remplacement des sorties de curseur EXIT WHEN... %NOTFOUND par IF NOT FOUND THEN EXIT; END IF; Remplacement de SQL%NOTFOUND par NOT FOUND Remplacement de SYS_REFCURSOR par REFCURSOR Remplacement de INVALID_CURSOR par INVALID_CURSOR_STATE Remplacement de ZERO_DIVIDE par DIVISION_BY_ZERO Remplacement de STORAGE_ERROR par OUT_OF_MEMORY Le code est dans le module Perl Ora2pg/PLSQL.pm et la fonction : plsql_to_plpgsql() toute contribution est la bienvenue

Futur d'ora2pg Hébergement du code source sur github.org Option pour la création d'un squelette de projet avec création des scripts d'export/import Option d'évaluation du coût de migration d'une base Oracle Option pour extraire un rapport sur le contenu de la base Oracle Appel d'une fonction de modification des données suivant le type, la table et la colonne Export de données de type composites et XML

Questions? http://ora2pg.darold.net/ http://sourceforge.net/projects/ora2pg/ gilles [ at ] darold [ dot ] net Http://2011.pgDay.eu/, Amsterdam