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

Migrering fra Oracle til PostgreSQL - hvad du bør vide

Uanset om du migrerer en database eller et program fra Oracle til PostgreSQL med kun én type databaseviden, er der få ting at vide om forskellene mellem de to databasesystemer.

PostgreSQL er verdens mest avancerede open source-database. PostgreSQL-fællesskabet er meget stærkt, og de forbedrer løbende eksisterende PostgreSQL-funktioner og tilføjer også nye funktioner. Ifølge db-engines.com er PostgreSQL årets DBMS 2017.

Der er nogle inkompatibiliteter i Oracle og PostgreSQL. Nogle funktioners adfærd er forskellig mellem Oracle og PostgreSQL.

Hvorfor migrere fra Oracle til PostgreSQL

  1. Omkostninger:Som du måske ved, er omkostningerne til Oracle-licensen meget dyre, og der er ekstra omkostninger for nogle funktioner som partitionering og høj tilgængelighed. Så generelt er det meget dyrt.
  2. Fleksibel open source-licensering og nem tilgængelighed fra offentlige cloud-udbydere som AWS.
  3. Drag fordel af open source-tilføjelser for at forbedre ydeevnen.

Foreløbig kontrol

Som du måske ved, er migrering fra Oracle til PostgreSQL en dyr og tidskrævende opgave. Det er vigtigt at forstå, hvilken del der skal migreres. Spild ikke tid på at migrere objekter, der ikke længere er nødvendige. Tjek også, om der er nødvendige historiske data eller ej. Spild ikke tid på at replikere data, som du ikke har brug for, f.eks. backupdata og midlertidig tabel fra tidligere vedligeholdelse.

Migrationsvurdering

Efter den foreløbige kontrol er det første trin i migreringen at analysere applikationen og databaseobjektet, finde ud af inkompatibiliteterne mellem begge databaser og estimere den tid og omkostninger, der kræves til migrering.

Ora2pg-værktøjet er meget nyttigt til migrationsvurdering. Den opretter forbindelse til Oracle-databasen, scanner den automatisk og udtrækker dataene og genererer databasemigreringsrapporten. Du kan tjekke en eksempelrapport i Ora2pg.

Hvad du bør vide

Forstå forskellene mellem Oracle og PostgreSQL og konverter det ved hjælp af ethvert værktøj. Der er ikke noget værktøj, der kan konvertere 100% Oracle-database til PostgreSQL, nogle manuelle ændringer er påkrævet. Tjek venligst nedenfor nogle af de vigtige forskelle, du bør vide, før du migrerer.

Data Type Mapping

PostgreSQL har et rigt sæt af datatyper. Nogle af de vigtige datatypekonverteringer mellem Oracle og PostgreSQL er som følger.

Oracle PostgreSQL Kommentar
VARCHAR2(n) VARCHAR(n) I Oracle er 'n' antallet af bytes, mens 'n' i PostgreSQL er antallet af tegn
CHAR(n) CHAR(n) I Oracle er 'n' antallet af bytes, mens 'n' i PostgreSQL er antallet af tegn
ANTAL(n,m) NUMERISK(n,m) NUMBER type kan konverteres til NUMERIC, men hvis du bruger SMALLINT, INT og BIGINT, ville ydeevnen være bedre.
NUMMER(4) SMALLINT
NUMMER(9) INT
NUMMER(18) STORT
NUMMER(n) NUMERISK(n) NUMERISK(n) ,Hvis n>=19
DATO TIMESTAMP(0) Begge databaser har DATE-typen, men Oracle DATE-typen returnerer dato og klokkeslæt, mens PostgreSQL DATE-typen kun returnerer dato og ingen tid.
TIDSSTAMPE MED LOKAL TIDZONE TIMESTAMPTZ PostgreSQL-typen Timestamptz (tidsstempel med tidszone) er forskellig fra Oracles tidsstempel med tidszone. Det svarer til Oracles tidsstempel med lokal tidszone, men denne lille forskel kan forårsage ydeevneproblemer eller applikationsfejl.
CLOB TEKST PostgreSQL TEXT-typen kan gemme op til 1 GB tekst.
BLOB
RAW(n)
BYTEA(1 GB grænse)
Stort objekt
I Oracle gemmer BLOB datatype ustrukturerede binære data i databasen. BLOB-typen kan gemme op til 128 terabyte binære data. PostgreSQL BYTEA gemmer binære data, men kun op til 1 GB. Hvis dataene er over 1 GB, skal du bruge Large object.

Transaktioner

Oracle-databasen bruger altid transaktioner, men i PostgreSQL skal du aktivere det. I Oracle starter transaktionen, når en hvilken som helst erklæring udføres, og slutter, når COMMIT-sætningen udføres. I PostgreSQL starter transaktionen, når BEGIN udføres, og slutter, når COMMIT-sætningen udføres. Selv isolationsniveauerne har heller ikke noget problem. PostgreSQL-databasen kender alle de isolationsniveauer, som Oracle-databasen kender. Standardisolationsniveauet for PostgreSQL er Read committed.

Eksempel:

Oracle:

DELETE FROM table_name WHERE id = 120;
COMMIT;

PostgreSQL:

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

Dobbelt bord

I Oracle er FROM-sætning obligatorisk for hver SELECT-sætning, så Oracle-databasen bruger DUAL-tabel til SELECT-sætning, hvor tabelnavn ikke er påkrævet. I PostgreSQL er FROM-klausulen ikke obligatorisk, så DUAL-tabel er ikke nødvendig. Dual-tabellen kan oprettes i PostgreSQL med henblik på at eliminere porteringsproblemet. Orafce-værktøjet har implementeret dette, så du også kan bruge Orafce.

Eksempel:

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 af Orafce-modulet:

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

SYSDATE

Oracles SYSDATE-funktion returnerer dato og klokkeslæt. Funktionen SYSDATE-funktionen er forskellig forskellige steder. PostgreSQL har ikke nogen funktion, der svarer til SYSDATE-funktionen. I PostgreSQL er der flere metoder til at få dato og klokkeslæt, og det er baseret på applikationsformålet.

Tidshentningsmetode Funktion, der skal bruges
SQL-starttid Statement_timestamp()
Transaktionens starttidspunkt nu() eller

Transaction_timestamp()

Tid, hvor funktionen er implementeret Clock_timestamp()

I eksemplet nedenfor returnerer clock_timestamp() det tidspunkt, hvor den faktiske funktion udføres, og andet statement_timestamp() returnerer det tidspunkt, hvor SQL-sætningen startede dens eksekvering.

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(to argument)

Oracles TO_DATE-funktion returnerer DATE-typeværdien (år, måned, dag, time, minut, sekund), mens PostgreSQL's TO_DATE(two_argument) returnerer DATE-typeværdien (år, måned, dag).

Løsningen på denne inkompatibilitet er at konvertere TO_DATE() til TO_TIMESTAMP(). Hvis du bruger Orafce-værktøjet, er det ikke nødvendigt at ændre noget, fordi Orafce implementerede denne funktion, så vi får det samme resultat som Oracle.

Oracle:

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

PostgreSQL:

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

SYNONYM

CREATE SYNONYM er ikke understøttet i PostgreSQL. I Oracle bruges CREATE SYNONYM til at få adgang til fjernobjekter, mens vi i PostgreSQL kan bruge SET search_path til at inkludere fjerndefinitionen.

Oracle:

CREATE SYNONYM abc.table_name FOR pqr.table_name;

PostgreSQL:

SET search_path TO 'abc.table_name';

Opførsel af tom streng og NULL

I Oracle er tomme strenge og NULL-værdier i strengkontekst de samme. Sammenkædningen af ​​NULL og streng opnår streng som et resultat. I PostgreSQL er sammenkædningsresultatet null i dette tilfælde. I Oracle IS NULL bruges operatoren til at kontrollere, om strengen er tom eller ej, men i PostgreSQL er resultatet FALSE for tom streng og TRUE for NULL.

Sekvenser

Der er en lille forskel i sekvenssyntaksen i Oracle og PostgreSQL.

Oracle:

Sequence_name.nextval

PostgreSQL:

Nextval(‘sequence_name’)

For at ændre denne syntaks kan du oprette et script, eller du kan ændre det manuelt.

SUBSTR

Opførselen af ​​SUBSTR-funktionen i Oracle og PostgreSQL er anderledes. SUBSTR-funktionen fungerer i PostgreSQL uden fejl, men returnerer et andet resultat. Denne forskel kan forårsage programfejl.

Oracle:

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

PostgreSQL:

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

Løsningen til dette er at bruge Orafce SUBSTR-funktionen, som returnerer det samme resultat som Oracle i PostgreSQL.

SLET erklæring

I Oracle kan DELETE-sætningen fungere uden FROM-sætning, men i PostgreSQL understøttes den ikke. Vi skal tilføje FROM-klausul i PostgreSQL DELETE-sætningen manuelt.

Oracle:

DELETE table_name WHERE column_name = 'Col_value';

PostgreSQL:

DELETE FROM table_name WHERE column_name = 'Col_value';

Ekstern kobling +

Oracle bruger + operator til venstre og højre join, men PostgreSQL bruger det ikke.

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;

START MED..OPSLUT VED

Oracle bruger START WITH..CONNECT BY til hierarkiske forespørgsler. PostgreSQL understøtter ikke START WITH..CONNECT BY-sætning. PostgreSQL har WITH RECURSIVE til hierarkiske forespørgsler, så oversæt CONNECT BY-sætning til WITH RECURSIVE-sætning.

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

PostgreSQLs PL/pgSQL-sprog ligner Oracles PL/SQL-sprog i mange aspekter. Det er et blokstruktureret, imperativt sprog, og alle variabler skal erklæres. I begge databaser er tildelinger, loops, conditionals ens.

De vigtigste forskelle, du bør huske på, når du porterer fra Oracles PL/SQL til PostgreSQL's PL/pgSQL

Download Whitepaper Today PostgreSQL Management &Automation med ClusterControlFå flere oplysninger om, hvad du skal vide for at implementere, overvåge, administrere og skalere PostgreSQLDownload Whitepaper

Migreringsværktøjer

Der er nogle værktøjer, som er meget nyttige for en Oracle til PostgreSQL-migrering. Du kan også oprette dit eget værktøj som en udvidelse og bruge det inde i PostgreSQL.

Orafce

Oracle-kompatible funktioner, datatype og pakker kan bruges som det er i PostgreSQL. Dette er et open source-værktøj med BSD-licens, så alle kan bruge dette værktøj.

De fleste af de vigtigste funktioner er dækket i Orafce.

Programmer bruger normalt disse funktioner med flere forekomster. Du kan reducere ændringsomkostningerne for SQL ved at bruge dette værktøj.

Alle funktioner og pakker er implementeret korrekt, og det er gennemtestet.

Nogle af funktionerne:

  • Dbms_output
  • dbms_random
  • utl_file – filsystemrelaterede funktioner
  • Dbms_pipe og dbms_alert
  • PLVdate,PLVstr, PLVchr
  • Oracle-kompatibel DATE-datatype og funktioner som ADD_MONTHS, LAST_DAY, NEXT_DAY og så videre.
  • NVL-funktion
  • SUBSTR- og SUBSTRB-funktion
  • VARCHAR2- og NVARCHAR2-understøttelse
  • TO_DATE()

Ora2pg

Ora2Pg er et gratis værktøj, der bruges til at migrere en Oracle-database til et PostgreSQL-kompatibelt skema.

Den opretter forbindelse til Oracle-databasen, scanner den automatisk, udtrækker dens struktur eller data og genererer derefter SQL-scripts, som du kan indlæse i din PostgreSQL-database.

Omkostningsestimatet i en Oracle til PostgreSQL-migrering er ikke let.

Ora2Pg inspicerer alle databaseobjekter, alle funktioner og lagrede procedurer for at opdage, om der stadig er nogle objekter og PL/SQL-kode, som ikke automatisk kan konverteres af Ora2Pg.

Dette værktøj er meget nyttigt til følgende konverteringer:

  • Skemakonvertering
  • PLSQL til PLPGSQL konvertering

Test

Det er meget vigtigt at teste hele applikationen og den migrerede database, fordi nogle af funktionerne er de samme i begge databaser, men adfærden er forskellig.

  • Nogle almindelige scenarier skal kontrolleres:
    • Tjek, om alle objekterne er konverteret korrekt eller ej.
    • Tjek, om alle DMLS'er fungerer korrekt eller ej.
    • Indlæs nogle eksempeldata i begge databaser, og kontroller resultatet. Resultatet af SQL fra begge databaser bør være det samme.
    • Tjek DML'ens ydeevne, og forbedr den om nødvendigt.

  1. MySQL Vælg Top N rækker

  2. Tidlige registreringer åbner for PGDay.IT 2011

  3. postgresql databaseejer kan ikke få adgang til databasen - Ingen relationer fundet.

  4. Opdater erklæring med indre joinforbindelse på Oracle