sql >> Databasteknik >  >> RDS >> PostgreSQL

Migrera från Oracle till PostgreSQL - Vad du bör veta

Oavsett om du migrerar en databas eller ett program från Oracle till PostgreSQL med endast en typ av databaskunskap, finns det få saker att veta om skillnaderna mellan de två databassystemen.

PostgreSQL är världens mest avancerade öppen källkodsdatabas. PostgreSQL-gemenskapen är mycket stark och de förbättrar kontinuerligt befintliga PostgreSQL-funktioner och lägger även till nya funktioner. Enligt db-engines.com är PostgreSQL årets DBMS 2017.

Det finns vissa inkompatibiliteter i Oracle och PostgreSQL. Beteendet för vissa funktioner skiljer sig mellan Oracle och PostgreSQL.

Varför migrera från Oracle till PostgreSQL

  1. Kostnad:Som du kanske vet är kostnaden för Oracle-licensen mycket dyr och det tillkommer extra kostnader för vissa funktioner som partitionering och hög tillgänglighet. Så överlag är det väldigt dyrt.
  2. Flexibel licensiering med öppen källkod och enkel tillgänglighet från offentliga molnleverantörer som AWS.
  3. Dra nytta av tillägg med öppen källkod för att förbättra prestandan.

Preliminär kontroll

Som du kanske vet är migrering från Oracle till PostgreSQL en kostsam och tidskrävande uppgift. Det är viktigt att förstå vilken del som ska migrera. Slösa inte tid på att migrera objekt som inte längre behövs. Kontrollera också om det finns några historiska data som krävs eller inte. Slösa inte tid på att replikera data som du inte behöver, till exempel säkerhetskopieringsdata och tillfällig tabell från tidigare underhåll.

Migrationsbedömning

Efter en preliminär kontroll är det första steget i migreringen att analysera applikationen och databasobjektet, ta reda på inkompatibiliteterna mellan de båda databaserna och uppskatta den tid och kostnad som krävs för migreringen.

Ora2pg-verktyget är mycket användbart för migrationsbedömning. Den ansluter till Oracle-databasen, skannar den automatiskt och extraherar data och genererar databasmigreringsrapporten. Du kan kontrollera en exempelrapport i Ora2pg.

Vad du bör veta

Förstå skillnaderna mellan Oracle och PostgreSQL och konvertera det med vilket verktyg som helst. Det finns inget verktyg som kan konvertera 100 % Oracle-databas till PostgreSQL, några manuella ändringar krävs. Kontrollera nedan några av de viktiga skillnaderna du bör känna till innan du migrerar.

Datatypmappning

PostgreSQL har en rik uppsättning datatyper. Några av de viktiga datatypkonverteringarna mellan Oracle och PostgreSQL är följande.

Oracle PostgreSQL Kommentar
VARCHAR2(n) VARCHAR(n) I Oracle är 'n' antalet byte medan 'n' i PostgreSQL är antalet tecken
CHAR(n) CHAR(n) I Oracle är 'n' antalet byte medan 'n' i PostgreSQL är antalet tecken
NUMMER(n,m) NUMERISK(n,m) NUMBER-typ kan konverteras till NUMERIC, men om du använder SMALLINT, INT och BIGINT skulle prestandan bli bättre.
NUMMER(4) SMALLINT
NUMMER(9) INT
NUMMER(18) STORT
NUMMER(n) NUMERIC(n) NUMERIC(n) ,Om n>=19
DATUM TIMESTAMP(0) Båda databaserna har DATE-typ men Oracle DATE-typ returnerar datum och tid medan PostgreSQL DATE-typ endast returnerar datum utan tid.
TIDSSTÄMPEL MED LOKAL TIDZON TIMESTAMPTZ PostgreSQL-typen Timestamptz (tidsstämpel med tidszon) skiljer sig från Oracles tidsstämpel med tidszon. Det motsvarar Oracles tidsstämpel med lokal tidszon, men denna lilla skillnad kan orsaka prestandaproblem eller programfel.
CLOB TEXT PostgreSQL TEXT-typ kan lagra upp till 1 GB text.
BLOB
RAW(n)
BYTEA(1 GB gräns)
Stort objekt
I Oracle lagrar BLOB datatype ostrukturerad binär data i databasen. BLOB-typ kan lagra upp till 128 terabyte binär data. PostgreSQL BYTEA lagrar binär data men bara upp till 1 GB. Om data överstiger 1 GB, använd Large object.

Transaktioner

Oracle-databasen använder alltid transaktioner men i PostgreSQL måste du aktivera det. I Oracle startar transaktionen när någon sats körs och slutar när COMMIT-satsen körs. I PostgreSQL startar transaktionen när BEGIN körs och slutar när COMMIT-satsen körs. Inte ens isoleringsnivåerna har heller inga problem. PostgreSQL-databasen känner till alla isoleringsnivåer som Oracle-databasen känner till. Standardisoleringsnivån för PostgreSQL är Read committed.

Exempel:

Oracle:

DELETE FROM table_name WHERE id = 120;
COMMIT;

PostgreSQL:

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

Dubbel tabell

I Oracle är FROM-satsen obligatorisk för varje SELECT-sats så Oracle-databasen använder DUAL-tabellen för SELECT-satsen där tabellnamnet inte krävs. I PostgreSQL är FROM-satsen inte obligatorisk så DUAL-tabellen är inte nödvändig. Dual-tabellen kan skapas i PostgreSQL för att eliminera porteringsproblemet. Orafce-verktyget har implementerat detta så att du också kan använda Orafce.

Exempel:

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)

Efter installation av Orafce-modulen:

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

SYSDATE

Oracles SYSDATE-funktion returnerar datum och tid. SYSDATE-funktionens beteende är olika på olika platser. PostgreSQL har ingen funktion som motsvarar SYSDATE-funktionen. I PostgreSQL finns det flera metoder för att få datum och tid och det är baserat på applikationens syfte.

Tidshämtningsmetod Funktion som ska användas
SQL-starttid Statement_timestamp()
Transaktionens starttid nu() eller

Transaction_timestamp()

Tid när funktionen implementeras Clock_timestamp()

I exemplet nedan returnerar clock_timestamp() tiden när den faktiska funktionen exekveras och andra statement_timestamp() returnerar tiden när SQL-satsen startade sin exekvering.

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(två argument)

Oracles TO_DATE-funktion returnerar DATE-typvärde (år, månad, dag, timme, minut, sekund) medan PostgreSQL:s TO_DATE(two_argument) returnerar DATE-typvärde (år, månad, dag).

Lösningen för denna inkompatibilitet är att konvertera TO_DATE() till TO_TIMESTAMP(). Om du använder Orafce-verktyget behöver du inte ändra något eftersom Orafce implementerade den här funktionen så att vi får samma resultat som Oracle.

Oracle:

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

PostgreSQL:

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

SYNONYM

CREATE SYNONYM stöds inte i PostgreSQL. I Oracle används CREATE SYNONYM för att komma åt fjärrobjekt medan vi i PostgreSQL kan använda SET search_path för att inkludera fjärrdefinitionen.

Oracle:

CREATE SYNONYM abc.table_name FOR pqr.table_name;

PostgreSQL:

SET search_path TO 'abc.table_name';

Beteende av tom sträng och NULL

I Oracle är tomma strängar och NULL-värden i strängkontext desamma. Sammansättningen av NULL och sträng erhåller sträng som ett resultat. I PostgreSQL är sammanlänkningsresultatet null i detta fall. I Oracle IS NULL används operatorn för att kontrollera om strängen är tom eller inte, men i PostgreSQL är resultatet FALSE för tom sträng och TRUE för NULL.

Sekvenser

Det finns en liten skillnad i sekvenssyntaxen i Oracle och PostgreSQL.

Oracle:

Sequence_name.nextval

PostgreSQL:

Nextval(‘sequence_name’)

För att ändra denna syntax kan du skapa ett skript eller så kan du ändra det manuellt.

SUBSTR

Beteendet för SUBSTR-funktionen i Oracle och PostgreSQL är annorlunda. SUBSTR-funktionen fungerar i PostgreSQL utan fel men returnerar ett annat resultat. Denna skillnad kan orsaka programbuggar.

Oracle:

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

PostgreSQL:

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

Lösningen för detta är att använda Orafce SUBSTR-funktionen som returnerar samma resultat som Oracle i PostgreSQL.

RADERA uttalande

I Oracle kan DELETE-satsen fungera utan FROM-sats men i PostgreSQL stöds den inte. Vi måste lägga till FROM-satsen i PostgreSQL DELETE-satsen manuellt.

Oracle:

DELETE table_name WHERE column_name = 'Col_value';

PostgreSQL:

DELETE FROM table_name WHERE column_name = 'Col_value';

Extern koppling +

Oracle använder operatorn + för vänster och höger join men PostgreSQL använder den inte.

Oracle:

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;

BÖRJA MED..KOPPLA VID

Oracle använder START WITH..CONNECT BY för hierarkiska frågor. PostgreSQL stöder inte START WITH..CONNECT BY-satsen. PostgreSQL har WITH RECURSIVE för hierarkiska frågor så översätt CONNECT BY-satsen till WITH RECURSIVE-satsen.

Oracle:

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 till PLPGSQL-konvertering

PostgreSQL:s PL/pgSQL-språk liknar Oracles PL/SQL-språk i många aspekter. Det är ett blockstrukturerat, imperativt språk, och alla variabler måste deklareras. I båda databaserna är tilldelningar, loopar, villkor likartade.

De huvudsakliga skillnaderna du bör tänka på när du porterar från Oracles PL/SQL till PostgreSQL:s PL/pgSQL

Ladda ner Whitepaper Today PostgreSQL Management &Automation med ClusterControlLäs om vad du behöver veta för att distribuera, övervaka, hantera och skala PostgreSQLDladda Whitepaper

Migreringsverktyg

Det finns några verktyg som är mycket användbara för en Oracle till PostgreSQL-migrering. Du kan också skapa ditt eget verktyg som ett tillägg och använda det i PostgreSQL.

Orafce

Oracle-kompatibla funktioner, datatyp och paket kan användas som det är i PostgreSQL. Detta är ett verktyg med öppen källkod med BSD-licens så vem som helst kan använda det här verktyget.

De flesta av huvudfunktionerna täcks av Orafce.

Applikationer använder vanligtvis dessa funktioner med flera förekomster. Du kan minska ändringskostnaden för SQL genom att använda det här verktyget.

Alla funktioner och paket är korrekt implementerade och det är väl testat.

Några av funktionerna:

  • Dbms_output
  • dbms_random
  • utl_file – filsystemrelaterade funktioner
  • Dbms_pipe och dbms_alert
  • PLVdate,PLVstr, PLVchr
  • Oracle-kompatibel DATE-datatyp och funktioner som ADD_MONTHS, LAST_DAY, NEXT_DAY och så vidare.
  • NVL-funktion
  • SUBSTR och SUBSTRB-funktion
  • Stöd för VARCHAR2 och NVARCHAR2
  • TO_DATE()

Ora2pg

Ora2Pg är ett gratis verktyg som används för att migrera en Oracle-databas till ett PostgreSQL-kompatibelt schema.

Den ansluter till Oracle-databasen, skannar den automatiskt, extraherar dess struktur eller data och genererar sedan SQL-skript som du kan ladda in i din PostgreSQL-databas.

Kostnadsuppskattningen i en Oracle till PostgreSQL-migrering är inte lätt.

Ora2Pg inspekterar alla databasobjekt, alla funktioner och lagrade procedurer för att upptäcka om det fortfarande finns några objekt och PL/SQL-kod som inte kan konverteras automatiskt av Ora2Pg.

Det här verktyget är mycket användbart för följande omvandlingar:

  • Schemakonvertering
  • PLSQL till PLPGSQL konvertering

Testning

Att testa hela applikationen och den migrerade databasen är mycket viktigt eftersom vissa av funktionerna är desamma i båda databaserna, men beteendet är annorlunda.

  • Några vanliga scenarier måste kontrolleras:
    • Kontrollera om alla objekt är korrekt konverterade eller inte.
    • Kontrollera om alla DMLS:er fungerar korrekt eller inte.
    • Ladda in några exempeldata i båda databaserna och kontrollera resultatet. Resultatet av SQL från båda databaserna bör vara detsamma.
    • Kontrollera prestandan för DML och förbättra den vid behov.

  1. ojdbc14.jar mot ojdbc6.jar

  2. Exempel på SQL Server FÖR JSON PATH (T-SQL)

  3. Hjälp för MySQL-uppdateringsfall

  4. Inget mer SPU