Universit'a degli studi di Padova Da Oracle a PostgreSQL, analisi di una migrazione Tesi di Laurea - Facolt'a di Scienze MM.FF.NN - SIAGAS

Pagina creata da Viola Girardi
 
CONTINUA A LEGGERE
Università degli studi di Padova
                    Facoltà di Scienze MM.FF.NN.
                      Corso di Laurea in Informatica

           Da Oracle a PostgreSQL,
           analisi di una migrazione

                        Tesi di Laurea

Relatore:                                                Laureando:
Prof. Alessandro Sperduti                              Andrea Agosti
                                                        Mat. 543079
INDICE                                                                                                              INDICE

Indice
1 Introduzione                                                                                                                  4
  1.1 ARPAV . . . . . . . . . . . . . . . . . . . . . .                     .   .   .   .   .   .   .   .   .   .   .   .   .   4
       1.1.1 SIRAV . . . . . . . . . . . . . . . . . . .                    .   .   .   .   .   .   .   .   .   .   .   .   .   4
  1.2 Il progetto . . . . . . . . . . . . . . . . . . . . .                 .   .   .   .   .   .   .   .   .   .   .   .   .   5
       1.2.1 Scelta del candidato DBMS . . . . . . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   5
       1.2.2 Analisi preliminare e risultato dello stage                    .   .   .   .   .   .   .   .   .   .   .   .   .   6

2 Tecnologie                                                                                                                     7
  2.1 Oracle . . . . . . . . . . . . . . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
      2.1.1 Oracle 10g RAC . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
  2.2 PostgreSQL . . . . . . . . . . . . . . . . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
      2.2.1 Storia del progetto . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
      2.2.2 Architettura . . . . . . . . . . . . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
      2.2.3 Aderenza allo standard SQL . . . .                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
      2.2.4 Accesso concorrente ai dati . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
      2.2.5 Stored procedure . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
      2.2.6 Partizionamento delle tabelle . . .                 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
      2.2.7 Jobs . . . . . . . . . . . . . . . . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
      2.2.8 Affidabilità e continuità di servizio             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
      2.2.9 Evoluzioni future . . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
  2.3 LabWare LIMS . . . . . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
  2.4 Perl . . . . . . . . . . . . . . . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12

3 Sviluppo                                                                                                                      13
  3.1 Approccio al problema . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
  3.2 Ambiente di sviluppo . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
       3.2.1 Installazione di PostgreSQL        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
       3.2.2 Configurazione . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
  3.3 Amministrazione . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
  3.4 Collegamento con altri database . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
       3.4.1 dbi link . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
  3.5 Ora2Pg . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
       3.5.1 Utilizzo del modulo . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
       3.5.2 Conversione del codice . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
       3.5.3 Definizione delle view . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
       3.5.4 Materialized view . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
       3.5.5 Impressioni . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
  3.6 Creazione del database . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
  3.7 Applicativi . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
       3.7.1 Driver ODBC . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
       3.7.2 Applicativo LabWare LIMS           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
       3.7.3 Crystal Reports . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23

                                           1                                                                Pag: 1 di 67
INDICE                                                                                                                            INDICE

4 Test e risultati                                                                                                                            25
  4.1 Introduzione . . . . . . . . . . . . .                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
      4.1.1 Oracle XE . . . . . . . . . .                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
      4.1.2 Installazione . . . . . . . . .                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
  4.2 Metodologia di test . . . . . . . . .                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
      4.2.1 Test su tabella singola . . .                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
      4.2.2 Test su JOIN multiplo . . .                       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
      4.2.3 Test su connessioni multiple                      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
      4.2.4 Test su sessione di lavoro . .                    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
      4.2.5 Test sulla scalabilità . . . .                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
  4.3 Risultati dei test . . . . . . . . . .                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   31

5 Analisi tecnica                                                                     36
  5.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
  5.2 Analisi dei risultati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

6 Conclusioni                                                                                                                                 38
  6.1 Fattibilità del progetto   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   38
  6.2 Vantaggi tecnici . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   38
  6.3 Vantaggi economici . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
  6.4 Vantaggi commerciali .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
  6.5 Vantaggi etici . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   40
  6.6 Consuntivo di progetto      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   41
  6.7 Prodotti dello stage . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   41
  6.8 Conclusioni personali .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   41

A Piano di Lavoro                                                                    43
  A.1 Preventivo ore per attività . . . . . . . . . . . . . . . . . . . . . . . . . 43
  A.2 Consuntivo attività effettuate . . . . . . . . . . . . . . . . . . . . . . . 43

B Codice sorgente                                                                                                                             45
  B.1 export full.pl . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   45
  B.2 export data.pl . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   47
  B.3 limsDebugSqlParser.sql      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   48
  B.4 benchmark sql.pl . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   50
  B.5 benchmark thread.pl .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   59

C Glossario                                                                                                                                   63

D Ringraziamenti                                                                                                                              64

                                                      2                                                                   Pag: 2 di 67
INDICE                                                                                INDICE

                                        Sommario
        Con l’avvento di internet ed il continuo sviluppo delle reti di comunicazione,
    l’importanza di avere accesso ad una informazione è fondamentale ed indispen-
    sabile per ogni azienda o individuo. In pochi anni siamo passati da uno scenario
    in cui poche fonti di informazioni monopolizzavano l’accesso ad uno dove ogni
    singola persona può essere portatore di conoscenza per milioni di altri individui.
    Avere accesso a questo flusso continuo di dati diventa strategico per tutte quelle
    realtà in cui le decisioni dipendono dalla conoscenza acquisita e sono critiche
    per il successo della propria attività. Mantenere una informazione aggiornata,
    organizzata e fruibile è quindi indispensabile e per questo deve essere affidata
    a strumenti che assicurino una elevata affidabilità e continuità di servizio. In
    questo campo hanno avuto grande successo le Basi di Dati Relazionali [C] grazie
    allo sviluppo di soluzioni software che permettono di gestire collezioni di dati
    con relativa facilità. Tuttavia, con l’aumentare del numero di informazioni da
    gestire, diventa sempre più difficile e oneroso riuscire ad assicurare di ottenere
    l’informazione desiderata in tempi ragionevoli. Per questo, la più remunerativa
    fetta del mercato dei DBMS [C] è sicuramente quella enterprise,che raccoglie le
    più grandi aziende mondali. E di questo mercato, la soluzione leader è Oracle
    Database che ha saputo conquistare il suo primato con prodotti innovativi ed è in
    grado di assicurare prestazioni elevate, alta affidabilità e una ottima scalabilità.
    Il rovescio della medaglia si trova nel costo estremamente elevato con cui Oracle
    licenzia l’utilizzo dei propri prodotti, forte della sua posizione dominante e della
    difficoltà di trovare un reale competitor in grado di combattere ad armi pari.
    L’obiettivo principale di questo progetto è scoprire se il mondo open source[C]
    ha una soluzione che si pone in competizione con Oracle senza essere soggetti
    alle pesanti restrizioni d’uso e liberandosi dai cospiqui costi delle licenze.

                                              3                                   Pag: 3 di 67
1 INTRODUZIONE

1       Introduzione
1.1     ARPAV
L’ARPAV, Agenzia Regionale per la Prevenzione e Protezione Ambientale del Veneto,
è un’agenzia regionale nata nel 1996 con la Legge Regionale n◦ 32 del 18 ottobre[1] e di-
venuta operativa il 3 ottobre 1997. La necessità segue l’esito del referendum dell’aprile
1993[2] e la sua attuazione attraverso la Legge 61 del 1994[3] emanata dal Parlamento
Italiano. Gli obiettivi di principali che persegue sono due:

    • la protezione ambientale e della popolazione attraverso controlli del territorio;

    • la prevenzione, attraverso la formazione, la ricerca, l’informazione e l’educazione.

L’ARPAV è dotata di autonomia amministrativa, organizzativa, tecnica e contabile,
ed è quindi in grado di riunire figure professionali provenienti da realtà diversificate
per ottenere un approccio multidisciplinare ai compiti dell’agenzia stessa. Per una
migliore copertura del territorio e degli incarichi, sono presenti inoltre due dipartimenti
regionali e sette provinciali con autonomia gestionale, coordinati da una direzione
centrale. Le attività principali portate avanti e i servizi offerti sono:

    • Controlli ambientali su acque, suolo, aria, rifiuti, alimenti, agenti fisici e moni-
      toraggio dello stato ambientale;

    • Servizio metereologico, con controllo del rischio valanghe invernale;

    • Analisi dell’impatto ambientale delle attività umane e intervento in caso di
      incidenti industriali;

    • Consulenza per la sostenibilità di nuove opere o di opere già realizzate;

    • Consulenza a enti pubblici e privati sui temi ambientali.

1.1.1    SIRAV
SIRAV è l’identificativo del Sistema Informativo Ambientale della Regione Veneto,
dato in gestione all’ARPAV, il cui obiettivo è realizzare uno strumento che supporti la
gestione delle attività organizzative e tecniche a livello regionale. Quando si parla di
SIRAV si intende tutto l’apparato informatico (server, banche dati, infrastrutture di
rete, terminali di lavoro, software e strumenti applicativi) che permette alla Regione
Veneto e all’ARPAV di lavorare su una struttura omogenea e condivisa. Da una
parte infatti troviamo la necessità di coordinare, pianificare e controllare della Regione
Veneto mentre la parte tecnica è di competenza dell’ARPAV. La struttura è gerarchica
e rispecchia l’organizzazione degli enti che hanno accesso a SIRAV: questo ha la doppia
funzione di permettere di compiere le operazioni preposte a chi ha l’autorizzazione
e contemporaneamente di proteggere le informazioni da accessi non autorizzati. Il
flusso di informazioni segue infatti percorsi ben precisi, dettati da regolamenti e leggi
vista la presenza di dati sensibili. Mantenere attivo questo sistema è un’operazione

                                            4                                Pag: 4 di 67
1.2 Il progetto                                                     1 INTRODUZIONE

onerosa data la grande quantità di sistemi diversi integrati insieme che si occupano di
particolari aree e in cui si sono specializzati. Bisogna inoltre garantire la possibilità
di crescita dell’infrastruttura per far fronte a nuove richieste o per offrire nuovi servizi
senza che questo pregiudichi la realtà esistente.

1.2     Il progetto
Il progetto proposto richiedeva di analizzare il mondo open source per trovare un
DBMS che possa sostituire l’attuale sistema in uso Oracle Database 10g RAC. Il fine
è di eliminare le pesanti spese per le licenze del software che l’ARPA Veneto deve
affrontare (quantificabili in centinaia di migliaia di euro all’anno) e di allinearsi alla
direttiva del Ministero delle Innovazioni e delle Tecnologie del 19 dicembre 2003[4]. È
necessario che il software individuato sia in grado di assicurare la stessa continuità di
servizio e di affrontare il carico di lavoro generato usando l’attuale infrastruttura in-
formatica disponibile (o con modesti accorgimenti e investimenti). Inoltre deve fornire
tutte le funzionalità necessarie per replicare il database in maniera completamente
trasparente rispetto ai client che la utilizzano. Se esistono questi presupposti risulta
possibile effettuare la migrazione dei dati da una piattaforma all’altra senza dover
modificare i programmi che accedono al database e il ciclo di lavoro degli operatori
che utilizzano quei dati. Un’altra richiesta è la possibilità di collegarsi e accedere ad
altre fonti di dati, in particolare Oracle, per integrarlo con la struttura informatica già
presente e non trovarsi con un servizio isolato.

1.2.1   Scelta del candidato DBMS
Fin dalla presentazione del progetto, ARPAV aveva manifestato il suo interesse per
il DBMS PostgreSQL, ritenendolo il più probabile sostituto della piattaforma Oracle.
Questa idea nasce sia dal fatto che è presente molta documentazione su migrazioni
effettuate con successo da altre aziende reperibile su internet, sia da un interessamen-
to del tutor azienda Dott. Zambotto Paolo. Per questi motivi, prima dell’effettivo
inizio di stage ho provveduto a fare una ricerca per assicurarmi che effettivamente
non ci fossero altre alternative meno conosciute ma altrettanto valide. Sicuramente,
il più conosciuto ed utilizzato DBMS open source è MySQL[5], di proprietà di Sun
Microsystem e recentemente acquistata proprio da Oracle Corporation. Seppure mol-
to famoso, MySQL non è adatto a rimpiazzare Oracle Database, in quanto il target
è sempre stato il mercato delle soluzioni a basso costo, prediligendo leggerezza e ve-
locità alla sicurezza dei dati e dotazione tecnica e tecnologica. Lo storage engine di
default, MyISAM, non supporta le transazioni, le chiavi esterne, il clustering e tante
altre funzionalità richieste da un utilizzo di classe Enterprise. Per questo molto spesso
era preferibile utilizzare InnoDB, molto più ricco di features ma vincolato dal fatto di
non essere proprietà di MySQL (i diritti sono di Innobase Oy, anch’essa acquistata nel
2005 da Oracle Corporation). Negli ultimi anni il suo sviluppo è accelerato soprattutto
per la versione Enterprise, impegno voluto da Sun Microsystem, in modo da colmare il
gap esistente con soluzioni di livello superiore. In questo modo ora riesce ad offrire ca-
ratteristiche per competere coi modermi DBMS, uscendo dalla nicchia delle soluzione

                                             5                                Pag: 5 di 67
1.2 Il progetto                                                    1 INTRODUZIONE

a basso costo ma rinunciando alla versione Community che lo ha portato al successo.
Tuttavia non sembra ancora essere maturo per un utilizzo data warehousing[C], dovuto
alla scarsa ottimizzazione in ambienti distribuiti e alla soltanto recente introduzione di
features come il partizionamento e la replicazione dei dati. Un altro candidato preso
in considerazione è Firebird[6], nato dal codice di InterBase[7] liberato nel 2000 da
Borland. Questo DBMS ha molti aspetti interessanti da valutare, tra cui il basso uso
di risorse e la sua architettura, tuttavia ad oggi manca di molte caratteristiche, alcune
delle quali richieste dal progetto. Altre soluzioni non si sono rivelate adatte in quanto
progettate per problemi differenti (SQLite, Hadoop, HadoopDB) oppure perchè non
sono DBMS relazionali (CouchDB, MongoDB) e quindi il progetto è partito subito
con l’obiettivo di analizzare PostgreSQL, che verrà presentato in seguito.

1.2.2   Analisi preliminare e risultato dello stage
La scelta di questo progetto mi ha posto davanti ad alcuni problemi riguardanti so-
prattutto la mancanza di conoscenza riguardo gli strumenti da utilizzare, Oracle in
primis, e il dover presentare risultati che devono essere obiettivi e influenzeranno le
scelte di ARPAV. Oltre a questo, anche prevedere un piano di lavoro è risultato im-
pegnativo in quanto ho dovuto ragionare sulle attività da eseguire e stimare una loro
durata sulla sola base della mia esperienza. Su quest’ultimo sono riuscito a fare un
buon lavoro, in quanto il progetto è stato concluso nei tempi previsti senza cambia-
menti delle attività preventivate, mentre per la fase di apprendimento le conoscenze
acquisite in questi anni mi hanno permesso di capire facilmente il funzionamento degli
strumenti e di ottimizzare le risorse a mia disposizione. Il risultato del progetto è lo
studio quı̀ presentato ed è stato giudicato molto positivamente dal tutor aziendale in
quanto rispecchia le attese e fornisce i dati richiesti per una migliore comprensione del
problema e per una decisione sulle strategie da seguire.

                                            6                                Pag: 6 di 67
2 TECNOLOGIE

2       Tecnologie
2.1     Oracle
La storia di Oracle nasce nel 1977 quando Larry Ellison, insieme a Bob Miner e Ed
Oates, fonda la Software Development Laboratories e la prima release di Oracle Da-
tabase viene rilasciata nel 1979 col nome Oracle V2 (non è mai stata rilasciata una
versione 1). Nel 1982 la societá cambia nome in Relational Software, Inc. e successi-
vamente diventa Oracle Corporation per allinearsi al prodotto di punta dell’azienda.
Nel corso degli anni poi si sono succedute vari versioni del database, portando sempre
innovazioni tecnologie all’avanguardia tra cui SQL (1979)[C], symmetric multiproces-
sing (1983), distribuited database (1986), ANSI SQL standard (1993), supporto ad
architetture 64bit (1995), XML (1999)[C]. Nel corso degli anni Oracle Corporation è
riuscita a conquistare la fiducia dei suoi clienti e ad ottenere la leadership del mercato
enterprise per le soluzione database, middleware e business intelligence. Attualmente
può contare su un bacino di 320.000 clienti, tra cui tutte le prime 100 aziende del-
la Fortune Global 500 [8][9], e un fatturato di US$22.4 miliardi di dollari nel 2008.
L’ultima versione disponibile di Oracle Database è la 11g, rilasciata l’11 luglio 2007.

2.1.1    Oracle 10g RAC
ARPAV utilizza per la sua infrastruttura diversi DBMS, tra cui diverse versioni di
Oracle, a seconda dell’importanza del servizio e del carico di lavoro. In particolare, il
database oggetto dello studio è mantenuto su un’installazione di Oracle Database 10g
RAC. La versione 10g è stata rilasciata 2003, ed è la prima versione a essere commer-
cializzata col suffisso g che enfatizza il grid-computing ready. È stato poi rilasciato
un aggiornamento della piattaforma nel 2005 (Release 2) che è quella in possesso di
ARPAV. La sigla RAC sta per Real Application Cluster e indica una versione predi-
sposta a girare su più macchine server con storage condiviso. Questo permette molti
benefici in quanto si aumenta la potenza e la scalabilità delle applicazioni, oltre a
fornire una maggiore sicurezza di continuità del servizio in caso di guasto ad uno dei
server. Un altro vantaggio è la possibilità di aumentare la potenza installando nuo-
vi server senza dover cambiare l’hardware già in uso, aumentando la longevità degli
investimenti nell’infrastruttura informatica. Tra le altre caratteristiche del software
possiamo citare il partitioning, la gestione di dati XML tramite gli standard web del
W3C[C], l’introduzione delle espressioni regolari.

2.2     PostgreSQL
L’analisi del mondo open source alla ricerca di candidati ha portato alla luce la ric-
chezza di soluzione che sono disponibili per la gestioni di basi di dati. La maggior
parte del software però ha come target il mercato delle soluzioni a basso costo, oppure
nascono per esigenze specifiche e si specializzano in un certo segmento (alcuni progetti
sono leader del proprio segmento nonostante la presenza di soluzioni commerciali di
pari livello). Quando però si cercano prodotti per affrontare realtà molto complesse,

                                            7                                Pag: 7 di 67
2.2 PostgreSQL                                                          2 TECNOLOGIE

si nota la diminuzione di soluzioni che affrontino completamente un certo problema.
Il motivo di questo è la complessità di sviluppo che questi progetti devono affrontare
e che, in mancanza di fondi, di una guida e di collaborazione, difficilmente riescono
a sopravvivere. Questo problema, che si riperquote in tutto il mondo open source,
è uno dei motivi principali per cui spesso si preferisce una soluzione proprietaria per
il semplice fatto che assicura (almeno sulla carta) un supporto duraturo nel tempo.
Esempi di eccellenza del mondo open source sono la Mozilla Foundation, il kernel Li-
nux, OpenOffice.org, Apache Foundation che, grazie a investimenti e supporto, hanno
dato alla luce prodotti che sono fra i maggiori player dei rispettivi mercati, se non i
leader. Per il mondo dei DBMS open source esiste un progetto che è riuscito a crescere
fino a competere attivamente nel segmento enterprise: PostgreSQL[10].

2.2.1   Storia del progetto
PostgreSQL è un object-relational database management system (ORDBMS) sviluppa-
to dal codice del progetto Berkeley POSTGRES e rilasciato sotto licenza open source.
Il progetto è nato nell’università di Berkeley nel 1986 e inizialmente fù diretto dal Pro-
fessore Michael Stonebraker e sponsorizzato dal DARPA (Defence Advance Research
Projects Agency), ARO (Army Research Office), NSF (National Science Foundation)
e da Esl, Inc. La prima versione funzionante risale al 1987 e viene effettuata una di-
mostrazione nel 1988 durante la ACM-SIGMOD Conference. L’anno successivo viene
rilasciata al pubblico, ricevendo tuttavia molte critiche al sistema delle regole, che vie-
ne riscritto sia nella seconda versione (1990) che nella terza (1991). Inoltre il progetto
si arricchisce di nuove funzionalità e comincia a puntare sulla portabilità e sull’affida-
bilità. Nel 1994, a causa di una riduzione dei fondi a sostegno, il progetto Berkeley
POSTGRES viene chiuso alla version 4.2.
    Nel 1995, grazie al lavoro di Andrew Yu e Jolly Chen, viene aggiunto un interprete
SQL a POSTGRES (sostituisce il precedente linguaggio di query PostQUEL) e rila-
sciato col nuovo nome di Postgres95 sotto licenza open source con versione 1.0.x. Il
codice è completamente scritto in ANSI/C, superando le prestazioni della versione 4.2
di POSTGRES e si arricchisce di una nuova serie di funzionalità che tutt’oggi sono
parte integrante del progetto.
    Tuttavia, nel 1996, viene deciso di cambiare il nome in PostgreSQL, per rende-
re chiaro il legame con POSTGRES e il cambiamento ottenuto col nuovo interprete
SQL. Il numero di versione viene portato a 6.0, per continuare la sequenza originale
cominciata con il progetto Berkeley POSTGRES. Attualmente l’ultima major release
rilasciata è la 8.4 e lo sviluppo si sta concentrando sulla versione 8.5.

2.2.2   Architettura
PostgreSQL usa un modello client/server e una tipica sessione di lavoro è il risultato
della cooperazione di diversi processi:

   • un processo server che gestisce la base di dati e processa tutte le richieste di
     accesso/modifica che arrivano dagli utilizzatori del database;

                                             8                                 Pag: 8 di 67
2.2 PostgreSQL                                                        2 TECNOLOGIE

   • un processo client che richiede al server l’accesso/modifica dei dati in esso con-
     tenuti. Un client può essere un’applicazione grafica, una console di testo, un
     server web; in generale, chiunque usi il server diventa un client dello stesso.

Il processo server postgres può mantenere connessione multiple e concorrenti da più
client; per ogni utente viene effettuato un fork [C] dell’applicazione che si occupa sola-
mente del suo client, senza intervento del processo originale, il cui compito è di restare
in ascolto di eventuali nuove connessioni, tipicamente tramite protocollo TCP/IP.
Questa soluzione permette di mantenere un’alta continuità di servizio in quanto un
possibile malfunzionamento di un processo non influisce sulla capacità di accettare
nuove connessioni e sulle altre transazioni in corso.

2.2.3   Aderenza allo standard SQL
Lo standard SQL viene per la prima volta pubblicato dall’ANSI[C] nel 1986, e succes-
sivamente ratificato dall’ISO[C] nel 1987. Le evoluzioni più importanti sono avvenute
con la definizione di SQL-92, SQL-1999, SQL-2003 (supporto a XML e aggiornato con
SQL-2006 e SQL-2008) ad opera di ISO/IEC. Ad oggi, non esiste nessun DBMS che
rispetti completamente lo standard SQL-2003 il quale, per semplicità (e per problemi
avuti in passato nell’assegnazione della conformità), è diviso in più parti. PostgreSQL
supporta oltre 150 delle 164 caratteristiche definite fondamentali (full Core conforman-
ce) e molte altre funzionalità opzionali o di supporto. La difficoltà nel raggiungere la
piena conformità deriva dal fatto alcune richieste vanno in conflitto con funzionalità
tradizionali o modi di fare entrati nell’uso comune.

2.2.4   Accesso concorrente ai dati
PostgreSQL utilizza come default un approccio diverso da altri database per la ge-
stione degli accessi concorrenti ai dati: invece del tradizionale lock di righe e tabelle
utilizza un modello MVCC, MultiVersion Concurrency Control. Con questo modello,
ogni transazione vede uno snapshot del database che rappresenta i dati all’inizio della
connessione. Ogni UPDATE provoca un INSERT in fondo alla tabella e marca la vecchia
riga come invalida, ma resta disponibile per quei snapshot che devono poterla vedere.
Questo garantisce l’isolamento tra operazioni di lettura/scrittura ma comporta l’onere
di dover provvedere a pulire periodicamente il database dalle dead tuples tramite il
comando VACUUM FULL. Il sistema degli snapshot utilizza un indice di 4 byte per di-
stinguere ogni transazione e viene chiamato XID: un numero maggiore significa che la
transazione è stata eseguita temporalmente successivamente e quindi non è accessibile
alle transazioni ancora aperte con XID minore. Il comando VACUUM FULL si preoccu-
pa anche di gestire questo particolare indice impedendo che, superate le 4.294.967.296
transazioni, ci si possa trovare in situazioni in cui transazioni chiuse nel passato siano
nel futuro rispetto a nuove operazioni ancora aperte. Dalla versione 8.1 è stato intro-
dotto un processo demone che si occupa di lanciare periodicamente il comando VACUUM
e ANALYZE sul database e sugli schema, in base a parametri modificabili tramite il file
di configurazione.

                                            9                                Pag: 9 di 67
2.2 PostgreSQL                                                      2 TECNOLOGIE

    Nel caso in cui questo modello non soddisfi le aspettative, è comunque possibile
utilizzare il classico sistema a lock dei dati tramite comandi SQL. Questo approccio
però può portare alla creazione di deadlock : una transazione A blocca una tabella α
e richiede di operare sulla tabella β, che è stata bloccata dalla transazione B e che a
sua volta richiede di operare sulla tabella α. Questa situazione di stallo viene rilevata
da PostgreSQL che arbitrariamente elimina una delle transazioni coinvolte e permette
alle altre di continuare.

2.2.5   Stored procedure
PostgreSQL da pieno supporto alle stored procedure grazie al proprio linguaggo
PL/pgSQL che permette di implementare sottoprogrammi direttamente nel database.
Inoltre sono supportati anche PL/Perl, PL/TCL e PL/Python direttamente nel core
del programma, mentre altri possono essere aggiunti come estensioni. I vantaggi di
questa tecnologia sono vari:

   • toglie complessità dal lato client in quanto query complesse possono essere ar-
     chiviate all’interno del database;

   • riduce la quantità di informazioni scambiate tra client e server migliorando le
     prestazioni e i tempi di risposta;

   • essendo di fatto un linguaggio strutturato, permette di compiere elaborazioni
     che non sono possibili mediante l’uso di semplici query SQL;

   • possibilità di creare librerie di funzioni a disposizione del database. Questo per-
     mette di nascondere la struttura del database rendendo ogni operazione possibile
     un funzione. Inoltre cosı̀ facendo si può evitare di dover garantire l’accesso al
     database agli utenti;

   • le procedure sono precompilate, eliminando l’onere di controllare la correttezza
     degli statement richiesti.

2.2.6   Partizionamento delle tabelle
PostgreSQL permette di partizionare le tabelle per aumentare le prestazioni nel caso
in cui queste assumino dimensioni elevate (il punto esatto in cui questa operazione
sia conveniente non è calcolabile a priori, ma è consigliato quando la dimensione del-
la tabella sia superiore alla memoria fisica disponibile). Il partizionamento avviene
creando una tabella master da cui poi si derivano le tabelle child tramite ereditarietà
e creando dei vincoli all’inserimento tramite dei range sui dati. Si definisce poi una
funzione trigger sulla tabella master (che rimarrà vuota) in modo tale che le nuove
righe vengano reindirizzate nella partizione corretta. L’operazione risulta molto mac-
chinosa rispetto all’ambiente Oracle, anche se resta possibile creare delle funzioni per
automatizzare il processo di creazione di partizione e di aggiornamento dei trigger.

                                           10                             Pag: 10 di 67
2.3 LabWare LIMS                                                       2 TECNOLOGIE

2.2.7   Jobs
PostgreSQL non supporta nativamente la schedulazione di jobs, la quale può essere
aggiunta tramite pgAgent. pgAgent è uno script che introduce una serie di funzioni
e procedure per la definizione di jobs che vengono eseguite poi da un demone (o
servizio, a seconda del sistema operativo). Si integra con la GUI pgadmin3 rendendo
più semplice la creazione e la gestione dei jobs.

2.2.8   Affidabilità e continuità di servizio
Caratteristica importante per un DBMS è la capacità di garantire il servizio e, nel
caso ciò non fosse possibile, di assicurare l’integrità e il recupero dei dati. PostgreSQL
mette a disposizione molti metodi per la replicazione sia del servizio sia dei dati. Il
metodo standard per assicurare l’integrità dei dati avviene tramite il Write-Ahead
Logging (WAL) il cui concetto si basa nel mantenere un log di tutte le transazioni
eseguite con successo. In questo modo, è possibile ripristinare lo stato del database
semplicemente ripercorrendo la storia contenuta nel log. Altro vantaggio è dato dal
minor uso di risorse, in quanto non è più strettamente necesario assicurare che ogni
transazione sia committata sul database, ma è sufficiente una fsinc() sul file di log.
Questo sistema viene anche utilizzato per la replicazione del database su macchine
slave e aumentare l’affidabilità globale, oltre che a bilanciare il carico di lavoro se
necessario. Oltre al sistema giá citato esistono poi altre configurazioni possibili che
migliorano il load balancing, i tempi di risposta e la replicazione del database

2.2.9   Evoluzioni future
Il ramo utilizzato per il progetto era contrassegnato dal numero di versione 8.3, rila-
sciata inizialmente il 4 febbraio 2008 e aggiornata fino alla versione 8.3.7 rilasciata il
16 marzo 2009 ed usata nel corso del progetto. Il 29 giugno 2009 è stata rilasciata
la versione 8.4, dopo 18 mesi di sviluppo, che diventa il nuovo ramo stabile e pro-
seguirà lo sviluppo di nuove features. Tra le principali novità ci sono le Windowing
Functions, le Recursive Queries, i Column Permissions e tutta una serie di migliora-
menti sull’aderenza allo standard, sulle prestazioni e sulla facilità di amministrazione.
Da sottolineare anche l’inizio dello sviluppo del supporto (si stima che sia completato
per la release 8.5) allo standard SQL/MED (Management of External Data)[11] che
permetterà di definire dei link a dati esterni al database, SQL e non, direttamente
all’interno di PostgreSQL[12].

2.3     LabWare LIMS
LabWare LIMS è l’applicativo che utilizza la base di dati di cui deve essere effettuata
la migrazione e per questo motivo sarà essenziale valutare il suo comportamento al
fine di decidere la fattibilità del progetto. La sigla LIMS è l’acronimo di Laboratory
Information Management System e indica tutta una serie di software che permettono
le gestione integrata di laboratori d’analisi e dei loro processi. Questi programmi de-
vono rispettare una serie di standard internazionali e nazionali (in Italia il riferimento

                                            11                               Pag: 11 di 67
2.4 Perl                                                                 2 TECNOLOGIE

è UNI/ISO EN 17025[13] per laboratori pubblici e privati) e si occupano di tutti gli
aspetti, dal personale ai metodi, alle apparecchiature, alla manipolazione dei campioni
e ai rapporti di prova. ARPAV ha da poco messo in funzione la soluzione LabWare
LIMS 6 (rilasciata il 28 febbraio 2008, che va a sostituire la precedente versione 5 in
uso presso ARPAV) per la gestione centralizzata di tutti i laboratori e dei rispettivi
campioni. L’azienda LabWare è tra i leader di questa fetta di mercato e i suoi prodotti
sono usati da molte grandi aziende del settore farmaceutico, chimico, minerario e da
grossi laboratori di analisi cliniche e ambientali. Il prodotto permette di avere una
gestione paperless, ovvero senza la necessità di stampare su carta i risultati e facendo
largo uso di report elettronici, garantendo un risparmio di prodotti consumabili e carta
e velocizzando le pratiche burocratiche.

2.4     Perl
L’utilizzo di Perl è stato vincolato in quanto alcuni degli strumenti utilizzati durante
la migrazione sono scritti in questo linguaggio. Di seguito, capita la potenza di questo
strumento e la sua versatilità, ho scelto di utilizzarlo per scrivere tutto il software di cui
ho avuto bisogno durante il progetto, rivelandosi una scelta fondamentale per il succes-
so dello stesso. Perl è un linguaggio di programmazione ad alto livello, con tipizzazione
dinamica, procedurale e interpretato creato nel 1987 da Larry Wall. Inizialmente na-
sce come linguaggio di scripting per l’ambito sistemistivo e per la manipolazione di
testi e file, ma si è evoluto, soprattutto grazie ai moduli creati dalla comunità, fino ad
ottenere un carattere più generale. Ad oggi può contare su un ricco archivio di moduli
creati dalla comunità, prevalentemente con licenza open source, raccolti sul sito web
CPAN[14] e con una ricca documentazione a supporto. Perl è diventato conosciuto
sopratutto grazie alla potenza delle espresioni regolari[C] che permettono di lavorare
e manipolare testi in maniera molto rapida e con una grande libertà. Il linguaggio
stesso permette di condensare molte operazioni complesse in poche righe di codice,
dimostrando la potenza del linguaggio stesso ma risultando spesso difficile da leggere
e mantenere. Questa è una delle critiche che più spesso vengono mosse al linguaggio,
anche se vengono spesso definiti dal suo creatore come vantaggi del linguaggio: There
is More Than One Way To Do It. Altra caratteristica importante per la sua diffusione
è la facilità con cui si integra con linguaggi diversi, diventando quindi il collante di
sistemi eterogenei. L’ultima versione disponibile è la 5.10.0 e lo sviluppo è concentrato
sull’uscita della versione 6.0, in sviluppo dal 19 luglio 2000.

                                              12                                Pag: 12 di 67
3 SVILUPPO

3     Sviluppo
3.1    Approccio al problema
Per una più facile comprensione del problema è stata effettuata una Analisi dei Re-
quisiti a cui il progetto deve rispondere con una possibile soluzione o con una rispo-
sta negativa in termini di fattibilità. Non viene effettuata una classificazione e sono
considerati tutti come requisiti obbligatori.
    • Deve essere possibile trasferire l’attuale schema del database nella DBMS da
      individuare che può comprendere: TABLE, VIEW, GRANT, SEQUENCE, TRIGGER,
      FUNCTION, PROCEDURE e PACKAGE;

    • Deve essere possibile tradurre eventuali costrutti PL/SQL in un linguaggio equi-
      valente per ottenere gli stessi risultati;

    • L’applicazione che utilizza il database si interfaccia ad esso tramite la tecnologia
      ODBC[C]. È dunque necessario che esista un driver specifico per il DBMS da
      sostituire alla piattaforma Oracle;

    • IL DBMS deve essere in grado di acquisire/fornire informazioni a database diversi
      in maniera trasparente;

    • I requisiti hardware non devono essere troppo elevati o richiedere investimenti
      nell’infrastruttura già esistente;

    • Il DBMS deve essere in grado di soddisfare il carico di lavoro generato dall’u-
      tenza, e deve essere in grado di scalare le proprie perfomance aumentando le
      potenzialità hardware del server utilizzato allo scopo;

    • Deve essere disponibile una interfaccia di controllo sufficentemente avanzata per
      semplificare il lavoro di amministrazione.
Di conseguenza il lavoro svolto è stato suddiviso in tre fasi: replicazione dello schema,
test degli applicativi, benchmark delle prestazioni.

3.2    Ambiente di sviluppo
Fondamentale a questo punto è creare una piattaforma di sviluppo e test che permet-
tesse di ottenere un sistema adatto a contenere il progetto e che potesse essere poi
confrontato col sistema che attualmente gestisce il database LIMS. La scelta è caduta
sull’utilizzo di una macchina virtuale per la facilità con la quale può essere trasferita
su hardware diverso e la possibilità di cambiare le risorse hardware a disposizione.
Per velocizzare le operazioni si è scelto di adottare la tecnologia di VMware, già pre-
sente e utilizzato all’interno di ARPAV. La scelta del sistema operativo è caduta su
GNU/Linux vista la mia esperienza personale con lo stesso maturata dalla scelta di
abbandonare soluzioni software proprietarie. Da un punto di vista più tecnico, per-
mette di ottenere un sistema performante e sicuro, caratteristiche fondamentali in

                                            13                              Pag: 13 di 67
3.2 Ambiente di sviluppo                                                    3 SVILUPPO

ambito server e che spesso vengono sottovalutate anche da grandi aziende. La scelta
del sistema operativo è caduta su OpenSUSE 11.1 in quanto già utilizzata in passato e
per la possibilità di avere facilmente accesso a programmi, aggiornamenti e supporto,
vista la numerosa community che segue questo progetto. Sicuramente non sarebbe la
scelta migliore per un ambiente di produzione, per il quale sarebbe appropriato usare
distribuzioni più orientate all’ambito enterprise quali Red Hat, SUSE Enterprise, Cen-
tOS. Oltre al sistema operativo, sono stati intallati ulteriori software utili alla gestione
e all’utilizzo della macchina. In particolare è stato installato un server SSH per il con-
trollo remoto e un server Apache2 per l’utilizzo di servizi web. Altro elemento chiave
è stato l’interprete Perl[15], necessario per l’esecuzione di script sia interni che esterni
al database. PostgreSQL è disponibile per una grande varietà di sistemi operativi ed è
quindi possibile scegliere una qualunque piattaforma supportata (BSD, Solaris, Unix,
Microsoft Windows, Mac OS X)1 .

3.2.1      Installazione di PostgreSQL
Nel nostro caso è stato necessario installare tramite il packet manager zypper i pac-
chetti postgresql, postgresql-contrib, postgresql-libs, postgresql-server e
postgresql-plperl reperibili dai repository standard della distribuzione. Si consiglia
di installare l’ultima versione disponibile di PostgreSQL, la 8.3.7, in quanto si sono
presentati problemi con versioni non aggiornate (in particolare, la versione 8.3.5 pac-
chettizzata per OpenSUSE non riusciva ad eseguire correttamente gli script forniti da
dbi link, causando un crash del thread di PostgreSQL). Nel caso non fosse disponibile
un pacchetto che installi i moduli per plperl è necessario attivare il supporto compi-
lando PostgreSQL con un apposito switch: --with-perl. In questo modo è possibile
attivare anche gli altri linguaggi supportati come Python, Java, Tcl.

3.2.2      Configurazione
La configurazione di base proposta non è utilizzabile per i nostri obiettivi e deve
necessariamente essere modificata. In particolare PostgreSQL, di default, è utilizza-
bile solo localmente dalla macchina su cui viene installato e l’accesso avviene tramite
l’utente postgres, account superuser non protetto da password. Le modifiche alle
impostazioni avvengono tramite dei file di configurazione: postgresql.conf per i
parametri di generali quali uso delle risorse, manutenzione automatica, logging, etc
e pg hba.conf per il controllo degli accessi utente. Questi file vengono creati nella
directory $HOME/data dell’utente postgres, possono essere modificati con un editor
di testo e vengono caricati all’avvio del processo server (in alternativa è possibile per
alcune impostazioni usare la server command line per la configurazione senza riav-
vio). La gestione degli utenti può avvenire sia dall’interno tramite comandi SQL, sia
dall’esterno usando i comandi specifici di PostgreSQL createuser e dropuser.
    Per consentire a PostgreSQL di ricevere connessioni TCP/IP in ingresso è necessa-
rio modificare il parametro della variabile listen address situata all’interno del file
  1
      Per la documentazione completa si rimanda al sito ufficiale [16]

                                                  14                          Pag: 14 di 67
3.3 Amministrazione                                                          3 SVILUPPO

postgresql.conf a seconda dei proprio bisogni. Come parametri accetta una lista di
hostname e/o indirizzi ip oppure il carattere * per indicare qualsiasi indirizzo.
   La gestione dell’accesso ai database è regolata attraverso il file pg hba.conf, il
quale contiene permette di specificare delle righe che definiscono chi può accedere, a
quale database e da quale indirizzo. In questo modo è possibile definire ogni singolo
aspetto delle connessioni in ingresso per mantenere un alto livello di sicurezza. Quı̀ di
seguito vengono riportati i vari formati che possono avere i record presi dai commenti
presenti all’interno del file stesso:
#   local        DATABASE     USER    METHOD [OPTION]
#   host         DATABASE     USER    CIDR-ADDRESS METHOD          [OPTION]
#   hostssl      DATABASE     USER    CIDR-ADDRESS METHOD          [OPTION]
#   hostnossl    DATABASE     USER    CIDR-ADDRESS METHOD          [OPTION]
La documentazione completa è presente sia all’interno del file sia sul sito web di
PostgreSQL[16] per ogni versione in fase di mantenimento e per le versioni in sviluppo.

3.3    Amministrazione
Insieme al programma server, il pacchetto PostgreSQL fornisce un programma client
per interfacciarsi al processo server tramite console di comando: psql. Oltre a permet-
tere l’inserimento e l’esecuziondi di query SQL, fornisce meta-comandi e funzionalità
per la scrittura di script. psql si è rivelato uno strumento molto potente nonostante la
scarsa efficacia della sua interfaccia grafica: il suo uso è stato necessario sia per motivi
di debug sia per l’esecuzione di operazioni lunghe in ordine di tempo di esecuzio-
ne. Tuttavia per la maggior parte ho preferito utilizzate pgAdmin, interfaccia grafica
multi-piattaforma. Durante il progetto la versione stabile era la 1.8 ed era disponibile
la versione 1.10beta, utilizzata per il numero maggiore di funzionalità a disposizione,
nonostante una diffusa instabilità (da qui la necessità ad utilizzare psql). La versione
1.10 stabile è stata rilasciata il 30 giugno 2009 e, oltre a nuove funzionalità, ufficializ-
za il supporto a PostgreSQL 8.4 e migliora l’affidabilità dell’applicazione. Oltre alle
normali operazioni di gestione di dati, tabelle, etc. è possibile effettuare backup, ripri-
stino di dati, manutenzione del server. È possibile anche visualizzare in tempo reale
le connessioni aperte, i lock sulle tabelle, le transazioni in corso ed creare file di log
di tutte le operazioni che vengono effettuate. Il giudizio è sostanzialmente positivo in
quanto permette di amministrare completamente la base di dati e si integra con altre
funzionalità (jobs, debug, etc.) che estendono ulteriormente le capacità di controllo e
manutenzione. Tuttavia risulta chiaro che l’applicazione necessita di ulteriore sviluppo
se vuole raggiungere un livello di maturità maggiore, sia dal profilo dell’usabilità sia
come stabilità. Esiste un’altra interfaccia grafica per PostgreSQL che ha più successo
per nel web, in quanto sviluppata in PHP[C]: phpPgAdmin. Per poterla utilizzare è
necessario appoggiarsi ad un server web con supporto a PHP e permette anch’essa
di amministrare in maniera completa ogni aspetto della base di dati. Il suo utilizzo
durante il progetto è stato molto limitato anche a causa del suo sviluppo fermo da
alcuni mesi che pregiudica la possibilità di diventare uno strumento di riferimento per
l’amministrazione di PostgreSQL.

                                             15                                Pag: 15 di 67
3.4 Collegamento con altri database                                            3 SVILUPPO

3.4       Collegamento con altri database
Nativamente PostgreSQL fornisce funzioni di collegamento solo a database remoti
PostgreSQL ma è possibile estendere questa funzionalità grazie all’uso del linguag-
gio Perl e dei suoi moduli. Per l’utilizzo di Perl come linguaggio di scripting si deve
compilare PostgreSQL attivando il supporto al linguaggio PL/PerlU tramite switch
di compilazione. Oltre a questo, deve essere installato un interprete Perl che si occu-
perà dell’esecuzione materiale degli script. Il collegamento ad altri database avviene
utilizzando il modulo DBI [17], lo standard de-facto per l’accesso a dati remoti per il
linguaggio Perl. Per ogni tipo di database supportato esiste un driver DBD specializ-
zato che permette di collegarsi, effettuare query, ricevere dati e inserirne di nuovi2 . A
questo punto le strade percorribili sono la scrittura di script per effettuare le operazioni
richieste (sia come script esterni al database, sia come funzioni o procedure contenute
all’interno dello schema) oppure l’installazione del pacchetto dbi link che crea la strut-
tura del database remoto direttamente in PostgreSQL e mette a disposizione funzioni
per l’utilizzo dei dati. Entrambi gli aspetti saranno approfonditi in seguito.
     Il driver DBD:Oracle[18] viene fornito come sorgente da compilare sulla macchina
su cui deve essere eseguito. Questo scelta è derivata dal fatto che per la compilazione è
necessario avere delle librerie che vengono fornite insieme all’Instant Client di Oracle
e quindi specifiche per la piattaforma utilizzata. In particolare è necessario installare
i pacchetti Instant Client Basic, Instant Client SQL*Plus e Instant Client
SDK. Una volta che questi file sono accessibili è possibile procedere con la compilazione
del modulo ed installarlo globalmente sul sistema (ci si riferisca al file README contenuto
nel pacchetto DBD::Oracle).
     Per collegarsi ad Oracle sono possibili due strade alternative. Con il metodo stan-
dard descritto dalla documentazione Oracle è necessario creare i file sqlnet.ora e
tnsnames.ora. Quest’ultimo contiene le entry con i dati relativi ai server a cui è
possible collegarsi, in modo che ai client basti specificare il database interessato, senza
dover specificare altri dati quali l’indirizzo del server, la porta utilizzata e il service
name (o sid). Per permettere poi l’utilizzo di questi file, si deve definire una variabile
d’ambiente TNS ADMIN che contiene il path a questi. Il modulo DBI può utilizzare
queste informazioni, riducendo i parametri necessari per la stringa di collegamento al
database. È comunque possibile e consigliato specificare tutti i parametri, rendendo
di fatto inutile la procedura esposta precedentemente, aumentando la portabilità degli
script e la facilità di manutenzione.

3.4.1      dbi link
Il pacchetto dbi link [19] fornisce uno script SQL che carica nel database uno schema
contenente funzioni e tabelle il cui compito è rendere trasparente la comunicazione
con il database remoto. La configurazione avviene tramite una funzione che scarica lo
schema del database remoto e lo replica localmente, permettendo di effettuare query,
inserimenti, aggiornamenti e cancellazione dei dati. È necessario che sia già creato
un database, nel quale lo script creerà uno schema, che abbia attivato il supporto
  2
      I moduli aggiuntivi per Perl possono essere reperiti sul sito CPAN[14]

                                                  16                            Pag: 16 di 67
3.4 Collegamento con altri database                                      3 SVILUPPO

a PL/PerlU. Ci sono vari modi per fare questo, di cui il più semplice è tramite una
interfaccia grafica. Di seguito viene mostrato come fare avendo accesso ad una console:
prima si crea il database

  createdb 

e successivamente attivare il supporto a PL/PerlU sul database con il comando

  createlang plperlu 

A questo punto bisogna caricare il file dbi link.sql fornito dal pacchetto dbi link nel
database in modo da creare tutte le procedure e le funzioni per il corretto funziona-
mento del link al database remoto:

  psql -f /dbi_link.sql 

Il passo successivo è configurare il dbi link attraverso una chiamata ad una procedura
creata precedentemente, che si occuperà di creare uno schema associato al database
remoto, di cui importerà la struttura delle tabelle. I comandi successivs sono statement
SQL e per questo devono essere inseriti usando psql o una interfaccia grafica

  --
  --   Data source:        dbi:oracle:database=world;host=localhost
  --   User:               root
  --   Password:           foobar
  --   dbh attributes:     {AutoCommit => 1, RaiseError => 1}
  --   dbh environment:    NULL
  --   remote schema:      NULL
  --   remote catalog:     NULL
  --   local schema:       world
  --

  SELECT dbi_link.make_accessor_functions(
    ’dbi:oracle:database=;host=’,
    ’root’,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    ’’
  );

Lo script, disponibile alla versione 2.0.0, non è stato in grado di importare corret-
tamente il remote schema Oracle anche se impostato nella riga di comando, con la
conseguenza che PostgreSQL non era in grado di eseguire correttamente query al da-
tabase remoto. Il problema è stato risolto esportando la struttura appena creata in

                                           17                             Pag: 17 di 67
3.5 Ora2Pg                                                                3 SVILUPPO

un file .sql e procedendo a cambiare gli script di creazione delle view usando una
funzionalità di search and replace.
   Una volta inseriti questi comandi, è possibile effettuare interrogazioni al database
remoto semplicemente specificandolo, per esempio:
  SELECT * FROM ."";
  SELECT "" FROM ."";
in quanto il link viene salvato all’interno dello schema precedentemente creato da
dbi link. È possibile registrare più link remoti utilizzando la funzione
  dbi_link.make_accessor_function()
con i parametri desiderati.
  SELECT dbi_link.make_accessor_functions(
  ’dbi:Oracle:database=LIMS.sirav;
              host=carl-vip.arpa.veneto.it;
              service_name=LIMS’,
  ’pg’,
  ’pg’,
  NULL,
  NULL,
  NULL,
  ’labware’,
  ’labware’
  );
    L’uso di questo strumento ha portato alla luce parecchi limiti, dovuti soprattut-
to al fatto che l’ultima release stabile del progetto risale al 27 Gennaio 2007. Una
lacuna importante è emersa nella conversione dei tipi, praticamente inesistente. Ho
provato a migliorare questo aspetto, riuscendo a ottenere una struttura più ricca e
simile all’originale, ma sarebbe necessario riscrivere parte dello script per permettere
di effettuare una conversione opportuna per ogni diverso DBMS remoto. Un problema
che invece non è stato possibile risolvere ha riguardato la possibilità di personalizzare
le query al database remoto. Oracle permette di salvare in un tipo DATE anche le
informazioni riguardanti ore, minuti e secondi (lo standard SQL richiederebbe di usare
un tipo TIMESTAMP, tuttavia è prassi comune adottare questa soluzione in ambiente
Oracle) che non vengono poi restituite in una query semplice. Per ottenere tutta l’in-
formazione è necessario l’utilizzo della funzione to char(, ’DD-MM-YYYY
HH24:MI:SS’), ma non è stato possibile istruire dbi link ad utilizzarla in presenza di
campi DATE. Lo stato di abbandono del progetto è accentuato anche dalla mancanza
di documentazione e dall’inutilizzo di mailing list e forum.

3.5    Ora2Pg
Ora2Pg[20] è uno script Perl che permette di esportare la struttura e i dati di un
database Oracle nel dialetto SQL utilizzato da PostgreSQL. La prima versione è stata

                                            18                              Pag: 18 di 67
3.5 Ora2Pg                                                                   3 SVILUPPO

rilasciata il 9 maggio 2001 e l’ultima versione stabile è la 5.4 rilasciata il 15 luglio 2009.
Per poterlo utilizzare si deve essere in possesso di un interprete Perl (richiesta versione
5.8, consigliata 5.10) con l’accesso ai moduli DBI, DBD::Oracle e DBD::Pg[21].

3.5.1   Utilizzo del modulo
Per l’utilizzo di Ora2Pg ho scritto uno script Perl che si occupa di ottenere dal da-
tabase Oracle tutti gli oggetti necessari per riprodurre lo schema sulla piattaforma
PostgreSQL, il cui codice è riportato nell’appendice B.1. Lo script permette di espor-
tare separatamente i vari tipi di oggetti che possono essere presenti nella base di dati
Oracle e di scriverli su file. La sintassi è SQL e il dialetto dipende dal tipo di oggetto:
in generale, le tabelle vengono tradotte dallo script, mentre il resto degli oggetti viene
esportato as-is, senza manipolazioni.

3.5.2   Conversione del codice
Una volta ottenuti gli oggetti dal database Oracle, è necessario controllare il codice
di alcuni elementi, in particolare funzioni, procedure, trigger e package. Questo è
necessario in quanto sono oggetti scritti in linguaggio PL/SQL, non supportato da
PostgreSQL. È comunque relativamente semplice modificare il codice nel linguaggio
PL/pgSQL vista la sintassi molto simile. Inoltre è necessario decidere come trattare
i package perchè non supportati da PostgreSQL. Una soluzione semplice consiste nel
portare gli oggetti contenuti nel package nello spazio pubblico delle funzioni. Altri-
menti è possibile creare uno schema apposito, con proprie tabelle se neccessario, se si
vuole ottenere una maggiore separazione logica. Lo schema non ha bisogno di parti-
colari attenzioni, in quanto la differenza fra tipi viene già risolta internamente dallo
script, creando statement SQL già compatibili con PostgreSQL. Anche i dati vengono
esportati in maniera corretta, e sono subito inseribili nel nuovo schema senza necessità
di modifiche. In un paio di casi però non è stato possibile esportare i dati da alcune
tabelle a causa di un errore nello statement per la lettura. L’errore è causato da alcuni
nomi di colonne che sono anche keywords e che non vengono inibite tramite l’uso di
escaping characters nello statement creato dallo script. Il problema è stato segnalato
all’autore del programma e corretto nella versione 5.1 con l’aggiunta di una features
che permette di definire le keywords da controllare.

3.5.3   Definizione delle view
Nel trasportare alcune view da Oracle a PostgreSQL sono emersi dei problemi derivati
da techiche permesse in Oracle che non sono riproducibili in ambiente PostgreSQL.
In particolare Oracle permette di creare view definendo colonne di tipo nullo o con
valore costante, cosa non possibile in PostgreSQL che segnala come non corretto il
codice SQL generato. Questa pratica è stata usata per mantenere lo stesso codice di
creazione della view anche su database diversi con tabelle simili ma non uguali. Per
risolvere questo problema di portabilità ho separato i due casi e ho creato delle funzioni
per i campi a valore costante, il cui tipo di ritorno definisce anche il tipo della colonna,

                                              19                                Pag: 19 di 67
3.6 Creazione del database                                               3 SVILUPPO

e ho eliminato le colonne a valore nullo. Queste ultime non venivano giudicate come
un vero errore, si limitavano a lanciare un warning e venivano create colonne di tipo
unknown, tuttavia erano completamente inutili e inutilizzabili. Un difetto di Ora2PG
è stato riscontrato nella definizione delle clausole WHERE : i valori su cui effettuare
i confronti sono stati erroneamenti modificati da maiuscolo a minuscolo. Questo ha
portato ad avere view valide sintatticamente ma errate logicamente, in quanto non
ritornavano nessun risultato. Ho dovuto correggere manualmente gli script in modo da
ripristinare il corretto funzionamento. Il problema è stato segnalato all’autore insieme
ad una patch ed è stato risolto completamente nella versione 5.3. Altro difetto di
Ora2Pg si manifestava sistematicamente nella creazione del codice di una particolare
view (le altre view sono tutte create correttamente): l’ordine dei nomi delle colonne
non veniva preservato, creando un errore logico nella struttura della view. Anche
questo problema è stato segnalato all’autore e risolto nella versione 5.2 dello script.

3.5.4   Materialized view
Con Oracle è possibile definire delle materialized view (viste materializzate), ossia
delle viste il cui contenuto viene precalcolato. L’utilizzo principale è di ridurre il
costo computazionale di query troppo pesanti (anche se i dati possono essere out-of-
date) e di replicare tabelle remote. PostgreSQL non supporta nativamente questo
tipo di oggetti, anche se è possibile creare funzioni per la gestione di queste. Inoltre
lo script Ora2Pg non ha esportato queste viste insieme al resto dello schema. Nel mio
caso, erano presenti 3 materialized view il cui scopo era di replicare il contenuto di
alcune tabelle di un database remoto all’interno di LIMS. Per affrontare il problema
ho proceduto a creare 3 tabelle in PostgreSQL e ho scritto una funzione in Perl che
si collega al database remoto e porta i dati nel database locale. Tale scelta è dovuta
al fatto che le tabelle sono relativamente piccole e non c’è la necessità di ricorrere a
soluzioni più sofisticate.

3.5.5   Impressioni
L’uso di Ora2Pg è stato fondamentale per la riuscita della migrazione della base di dati:
permette infatti di ottenere subito la struttura del database su cui poi si può lavorare
per ottenere uno schema in PostgreSQL perfettamente funzionante e identico (nelle
funzionalià) a quello di partenza. Le lacune riscontrate sono state risolte in tempi
relativamente brevi, dimostrando di essere un progetto attivo e su cui c’è interesse.
La natura open source mi ha permesso di contribuire attivamente al miglioramento
dello stesso, cosa che ha velocizzato la risoluzione di alcuni problemi e mi ha portato
a conoscere meglio sia lo script sia il linguaggio Perl con cui è scritto.

3.6     Creazione del database
Per la creazione del database LIMS sulla piattaforma PostgreSQL sono stati creati
degli script che, eseguiti in sequenza, replicano la struttura e tutte le funzionalità
presenti. La procedra viene di seguito descritta:

                                           20                              Pag: 20 di 67
3.6 Creazione del database                                               3 SVILUPPO

   • Creazione del database: la creazione può avvenire da riga di comando tramite
     createdb -h  -U  -W 
     
     oppure usando un’interfaccia grafica;

   • Script con comandi di supporto: il file 00 init.sql contiene tutti gli statement
     di supporto necessari ad impostare correttamente il database. Nel nostro caso
     vi sono definiti gli statement CREATE LANGUAGE per la definizione dei linguaggi
     supportati. Questo file non viene creato dallo script precedente ma deve essere
     scritto a seconda delle esigenze richieste. Può essere caricato sul database tramite
     il comando
     psql -h  -U  -W -d  -f 00 init.sql
     oppure usando un’interfaccia grafica;

   • Creazione dello schema: la definizione delle tabelle dello schema è contenuta nel
     file 01 schema.sql. Può essere caricato sul database tramite il comando
     psql -h  -U  -W -d  -f 01 schema.sql
     oppure usando un’interfaccia grafica;

   • Creazione delle SEQUENCE : la sequenzialità delle informazioni contenute del
     database è mantenuta da alcune sequence aggiornate da funzioni trigger che si
     attivano all’inserimento o all’update delle informazioni di alcune tabelle. Questa
     informazione poi viene trasferita nel passaggio dei dati, per questo motivo è
     consigliato creare questi oggetti prima di effettuare il passaggio dei dati. Può
     essere caricato sul database tramite il comando
     psql -h  -U  -W -d  -f 02 sequence.sql
     oppure usando un’interfaccia grafica;

   • Caricamento dei dati: a questo punto si può procedere al caricamento dei dati.
     È consigliato importarli adesso in quanto non sono ancora presenti i trigger che
     possono influenzare il corretto inserimento dei dati e portare a discrepanze e in-
     coerenza (lo script Ora2Pg permette in ogni caso di inserire i dati disabilitando
     temporaneamente i trigger se è già disponibile la struttura completa del databa-
     se). Per fare questo si deve eseguire lo script Perl export data.pl configurato
     con i dati di collegamento ai due database. Il codice dello script è riportato
     nell’appendice B.2;

   • Creazione dei TRIGGER: dopo aver controllato ed eventualmente sistemato il
     codice dei trigger, possono essere caricati sul database. Può essere caricato sul
     database tramite il comando
     psql -h  -U  -W -d  -f 04 trigger.sql
     oppure usando un’interfaccia grafica;

   • Funzioni di supporto: per ovviare ad alcune convenzioni Oracle non riproducibili
     in ambiente PostgreSQL è stato necessario scrivere alcune funzioni per permette-
     re il corretto funzionamento delle view. In particolare, sono sta definite funzioni

                                           21                              Pag: 21 di 67
Puoi anche leggere