PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Migrazione da Oracle a PostgreSQL:cosa dovresti sapere

Che si tratti di migrare un database o un'applicazione da Oracle a PostgreSQL con un solo tipo di conoscenza del database, ci sono poche cose da sapere sulle differenze tra i due sistemi di database.

PostgreSQL è il database open source più avanzato al mondo. La comunità di PostgreSQL è molto forte e migliora continuamente le funzionalità PostgreSQL esistenti e aggiunge anche nuove funzionalità. Secondo db-engines.com, PostgreSQL è il DBMS dell'anno 2017.

Ci sono alcune incompatibilità in Oracle e PostgreSQL. Il comportamento di alcune funzioni è diverso tra Oracle e PostgreSQL.

Perché migrare da Oracle a PostgreSQL

  1. Costo:come forse saprai, il costo della licenza Oracle è molto elevato e c'è un costo aggiuntivo per alcune funzionalità come il partizionamento e l'elevata disponibilità. Quindi nel complesso è molto costoso.
  2. Licenze open source flessibili e facile disponibilità da provider di cloud pubblico come AWS.
  3. Trai vantaggio dai componenti aggiuntivi open source per migliorare le prestazioni.

Verifica preliminare

Come forse saprai, la migrazione da Oracle a PostgreSQL è un'attività costosa e che richiede tempo. È importante capire quale parte deve migrare. Non perdere tempo a migrare oggetti che non sono più necessari. Inoltre, controlla se sono richiesti o meno dati storici. Non perdere tempo a replicare i dati che non ti servono, ad esempio i dati di backup e le tabelle temporanee dalla manutenzione passata.

Valutazione della migrazione

Dopo il controllo preliminare, il primo passaggio della migrazione consiste nell'analisi dell'applicazione e dell'oggetto database, scoprire le incompatibilità tra i due database e stimare i tempi e i costi necessari per la migrazione.

Lo strumento Ora2pg è molto utile per la valutazione della migrazione. Si collega al database Oracle, lo scansiona automaticamente ed estrae i dati, generando il report di migrazione del database. Puoi controllare un rapporto di esempio in Ora2pg.

Cosa dovresti sapere

Comprendi le differenze tra Oracle e PostgreSQL e convertilo utilizzando qualsiasi strumento. Non esiste alcuno strumento in grado di convertire il database Oracle al 100% in PostgreSQL, sono necessarie alcune modifiche manuali. Controlla di seguito alcune delle differenze importanti che dovresti conoscere prima di eseguire la migrazione.

Mappatura del tipo di dati

PostgreSQL ha un ricco set di tipi di dati. Alcune delle importanti conversioni del tipo di dati tra Oracle e PostgreSQL sono le seguenti.

Oracle PostgreSQL Comment
VARCHAR2(n) VARCHAR(n) In Oracle 'n' è il numero di byte mentre in PostgreSQL 'n' è il numero di caratteri
CHAR(n) CHAR(n) In Oracle 'n' è il numero di byte mentre in PostgreSQL 'n' è il numero di caratteri
NUMERO(n,m) NUMERICO(n,m) Il tipo NUMBER può essere convertito in NUMERIC ma se usi SMALLINT, INT e BIGINT le prestazioni sarebbero migliori.
NUMERO(4) SMALLINT
NUMERO(9) INT
NUMERO(18) GRANDE
NUMERO(n) NUMERICO(n) NUMERICO(n) ,Se n>=19
DATA TIMESTAMP(0) Entrambi i database hanno il tipo DATE ma il tipo Oracle DATE restituisce data e ora mentre il tipo PostgreSQL DATE restituisce solo la data e non l'ora.
TIMESTAMP CON FUSO ORARIO LOCALE TIMESTAMPTZ Il tipo PostgreSQL Timestamptz(Timestamp con fuso orario) è diverso da Oracle Timestamp con fuso orario. È equivalente al Timestamp di Oracle con fuso orario locale, ma questa piccola differenza può causare problemi di prestazioni o bug dell'applicazione.
CLOB TESTO Il tipo TEXT di PostgreSQL può memorizzare fino a 1 GB di testo.
BLOB
RAW(n)
BYTEA(limite 1 GB)
Oggetto grande
In Oracle, il tipo di dati BLOB memorizza i dati binari non strutturati nel database. Il tipo BLOB può memorizzare fino a 128 terabyte di dati binari. PostgreSQL BYTEA memorizza i dati binari ma solo fino a 1 GB. Se i dati sono superiori a 1 GB, utilizzare l'oggetto Large.

Transazioni

Il database Oracle utilizza sempre le transazioni ma in PostgreSQL devi attivarlo. In Oracle, la transazione inizia durante l'esecuzione di qualsiasi istruzione e termina quando viene eseguita l'istruzione COMMIT. In PostgreSQL, la transazione inizia quando viene eseguita BEGIN e termina quando viene eseguita l'istruzione COMMIT. Anche i livelli di isolamento non hanno problemi. Il database PostgreSQL conosce tutti i livelli di isolamento che il database Oracle conosce. Il livello di isolamento predefinito di PostgreSQL è Read commit.

Esempio:

Oracolo:

DELETE FROM table_name WHERE id = 120;
COMMIT;

PostgreSQL:

BEGIN;
DELETE FROM table_name WHERE id  = 120;
COMMIT;

Tabella doppia

In Oracle FROM la clausola è obbligatoria per ogni istruzione SELECT, quindi il database Oracle utilizza la tabella DUAL per l'istruzione SELECT dove il nome della tabella non è richiesto. In PostgreSQL, la clausola FROM non è obbligatoria, quindi la tabella DUAL non è necessaria. La tabella Dual può essere creata in PostgreSQL per eliminare il problema del porting. Lo strumento Orafce lo ha implementato in modo da poter utilizzare anche Orafce.

Esempio:

postgres=# SELECT CURRENT_TIMESTAMP FROM DUAL;
ERROR:  relation "dual" does not exist
LINE 1: SELECT CURRENT_TIMESTAMP FROM DUAL;
                                      ^
postgres=# SELECT CURRENT_TIMESTAMP;
       current_timestamp
-------------------------------
 2018-03-16 09:36:01.205925+00
(1 row)

Dopo aver installato il modulo Orafce:

postgres=# SELECT CURRENT_TIMESTAMP FROM DUAL;
       current_timestamp
-------------------------------
 2018-03-16 09:36:01.205925+00
(1 row)

SYSDATE

La funzione SYSDATE di Oracle restituisce data e ora. Il comportamento della funzione SYSDATE è diverso in luoghi diversi. PostgreSQL non ha alcuna funzione corrispondente alla funzione SYSDATE. In PostgreSQL ci sono più metodi per ottenere la data e l'ora e si basa sullo scopo dell'applicazione.

Metodo di recupero del tempo Funzione da utilizzare
Ora di inizio SQL Statement_timestamp()
Ora inizio transazione ora() o

Transaction_timestamp()

Ora in cui la funzione è implementata Clock_timestamp()

Nell'esempio seguente clock_timestamp() restituisce l'ora in cui viene eseguita la funzione effettiva e other statement_timestamp() restituisce l'ora in cui l'istruzione SQL ha iniziato l'esecuzione.

postgres=# SELECT now(), statement_timestamp(), current_timestamp, transaction_timestamp(), clock_timestamp();
              now              |      statement_timestamp      |       current_timestamp       |     transaction_timestamp     |        clock_timestamp
 
-------------------------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------
 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163281+00
 (1 row)

TO_DATE(due argomenti)

La funzione TO_DATE di Oracle restituisce il valore di tipo DATE (anno, mese, giorno, ora, minuti, secondi) mentre TO_DATE di PostgreSQL (two_argument) restituisce il valore di tipo DATE (anno, mese, giorno).

La soluzione per questa incompatibilità è convertire TO_DATE() in TO_TIMESTAMP(). Se utilizzi lo strumento Orafce, non è necessario modificare nulla perché Orafce ha implementato questa funzione, quindi otteniamo lo stesso risultato in Oracle.

Oracolo:

SELECT TO_DATE ('20180314121212','yyyymmddhh24miss') FROM dual;

PostgreSQL:

SELECT TO_TIMESTAMP ('20180314121212','yyyymmddhh24miss')::TIMESTAMP(0);

SINONIMI

CREATE SYNONYM non è supportato in PostgreSQL. In Oracle CREATE SYNONYM viene utilizzato per accedere a oggetti remoti mentre in PostgreSQL possiamo utilizzare SET search_path per includere la definizione remota.

Oracolo:

CREATE SYNONYM abc.table_name FOR pqr.table_name;

PostgreSQL:

SET search_path TO 'abc.table_name';

Comportamento di stringa vuota e NULL

In Oracle, le stringhe vuote ei valori NULL nel contesto della stringa sono gli stessi. La concatenazione di NULL e string ottiene come risultato una stringa. In PostgreSQL il risultato della concatenazione è nullo in questo caso. In Oracle IS NULL l'operatore viene utilizzato per verificare se la stringa è vuota o meno, ma in PostgreSQL il risultato è FALSE per una stringa vuota e VERO per NULL.

Sequenze

C'è una leggera differenza nella sintassi della sequenza in Oracle e PostgreSQL.

Oracolo:

Sequence_name.nextval

PostgreSQL:

Nextval(‘sequence_name’)

Per modificare questa sintassi puoi creare uno script oppure puoi cambiarlo manualmente.

SOTTOSTR

Il comportamento della funzione SUBSTR in Oracle e PostgreSQL è diverso. La funzione SUBSTR funziona in PostgreSQL senza errori ma restituisce un risultato diverso. Questa differenza può causare bug dell'applicazione.

Oracolo:

SELECT SUBSTR(‘ABC’,-1) FROM DUAL;
Returns ‘C’

PostgreSQL:

postgres=# SELECT SUBSTR('ABC',-1);
 substr
--------
 ABC
(1 row)

La soluzione è utilizzare la funzione SUBSTR di Orafce che restituisce lo stesso risultato di Oracle in PostgreSQL.

Dichiarazione DELETE

In Oracle, l'istruzione DELETE può funzionare senza la clausola FROM ma in PostgreSQL non è supportata. Dobbiamo aggiungere manualmente la clausola FROM nell'istruzione DELETE di PostgreSQL.

Oracolo:

DELETE table_name WHERE column_name = 'Col_value';

PostgreSQL:

DELETE FROM table_name WHERE column_name = 'Col_value';

Accoppiamento esterno +

Oracle usa l'operatore + per il join sinistro e destro ma PostgreSQL non lo usa.

Oracolo:

SELECT a1.name1, a2.name2
     FROM a1, a2
     WHERE a1.code = a2.code (+);

PostgreSQL:

SELECT a1.name1, a2.name2
    FROM a1
    LEFT OUTER JOIN a2 ON a1.code = a2.code;

INIZIA CON..COLLEGATI BY

Oracle utilizza START WITH..CONNECT BY per le query gerarchiche. PostgreSQL non supporta l'istruzione START WITH..CONNECT BY. PostgreSQL ha WITH RECURSIVE per le query gerarchiche, quindi traduci l'istruzione CONNECT BY in un'istruzione WITH RICORSIVE.

Oracolo:

SELECT 
    restaurant_name, 
    city_name 
FROM 
    restaurants rs 
START WITH rs.city_name = 'TOKYO' 
CONNECT BY PRIOR rs.restaurant_name = rs.city_name;

PostgreSQL:

WITH RECURSIVE tmp AS (SELECT restaurant_name, city_name
                                 FROM restaurants
                                WHERE city_name = 'TOKYO'
                                UNION
                               SELECT m.restaurant_name, m.city_name
                                 FROM restaurants m
                                 JOIN tmp ON tmp.restaurant_name = m.city_name)
                  SELECT restaurant_name, city_name FROM tmp;

Conversione da PLSQL a PLPGSQL

Il linguaggio PL/pgSQL di PostgreSQL è simile per molti aspetti al linguaggio PL/SQL di Oracle. È un linguaggio imperativo strutturato a blocchi e tutte le variabili devono essere dichiarate. In entrambi i database assegnazioni, cicli e condizionali sono simili.

Le principali differenze da tenere a mente durante il porting da PL/SQL di Oracle a PL/pgSQL di PostgreSQL

Scarica il whitepaper oggi Gestione e automazione di PostgreSQL con ClusterControlScopri cosa devi sapere per distribuire, monitorare, gestire e ridimensionare PostgreSQLScarica il whitepaper

Strumenti di migrazione

Ci sono alcuni strumenti che sono molto utili per una migrazione da Oracle a PostgreSQL. Puoi anche creare il tuo strumento come estensione e usarlo all'interno di PostgreSQL.

Oratorio

È possibile utilizzare funzioni, tipi di dati e pacchetti compatibili con Oracle come in PostgreSQL. Questo è uno strumento open source con licenza BSD, quindi chiunque può utilizzare questo strumento.

La maggior parte delle funzioni principali sono coperte in Orafce.

Le applicazioni di solito usano quelle funzioni con più occorrenze. Puoi ridurre il costo di modifica di SQL utilizzando questo strumento.

Tutte le funzioni e i pacchetti sono implementati correttamente ed è ben testato.

Alcune delle funzioni:

  • Uscita_dbms
  • dbms_random
  • utl_file – funzioni relative al filesystem
  • Dbms_pipe e dbms_alert
  • PLVdate,PLVstr, PLVchr
  • Tipo di dati DATE compatibile con Oracle e funzioni come ADD_MONTHS, LAST_DAY, NEXT_DAY e così via.
  • Funzione NVL
  • Funzione SUBSTR e SUBSTRB
  • Supporto VARCHAR2 e NVARCHAR2
  • TO_DATE()

Ora2pg

Ora2Pg è uno strumento gratuito utilizzato per migrare un database Oracle su uno schema compatibile con PostgreSQL.

Si connette al database Oracle, lo scansiona automaticamente, ne estrae la struttura o i dati e quindi genera script SQL che puoi caricare nel tuo database PostgreSQL.

La stima dei costi in una migrazione da Oracle a PostgreSQL non è facile.

Ora2Pg ispeziona tutti gli oggetti del database, tutte le funzioni e le procedure memorizzate per rilevare se sono ancora presenti alcuni oggetti e codice PL/SQL che non possono essere convertiti automaticamente da Ora2Pg.

Questo strumento è molto utile per le seguenti conversioni:

  • Conversione dello schema
  • Conversione da PLSQL a PLPGSQL

Test

Testare l'intera applicazione e il database migrato è molto importante perché alcune delle funzioni sono le stesse in entrambi i database, tuttavia il comportamento è diverso.

  • È necessario verificare alcuni scenari comuni:
    • Verifica se tutti gli oggetti sono stati convertiti correttamente o meno.
    • Verifica se tutti i DMLS funzionano correttamente o meno.
    • Carica alcuni dati campione in entrambi i database e controlla il risultato. Il risultato di SQL da entrambi i database dovrebbe essere lo stesso.
    • Verifica le prestazioni del DML e miglioralo se necessario.