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
- 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.
- Fleksibel open source-licensering og nem tilgængelighed fra offentlige cloud-udbydere som AWS.
- 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 WhitepaperMigreringsvæ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.