EnterpriseDB

EnterpriseDB (EDB) e' un'azienda che offre un supporto di livello Enterprise per la base dati PostgreSQL. EnterpriseDB fornisce inoltre tool specifici per la base dati ed una propria versione con il massimo livello di garanzia disponibile per questo diffuso Database Open Source. In questo documento vengono riportate informazioni sulle diverse funzionalita' offerte con un particolare enfasi sul porting delle applicazioni da altri database.

Da sito EnterpriseDB e' possibile scaricare tre differenti versioni di PostgreSQL, tutte con un'interfaccia grafica di installazione:

Questo documento presenta diversi aspetti delle configurazioni PostgreSQL fornite EnterpriseDB: Installazione, Advanced Server, Compatibilita' Oracle, ...
Un documento introduttivo su PostgreSQL e' Introduzione a PostgreSQL, piu' completo e' il documento PostgreSQL (9.0) mentre sul partizionamento e' presente un capitolo in DIVIDE ET IMPERA !

Installazione

La procedura grafica di installazione e' molto semplice. Impostato il DISPLAY con l'indirizzo del proprio client X Server basta lanciare il file binario scaricato dal sito EnterpriseDB. Parte un semplice wizard di installazione:

PostgreSQL graphical install - Start Stack Builder - PostGIS
Al termine della procedura di installazione di PostgreSQL puo' essere lanciato il programma grafico Stack Builder che consente di installare e configurare ulteriori tool PostgreSQL.

Se si installa la versione Advanced Server la procedura di installazione e' molto simile. Cambiano sono un paio di videate: quella con l'elenco dei prodotti (alcuni sono disponibili sono con la versione Advanced) e quella per l'impostazione della configurazione di default (PostgreSQL o Oracle):

PostgreSQL graphical install - Advanced Products PostgreSQL graphical install - Oracle Compatibility

E' anche possibile utilizzare la procedura di installazione in modalita' testuale. In questo caso ovviamente non e' necessario disporre di un X Server... Ecco un esempio!

Advanced Server

La versione PostgreSQL Plus Advanced Server (EPAS: EDB Postgres Advanced Server) offre alcune importanti funzionalita' aggiuntive tra cui la compatibilita' con Oracle.

xDB Oracle Migration to PostgreSQL Advanced Server

Vediamo ora alcuni dei tool forniti con la versione PostgreSQL Advanced Server...

Infinite Cache consente aumentare la cache della base dati utilizzando la memoria di altri nodi connessi in rete. Sui nodi di cache viene eseguito il demone edb-icache. Sul database server va configurato il file postgresql.conf:

edb_enable_icache = on 
edb_icache_servers = 'xecache1:11211, xecache2'edb_icache_compression_level = 6
Dyna-Tune effettua un'ottimizzazione automatica e dinamica dei parametri della base dati utilizzando il profilo fornito in fase di configurazione.
edb_dynatune = 100              # percentage of server resources dedicated (default 0 use static postgresql.conf parameters)
edb_dynatune_profile = mixed    # workload profile for tuning: 'oltp', 'reporting' or 'mixed'

La versione Advanced fornisce AUDIT molto completo configurabile a vari livelli. L'abilitazione e' effettuata con il parametro edb_audit. Maggiori dettagli in questa paginetta.

L'Advanced Server fornisce un completo tool per la migrazione delle basi dati a PostgreSQL. Con Migration Studio e' possibile migrare basi dati Oracle, Sybase, MySQL ed SQL Server. Migration Studio e' anche in grado di effettuare la migrazione di funzionalita' specifiche dei database di partenza; in particolare per Oracle la migrazione e' praticamente completa (eg. tabelle partizionate, procedures, roles, db link, ...).

Il PEM (Postgres Enterprise Manager) consente la gestione di database Postgres o EDB Postgres Advanced Server con un'interfaccia basata sul pgAdmin. Il PEM server fornisce un'interfaccia web agli utenti (default ULR: https://PEM_host:8443/pem) e si interfaccia verso le istanze controllate attraverso un Agent.

xDB Replication Server consente la replica di dati tra database eterogenei e la replica multimaster (MMR). xDB e' attualmente disponibile anche nella versione Standard.

Da ultimo, ma non ultimo come importanza, l'utilizzo della versione Advanced consente di minimizzare l'impatto sulle applicazioni nella migrazione dalla base dati proprietaria Oracle a PostgreSQL.

Compatibilita' Oracle

In questo capitolo vediamo in maggior dettaglio gli aspetti dell'implementazione della compatibilita' Oracle. Dal punto di vista tecnico la compatibilita' con la base dati Oracle consiste in diverse parti:

E' importante sottolineare che la compatibilita' Oracle di PostgreSQL Advanced Server e' realizzata come uno "strato superiore" alla base dati. Il motore relazionale, gli algoritmi utilizzati, le configurazioni, ... insomma l'architettura e le funzionalita' sono e restano quelle di PostgreSQL su cui possono girare applicazioni Oracle con poche e puntuali modifiche. Le immagini seguenti riportano le differenti architetture delle due basi dati:

Architettura Oracle Architettura PostgreSQL

I principali parametri per la configurazione della compatibilita' Oracle, contenuti nel file postgresql.conf, sono:

edb_redwood_date = on                   # translate DATE to TIMESTAMP(0)
edb_redwood_strings = on                # treat NULL as an empty string in string concatenation
edb_stmt_level_tx = on                  # allow continuing on errors instead rolling back (NB SLOWER)
db_dialect = 'redwood'                  # Sets the precedence of built-in namespaces.
                                        # 'redwood': sys, dbo, pg_catalog; 'postgres': pg_catalog, sys, dbo
oracle_home = '/usr/lib/oracle/11.2/client64/lib'
timed_statistics = on                   # record wait timings, defaults to on (NB prerequisite for DRITA)

Data dictionary Oracle con PostgreSQL Advanced Server Catalogo
Il Data Dictionary di Oracle e' molto ampio e completo. Gli utenti Oracle sono abituali ad utilizzare le viste all_tables, all_tab_columns, all_indexes, all_source, ... e le analoghe user_ e dba_. Sono tutte presenti nell'Advanced Server!
L'implementazione del data dictionary Oracle e' realizzata con il catalogo Redwood (sys) all'interno della base dati di default edb. Lo schema e' visibile a PUBLIC ed inserito nel SEARCH_PATH.
Sono presenti una settantina di viste all/dba/user nel catalogo sys che coprono la maggioranza delle esigenze di utenti ed applicazioni.

Per i DBA invece le differenze sono maggiori: l'unica vista V$ presente con Advanced Server e' la V$VERSION. Sono pero' presenti una decina di viste come edb$stat_all_tables, edb$statio_all_tables, edb$system_waits, ... molto interessanti ma, giustamente, anche molto diverse da quelle Oracle! Ma c'e' qualcosa in piu'...
Il Dynamic Runtime Instrumentation Tools Architecture (DRITA) consente di eseguire sofisticate analisi sulle performance della base dati PostgreSQL. Con la clausola SELECT * FROM edbsnap() viene effettuato uno snapshot, per avere l'elenco degli snapshot la funzione e' get_snaps() e con una SELECT * FROM sys_rpt(begin_snap, end_snap, 8) viene riportato un report dei primi otto eventi di wait occorsi tra i due snapshot indicati. DRITA fornisce informazioni analoghe allo Statspack/AWR (Automatic Workload Repository) di Oracle anche se le architetture sottostanti sono differenti. Ecco un esempio di report (raccolto durante un benchmark OLTP e che indica chiaramente il bottleneck):

WAIT NAME                                COUNT      WAIT TIME       % WAIT
---------------------------------------------------------------------------
wal flush                                82556      61.912294       33.30
wal write                                82569      61.732028       33.21
wal file sync                            82561      58.972752       31.72
query plan                               66271      3.279333        1.76
db file extend                           187        0.014042        0.01
wal insert lock acquire                  5          0.000172        0.00
xid gen lock acquire                     0          0.000000        0.00

SQL
L'SQL di Oracle ha molte funzionalita' avanzate in aggiunta a quelle previste dagli standard SQL. Advanced Server supporta: query gerarchiche (CONNECT BY), outer join (+), MINUS, SELECT INTO FOR UPDATE, ...; la tabella DUAL, le pseudo colonne ROWNUM, ROWID, ...; molte funzioni Oracle: TO_CHAR(), TO_DATE(), ... Sono inoltre gestiti le SEQUENCE, i [PUBBLIC] SYNONYM, i ROLE, ...
L'SQL di PostgreSQL Advanced Server e' esteso con le clausole e parole chiave tipiche di Oracle che possono essere utilizzate direttamente in modo nativo:

$ psql
psql (9.0.0.6)
Type "help" for help.

edb=# select sysdate from dual;
      sysdate       
--------------------
 01-APR-11 17:17:17
(1 row)

Tra le molte sintassi riconosciute c'e' anche quella degli HINT che, sebbene espressi con la sintassi Oracle /*+ HINT */, usano indicazioni relative all'ottimizzatore Postgres:

CHOOSE                        ALL_ROWS
FIRST_ROWS                    FIRST_ROWS(n)
FULL(t)                       ORDERED        
INDEX(t [i] [...])            NO_INDEX(t [i] [...])
USE_HASH(t [...])             NO_USE_HASH(t [...])	
USE_MERGE(t [...])            NO_USE_MERGE(t [...])	
USE_NL(t [...])               NO_USE_NL(t [...])
PARALLEL(t [...])             NO_PARALLEL(t [...])

[NdA gli HINT disponibili sono differenti a seconda delle versioni di EDB Advanced Server].

PL/SQL
Il PL/SQL e' il potente e diffuso linguaggio procedurale di Oracle. Advanced Server include un compilatore SPL (Stored Procedure Language) la cui sintassi e' identica a quella del PL/SQL. Il PL/SQL viene cosi' compilato in modo nativo senza necessita' di precompilazioni o conversioni. Sono forniti alcuni dei principali package sistema: DBMS_OUTPUT DBMS_SQL DBMS_ALERT DBMS_PIPE DBMS_JOB DBMS_LOB DBMS_UTILITY DBMS_PROFILER UTL_FILE UTL_MAIL UTL_SMTP.
Con l'Advanced Server e' possibile programmare le funzioni in PL/pgSQL oppure utilizzare direttamente il codice PL/SQL di Oracle per realizzare Stored Procedure, Package, Funzioni, Trigger, ... e naturalmente anche eseguire un blocco PL/SQL anonimo:

edb=# REM Script di esempio in PL-SQL lanciato da psql
edb=# declare
edb-#         i number;
edb$# begin
edb$# for i in 1..3 loop
edb$#         DBMS_OUTPUT.PUT_LINE( 'Ti amo!');
edb$# end loop;
edb$# end;
Ti amo!
Ti amo!
Ti amo!

EDB-SPL Procedure successfully completed
L'esempio, serissimo, e' preso da Hello world... ditelo coi fiori!

Tools
Oracle fornisce diversi tool utilizzabili da linea di comando. Nell'Advanced Server sono disponibili, oltre ad altri, edb*plus e edb*loader che corrispondono ad sqlplus ed a sqlloader.

Per la compilazione di programmi in linguaggio C e' fornito l'analogo delle librerie OCI. L'Open Client Library fornisce un'API compatibile con l'Oracle Call Interface (OCI). La stessa applicazione, compilata con l'OCL, si connette via libpq a PostgreSQL in modo trasparente.

Database Link
Per configurare i DB LINK verso Oracle e' necessario qualche ulteriore passo di configurazione poiche' sono implementati come applicazione OCI. Dopo aver scaricato l'Instant Client dal sito Oracle... ecco cosa bisogna fare:

# rpm -ilv oracle-instantclient11.2-basic-11.2.0.2.0.i386.rpm
# rpm -qi --filesbypkg oracle-instantclient11.2-basic-11.2.0.2.0.i386
Name        : oracle-instantclient11.2-basic  Relocations: (not relocatable)
Version     : 11.2.0.2.0                        Vendor: Oracle Corporation
...
Summary     : Instant Client for Oracle Database 11g
Description :
Instant Client allows you to run your applications without installing the standard Oracle client or having an ORACLE_HOME.
OCI, OCCI, ODBC, and JDBC applications work without modification, while using significantly less disk space than before.
No recompile, no hassle.   This is the Basic package, supporting OCI, OCCI, and JDBC-OCI with all languages.

oracle-instantclient11.2-basic /usr/lib/oracle/11.2/client/bin/adrci
oracle-instantclient11.2-basic /usr/lib/oracle/11.2/client/bin/genezi
oracle-instantclient11.2-basic /usr/lib/oracle/11.2/client/lib/libclntsh.so.11.1
oracle-instantclient11.2-basic /usr/lib/oracle/11.2/client/lib/libnnz11.so
oracle-instantclient11.2-basic /usr/lib/oracle/11.2/client/lib/libocci.so.11.1
oracle-instantclient11.2-basic /usr/lib/oracle/11.2/client/lib/libociei.so
oracle-instantclient11.2-basic /usr/lib/oracle/11.2/client/lib/libocijdbc11.so

# cd /usr/lib/oracle/11.2/client/lib
# ln libclntsh.so.11.1 libclntsh.so
# ln libocci.so.11.1 libocci.so
# cd /opt/PostgresPlus/9.0AS/lib
# ln -s /usr/lib/oracle/11.2/client/lib/libnnz11.so libnnz11.so
E' ora necessario impostare il parametro oracle_home = '/usr/lib/oracle/11.2/client/lib' nel file di configurazione postgresql.conf ed effettuare il restart di PostgreSQL. Ora e' possibile utilizzare i DB LINK da PostgreSQL verso una base dati Oracle! Da psql:
CREATE DATABASE LINK testora1CONNECT TO scott IDENTIFIED BY 'tiger'USING oci '//xeniaOra1.xenialab.it/TESTDB';

SELECT * FROM emp7@testora1;

Una configurazione analoga va svolta se si utilizza la versione x86_64...

Varie ed Eventuali

La versione di produzione attuale dell'Advanced Server e' la 8.4 ma e' gia' disponibile come Beta la versione 9.0. Nella versione 9.0 e' stato aggiunto il supporto per il package DBMS_PROFILER, il datatype XMLTYPE, la funzione SYS_EXTRACT_UTC, ...

La compatibilita' Oracle di EnterpriseDB e' stata rilasciata anche su DB2. Con DB2 v.9.7 e' possibile eseguire applicazioni Oracle in modo simile a quello che avviene con PostgreSQL Advanced Server. La compatibilita' a livello SQL e' disponibile per tutte le edizioni DB2, mentre il PL/SQL non e' disponibile nella edizione DB2 Express-C. Dal punto di vista di implementazione DB2 v.9.7 include un compilatore PL/SQL parallelo al proprio compilatore SQL PL. Il PL/SQL viene cosi' compilato in modo nativo senza necessita' di precompilazioni o conversioni. Una breve descrizione della configurazione si trova su questo documento. Mentre per una descrizione dettagliata sulle funzionalita' si puo' fare riferimento alla documentazione ufficiale [NdE link aggiornato alla versione v.11.1 di DB2].


Testo: EnterpriseDB
Data: 31 Aprile 2011
Versione: 1.0.1 - 31 Aprile 2014
Autore: mail@meo.bogliolo.name