sql >> Database >  >> RDS >> PostgreSQL

Migreren van Oracle naar PostgreSQL - wat u moet weten

Of u nu een database of een applicatie migreert van Oracle naar PostgreSQL met slechts één type databasekennis, er zijn weinig dingen die u moet weten over de verschillen tussen de twee databasesystemen.

PostgreSQL is 's werelds meest geavanceerde open source database. De PostgreSQL-gemeenschap is erg sterk en ze verbeteren voortdurend bestaande PostgreSQL-functies en voegen ook nieuwe functies toe. Volgens db-engines.com is PostgreSQL de DBMS van het jaar 2017.

Er zijn enkele onverenigbaarheden in Oracle en PostgreSQL. Het gedrag van sommige functies verschilt tussen Oracle en PostgreSQL.

Waarom migreren van Oracle naar PostgreSQL

  1. Kosten:Zoals u wellicht weet, zijn de licentiekosten voor Oracle erg duur en zijn er extra kosten voor sommige functies, zoals partitionering en hoge beschikbaarheid. Dus over het algemeen is het erg duur.
  2. Flexibele open source-licenties en gemakkelijke beschikbaarheid van openbare cloudproviders zoals AWS.
  3. Profiteer van open source-add-ons om de prestaties te verbeteren.

Voorlopige controle

Zoals u wellicht weet is migratie van Oracle naar PostgreSQL een kostbare en tijdrovende taak. Het is belangrijk om te begrijpen welk deel moet worden gemigreerd. Verspil geen tijd aan het migreren van objecten die niet langer nodig zijn. Controleer ook of er historische gegevens nodig zijn of niet. Verspil geen tijd aan het repliceren van gegevens die u niet nodig heeft, bijvoorbeeld back-upgegevens en tijdelijke tabellen van eerder onderhoud.

Migratiebeoordeling

Na een voorlopige controle is de eerste stap van de migratie het analyseren van de applicatie en het databaseobject, het achterhalen van de incompatibiliteiten tussen beide databases en het inschatten van de tijd en kosten die nodig zijn voor de migratie.

De Ora2pg-tool is erg handig voor het beoordelen van migratie. Het maakt verbinding met de Oracle-database, scant het automatisch en extraheert de gegevens, waardoor het databasemigratierapport wordt gegenereerd. U kunt een voorbeeldrapport bekijken in Ora2pg.

Wat u moet weten

Begrijp de verschillen tussen Oracle en PostgreSQL en converteer het met elke tool. Er is geen tool die 100% Oracle-database kan converteren naar PostgreSQL, er zijn enkele handmatige wijzigingen vereist. Bekijk hieronder enkele van de belangrijke verschillen die u moet weten voordat u migreert.

Gegevenstypetoewijzing

PostgreSQL heeft een uitgebreide reeks gegevenstypen. Enkele van de belangrijke gegevenstypeconversies tussen Oracle en PostgreSQL zijn als volgt.

Oracle PostgreSQL Reageer
VARCHAR2(n) VARCHAR(n) In Oracle is 'n' het aantal bytes, terwijl in PostgreSQL 'n' het aantal tekens is
CHAR(n) CHAR(n) In Oracle is 'n' het aantal bytes, terwijl in PostgreSQL 'n' het aantal tekens is
NUMBER(n,m) NUMERIEK(n,m) NUMBER-type kan worden geconverteerd naar NUMERIC, maar als u SMALLINT, INT en BIGINT gebruikt, zijn de prestaties beter.
NUMBER(4) SMALLINT
NUMBER (9) INT
NUMBER (18) GROOT
NUMBER(n) NUMERIEK(n) NUMERIEK(n), If n>=19
DATUM TIMESTAMP(0) Beide databases hebben het DATE-type, maar het Oracle DATE-type retourneert datum en tijd, terwijl PostgreSQL DATE-type alleen datum en tijd retourneert.
TIMESTAMP MET LOKALE TIJDZONE TIMESTAMPTZ Het PostgreSQL-type Timestamptz(Timestamp met tijdzone) is anders dan de Oracle Timestamp met tijdzone. Het is gelijk aan Oracle's Timestamp met lokale tijdzone, maar dit kleine verschil kan prestatieproblemen of applicatiefouten veroorzaken.
CLOB TEKST PostgreSQL TEXT-type kan tot 1 GB tekst opslaan.
BLOB
RAW(n)
BYTEA(limiet van 1 GB)
Groot object
In Oracle slaat het BLOB-gegevenstype ongestructureerde binaire gegevens op in de database. Het BLOB-type kan maximaal 128 terabyte aan binaire gegevens opslaan. PostgreSQL BYTEA slaat binaire gegevens op, maar slechts tot 1 GB. Als de gegevens groter zijn dan 1 GB, gebruik dan Groot object.

Transacties

Oracle database maakt altijd gebruik van transacties maar in PostgreSQL moet je dat activeren. In Oracle begint de transactie bij het uitvoeren van een instructie en eindigt wanneer de COMMIT-instructie wordt uitgevoerd. In PostgreSQL begint de transactie wanneer deze wordt uitgevoerd BEGIN en eindigt wanneer de COMMIT-instructie wordt uitgevoerd. Zelfs de isolatieniveaus hebben ook geen probleem. De PostgreSQL-database kent alle isolatieniveaus die de Oracle-database kent. Het standaard isolatieniveau van PostgreSQL is Read Committed.

Voorbeeld:

Orakel:

DELETE FROM table_name WHERE id = 120;
COMMIT;

PostgreSQL:

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

Dubbele tafel

In Oracle is de FROM-clausule verplicht voor elke SELECT-instructie, dus de Oracle-database gebruikt de DUAL-tabel voor de SELECT-instructie waarbij de tabelnaam niet vereist is. In PostgreSQL is de FROM-clausule niet verplicht, dus de DUAL-tabel is niet nodig. De Dual-tabel kan in PostgreSQL worden gemaakt om het porteringsprobleem te elimineren. Orafce tool heeft dit geïmplementeerd zodat u ook Orafce kunt gebruiken.

Voorbeeld:

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)

Na installatie van de Orafce-module:

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

SYSDATUM

De SYSDATE-functie van Oracle retourneert datum en tijd. Het gedrag van de SYSDATE-functie is op verschillende plaatsen anders. PostgreSQL heeft geen functie die overeenkomt met de functie SYSDATE. In PostgreSQL zijn er meerdere methoden om de datum en tijd te krijgen en het is gebaseerd op het toepassingsdoel.

Tijdherstelmethode Te gebruiken functie
SQL-starttijd Statement_timestamp()
Starttijd transactie nu() of

Transaction_timestamp()

Tijdstip waarop de functie is geïmplementeerd Clock_timestamp()

In het onderstaande voorbeeld retourneert clock_timestamp() de tijd waarop de feitelijke functie wordt uitgevoerd en geeft other statement_timestamp() de tijd terug waarop de SQL-instructie met de uitvoering begon.

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(twee argumenten)

De TO_DATE-functie van Oracle retourneert de waarde van het DATE-type (jaar, maand, dag, uur, minuut, seconde) terwijl TO_DATE (twee_argumenten) van PostgreSQL het type DATE-waarde retourneert (jaar, maand, dag).

De oplossing voor deze incompatibiliteit is om TO_DATE() te converteren naar TO_TIMESTAMP(). Als je de Orafce-tool gebruikt, hoef je niets te veranderen omdat Orafce deze functie heeft geïmplementeerd, dus we krijgen hetzelfde resultaat als Oracle.

Orakel:

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

PostgreSQL:

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

SYNONIEM

CREATE SYNONYM wordt niet ondersteund in PostgreSQL. In Oracle wordt CREATE SYNONYM gebruikt om toegang te krijgen tot objecten op afstand, terwijl we in PostgreSQL SET search_path kunnen gebruiken om de externe definitie op te nemen.

Orakel:

CREATE SYNONYM abc.table_name FOR pqr.table_name;

PostgreSQL:

SET search_path TO 'abc.table_name';

Gedrag van lege string en NULL

In Oracle zijn lege strings en NULL-waarden in stringcontext hetzelfde. De aaneenschakeling van NULL en string resulteert in string. In PostgreSQL is het aaneenschakelingsresultaat in dit geval nul. In Oracle wordt de IS NULL-operator gebruikt om te controleren of string leeg is of niet, maar in PostgreSQL is het resultaat FALSE voor lege string en TRUE voor NULL.

Sequenties

Er is een klein verschil in de syntaxis van sequentie in Oracle en PostgreSQL.

Orakel:

Sequence_name.nextval

PostgreSQL:

Nextval(‘sequence_name’)

Om deze syntaxis te wijzigen, kunt u een script maken of u kunt het handmatig wijzigen.

SUBSTR

Het gedrag van de SUBSTR-functie in Oracle en PostgreSQL is anders. De functie SUBSTR werkt foutloos in PostgreSQL, maar geeft een ander resultaat. Dit verschil kan applicatiefouten veroorzaken.

Orakel:

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

PostgreSQL:

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

De oplossing hiervoor is om de Orafce SUBSTR-functie te gebruiken die hetzelfde resultaat retourneert als Oracle in PostgreSQL.

VERWIJDEREN Verklaring

In Oracle kan de DELETE-instructie werken zonder de FROM-clausule, maar in PostgreSQL wordt het niet ondersteund. We moeten de FROM-component in de PostgreSQL DELETE-instructie handmatig toevoegen.

Orakel:

DELETE table_name WHERE column_name = 'Col_value';

PostgreSQL:

DELETE FROM table_name WHERE column_name = 'Col_value';

Externe koppeling +

Oracle gebruikt de operator + voor links en rechts, maar PostgreSQL gebruikt het niet.

Orakel:

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;

BEGIN MET..VERBINDEN DOOR

Oracle gebruikt START WITH..CONNECT BY voor hiërarchische queries. PostgreSQL ondersteunt de instructie START WITH..CONNECT BY niet. PostgreSQL heeft WITH RECURSIVE voor hiërarchische query's, dus vertaal de CONNECT BY-instructie in de WITH RECURSIVE-instructie.

Orakel:

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;

PLSQL naar PLPGSQL-conversie

De PL/pgSQL-taal van PostgreSQL lijkt in veel opzichten op de PL/SQL-taal van Oracle. Het is een blok-gestructureerde, imperatieve taal, en alle variabelen moeten gedeclareerd worden. In beide databases zijn de toewijzingen, loops en conditionals vergelijkbaar.

De belangrijkste verschillen waarmee u rekening moet houden bij het overzetten van PL/SQL van Oracle naar PL/pgSQL van PostgreSQL

Download de whitepaper vandaag PostgreSQL-beheer en -automatisering met ClusterControlLees wat u moet weten om PostgreSQL te implementeren, bewaken, beheren en schalenDownload de whitepaper

Migratietools

Er zijn enkele tools die erg handig zijn voor een migratie van Oracle naar PostgreSQL. Je kunt ook je eigen tool maken als extensie en deze gebruiken in PostgreSQL.

Orafce

Oracle-compatibele functies, gegevenstypes en pakketten kunnen worden gebruikt zoals in PostgreSQL. Dit is een open source tool met BSD-licentie, dus iedereen kan deze tool gebruiken.

De meeste van de belangrijkste functies worden behandeld in Orafce.

Toepassingen gebruiken deze functies meestal met meerdere gebeurtenissen. U kunt de wijzigingskosten van SQL verlagen door deze tool te gebruiken.

Alle functies en pakketten zijn correct geïmplementeerd en het is goed getest.

Enkele van de functies:

  • Dbms_output
  • dbms_random
  • utl_file – bestandssysteem gerelateerde functies
  • Dbms_pipe en dbms_alert
  • PLVdatum,PLVstr, PLVchr
  • Oracle-compatibel DATE-gegevenstype en functies zoals ADD_MONTHS, LAST_DAY,NEXT_DAY enzovoort.
  • NVL-functie
  • SUBSTR- en SUBSTRB-functie
  • Ondersteuning voor VARCHAR2 en NVARCHAR2
  • TO_DATE()

Ora2pg

Ora2Pg is een gratis tool die wordt gebruikt om een ​​Oracle-database te migreren naar een PostgreSQL-compatibel schema.

Het maakt verbinding met de Oracle-database, scant het automatisch, extraheert de structuur of gegevens en genereert vervolgens SQL-scripts die u in uw PostgreSQL-database kunt laden.

De kostenraming bij een migratie van Oracle naar PostgreSQL is niet eenvoudig.

Ora2Pg inspecteert alle database-objecten, alle functies en opgeslagen procedures om te detecteren of er nog objecten en PL/SQL-code zijn die niet automatisch door Ora2Pg kunnen worden geconverteerd.

Deze tool is erg handig voor de volgende conversies:

  • Schemaconversie
  • PLSQL naar PLPGSQL-conversie

Testen

Het testen van de hele applicatie en de gemigreerde database is erg belangrijk omdat sommige functies in beide databases hetzelfde zijn, maar het gedrag is anders.

  • Sommige veelvoorkomende scenario's moeten worden gecontroleerd:
    • Controleer of alle objecten correct zijn geconverteerd of niet.
    • Controleer of alle DMLS's correct werken of niet.
    • Laad enkele voorbeeldgegevens in beide databases en controleer het resultaat. Het resultaat van SQL uit beide databases zou hetzelfde moeten zijn.
    • Controleer de prestaties van de DML en verbeter deze indien nodig.

  1. Oracle selecteert meest recente datumrecord

  2. Vuile geheimen van de CASE-expressie

  3. Installeer Azure Data Studio op Ubuntu 18.04

  4. 4 manieren om erachter te komen welke kolommen worden geretourneerd door een opgeslagen procedure in SQL Server