sql >> Databáze >  >> RDS >> PostgreSQL

Migrace z Oracle na PostgreSQL – co byste měli vědět

Ať už jde o migraci databáze nebo aplikace z Oracle na PostgreSQL s pouze jedním typem znalostí databáze, existuje jen málo věcí, které byste měli vědět o rozdílech mezi těmito dvěma databázovými systémy.

PostgreSQL je nejpokročilejší open source databáze na světě. PostgreSQL komunita je velmi silná a neustále vylepšuje stávající funkce PostgreSQL a také přidává nové funkce. Podle db-engines.com je PostgreSQL DBMS roku 2017.

V Oracle a PostgreSQL jsou určité nekompatibility. Chování některých funkcí se mezi Oracle a PostgreSQL liší.

Proč migrovat z Oracle na PostgreSQL

  1. Cena:Jak možná víte, cena licence Oracle je velmi drahá a některé funkce, jako je dělení a vysoká dostupnost, jsou navíc náklady. Celkově je to tedy velmi drahé.
  2. Flexibilní licencování open source a snadná dostupnost od poskytovatelů veřejného cloudu, jako je AWS.
  3. Využijte výhody open source doplňků ke zlepšení výkonu.

Předběžná kontrola

Jak možná víte, migrace z Oracle na PostgreSQL je nákladný a časově náročný úkol. Je důležité pochopit, která část má migrovat. Neztrácejte čas migrací objektů, které již nejsou potřeba. Zkontrolujte také, zda jsou vyžadována historická data. Neztrácejte čas replikováním dat, která nepotřebujete, například zálohovaných dat a dočasné tabulky z minulé údržby.

Posouzení migrace

Po předběžné kontrole je prvním krokem migrace analýza aplikace a databázového objektu, zjištění nekompatibility mezi oběma databázemi a odhad času a nákladů na migraci.

Nástroj Ora2pg je velmi užitečný pro hodnocení migrace. Připojí se k databázi Oracle, automaticky ji naskenuje a extrahuje data a vygeneruje zprávu o migraci databáze. Vzorovou zprávu si můžete prohlédnout na Ora2pg.

Co byste měli vědět

Pochopte rozdíly mezi Oracle a PostgreSQL a převeďte je pomocí jakéhokoli nástroje. Neexistuje žádný nástroj, který by dokázal převést 100% databázi Oracle na PostgreSQL, jsou vyžadovány některé ruční změny. Níže prosím zkontrolujte některé důležité rozdíly, které byste před migrací měli znát.

Mapování datových typů

PostgreSQL má bohatou sadu datových typů. Některé z důležitých konverzí datových typů mezi Oracle a PostgreSQL jsou následující.

Oracle PostgreSQL Komentář
VARCHAR2(n) VARCHAR(n) V Oracle je ‚n‘ počet bajtů, zatímco v PostgreSQL ‚n‘ je počet znaků
CHAR(n) CHAR(n) V Oracle je ‚n‘ počet bajtů, zatímco v PostgreSQL ‚n‘ je počet znaků
NUMBER(n,m) NUMERIC(n,m) Typ NUMBER lze převést na NUMERIC, ale pokud použijete SMALLINT, INT a BIGINT, výkon bude lepší.
ČÍSLO(4) SMALLINT
NUMBER(9) INT
ČÍSLO(18) VELKÝ
NUMBER(n) NUMERIC(n) NUMERIC(n) ,Pokud n>=19
DATUM TIMESTAMP(0) Obě databáze mají typ DATE, ale typ Oracle DATE vrací datum a čas, zatímco typ PostgreSQL DATE vrací pouze datum a čas.
ČASOVÉ RAZÍTKO S MÍSTNÍM ČASOVÝM PÁSMEM TIMESTAMPTZ Typ PostgreSQL Timestamptz (Timestamp with time zone) se liší od Oracle Timestamp s časovou zónou. Je ekvivalentní časovému razítku Oracle s místním časovým pásmem, ale tento malý rozdíl může způsobit problém s výkonem nebo chybu aplikace.
CLOB TEXT Typ TEXT PostgreSQL může uložit až 1 GB textu.
BLOB
RAW(n)
BYTEA (limit 1 GB)
Velký objekt
V Oracle ukládá datový typ BLOB nestrukturovaná binární data v databázi. Typ BLOB může uložit až 128 terabajtů binárních dat. PostgreSQL BYTEA ukládá binární data, ale pouze do 1 GB. Pokud jsou data větší než 1 GB, použijte Velký objekt.

Transakce

Databáze Oracle vždy používá transakce, ale v PostgreSQL je musíte aktivovat. V Oracle transakce začíná provedením libovolného příkazu a končí provedením příkazu COMMIT. V PostgreSQL transakce začíná při provedení BEGIN a končí při provedení příkazu COMMIT. Dokonce ani úrovně izolace nemají žádný problém. Databáze PostgreSQL zná všechny úrovně izolace, které zná databáze Oracle. Výchozí úroveň izolace PostgreSQL je potvrzeno čtením.

Příklad:

Oracle:

DELETE FROM table_name WHERE id = 120;
COMMIT;

PostgreSQL:

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

Duální stůl

V Oracle je klauzule FROM povinná pro každý příkaz SELECT, takže databáze Oracle používá DUAL tabulku pro příkaz SELECT, kde není vyžadován název tabulky. V PostgreSQL není klauzule FROM povinná, takže DUAL tabulka není nutná. Duální tabulku lze vytvořit v PostgreSQL jako pohled k odstranění problému s portováním. Nástroj Orafce to implementoval, takže můžete používat také Orafce.

Příklad:

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)

Po instalaci modulu Orafce:

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

SYSDATE

Funkce SYSDATE společnosti Oracle vrací datum a čas. Chování funkce SYSDATE se na různých místech liší. PostgreSQL nemá žádnou funkci odpovídající funkci SYSDATE. V PostgreSQL existuje několik metod, jak získat datum a čas, a to je založeno na účelu aplikace.

Metoda získávání času Funkce k použití
Čas spuštění SQL Statement_timestamp()
Čas zahájení transakce nyní() nebo

Transaction_timestamp()

Čas, kdy je funkce implementována Clock_timestamp()

V níže uvedeném příkladu clock_timestamp() vrací čas, kdy je skutečná funkce vykonána, a další statement_timestamp() vrací čas, kdy SQL příkaz zahájil své provádění.

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(dva argumenty)

Funkce TO_DATE společnosti Oracle vrací hodnotu typu DATE (rok, měsíc, den, hodina, minuta, sekunda), zatímco funkce TO_DATE(two_argument) PostgreSQL vrací hodnotu typu DATE (rok, měsíc, den).

Řešením této nekompatibility je převod TO_DATE() na TO_TIMESTAMP(). Pokud používáte nástroj Orafce, není nutné nic měnit, protože Orafce implementoval tuto funkci, takže máme stejný výsledek jako Oracle.

Oracle:

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

PostgreSQL:

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

SYNONYM

CREATE SYNONYM není v PostgreSQL podporováno. V Oracle CREATE SYNONYM se používá pro přístup ke vzdáleným objektům, zatímco v PostgreSQL můžeme použít SET search_path k zahrnutí vzdálené definice.

Oracle:

CREATE SYNONYM abc.table_name FOR pqr.table_name;

PostgreSQL:

SET search_path TO 'abc.table_name';

Chování prázdného řetězce a NULL

V Oracle jsou prázdné řetězce a hodnoty NULL v kontextu řetězce stejné. Výsledkem zřetězení NULL a řetězce je získání řetězce. V PostgreSQL je v tomto případě výsledek zřetězení null. V Oracle IS NULL se operátor používá ke kontrole, zda je řetězec prázdný nebo ne, ale v PostgreSQL je výsledek FALSE pro prázdný řetězec a TRUE pro NULL.

Sekvence

Existuje malý rozdíl v syntaxi sekvence v Oracle a PostgreSQL.

Oracle:

Sequence_name.nextval

PostgreSQL:

Nextval(‘sequence_name’)

Chcete-li změnit tuto syntaxi, můžete vytvořit skript nebo jej můžete změnit ručně.

SUBSTR

Chování funkce SUBSTR v Oracle a PostgreSQL je odlišné. Funkce SUBSTR funguje v PostgreSQL bez chyby, ale vrací jiný výsledek. Tento rozdíl může způsobit chyby aplikace.

Oracle:

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

PostgreSQL:

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

Řešením je použití funkce Orafce SUBSTR, která vrací stejný výsledek jako Oracle v PostgreSQL.

DELETE Statement

V Oracle může příkaz DELETE fungovat bez klauzule FROM, ale v PostgreSQL není podporován. Potřebujeme přidat klauzuli FROM do příkazu PostgreSQL DELETE ručně.

Oracle:

DELETE table_name WHERE column_name = 'Col_value';

PostgreSQL:

DELETE FROM table_name WHERE column_name = 'Col_value';

Externí spojka +

Oracle používá operátor + pro levé a pravé spojení, ale PostgreSQL jej nepoužívá.

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;

ZAČNĚTE S..CONNECT BY

Oracle používá START WITH..CONNECT BY pro hierarchické dotazy. PostgreSQL nepodporuje příkaz START WITH..CONNECT BY. PostgreSQL má WITH RECURSIVE pro hierarchické dotazy, takže přeložte příkaz CONNECT BY na příkaz WITH RECURSIVE.

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;

Konverze PLSQL na PLPGSQL

Jazyk PL/pgSQL PostgreSQL je v mnoha ohledech podobný jazyku PL/SQL od Oracle. Je to imperativní jazyk s blokovou strukturou a všechny proměnné musí být deklarovány. V obou databázích jsou přiřazení, smyčky a podmínky podobné.

Hlavní rozdíly, které byste měli mít na paměti při portování z PL/SQL od Oracle na PL/pgSQL PostgreSQL

Stáhněte si Whitepaper Today Správa a automatizace PostgreSQL s ClusterControlZjistěte, co potřebujete vědět k nasazení, monitorování, správě a škálování PostgreSQLStáhněte si Whitepaper

Nástroje pro migraci

Existuje několik nástrojů, které jsou velmi užitečné pro migraci Oracle na PostgreSQL. Můžete si také vytvořit svůj vlastní nástroj jako rozšíření a používat jej v PostgreSQL.

Orafce

Oracle kompatibilní funkce, datový typ a balíčky lze používat stejně jako v PostgreSQL. Toto je open source nástroj s licencí BSD, takže tento nástroj může používat kdokoli.

Většina hlavních funkcí je pokryta v Orafce.

Aplikace obvykle používají tyto funkce s více výskyty. Pomocí tohoto nástroje můžete snížit náklady na úpravy SQL.

Všechny funkce a balíčky jsou implementovány správně a je to dobře otestováno.

Některé z funkcí:

  • Dbms_output
  • dbms_random
  • utl_file – funkce související se souborovým systémem
  • Dbms_pipe a dbms_alert
  • PLVdate,PLVstr, PLVchr
  • Datový typ a funkce DATE kompatibilní s Oracle, jako ADD_MONTHS, LAST_DAY, NEXT_DAY a tak dále.
  • Funkce NVL
  • Funkce SUBSTR a SUBSTRB
  • Podpora VARCHAR2 a NVARCHAR2
  • TO_DATE()

Ora2pg

Ora2Pg je bezplatný nástroj používaný k migraci databáze Oracle na schéma kompatibilní s PostgreSQL.

Připojí se k databázi Oracle, automaticky ji naskenuje, extrahuje její strukturu nebo data a poté vygeneruje SQL skripty, které můžete načíst do své databáze PostgreSQL.

Odhad nákladů při migraci Oracle na PostgreSQL není snadný.

Ora2Pg kontroluje všechny databázové objekty, všechny funkce a uložené procedury, aby zjistil, zda stále existují nějaké objekty a PL/SQL kód, které nelze automaticky převést pomocí Ora2Pg.

Tento nástroj je velmi užitečný pro následující převody:

  • Konverze schématu
  • Konverze PLSQL na PLPGSQL

Testování

Testování celé aplikace a migrované databáze je velmi důležité, protože některé funkce jsou v obou databázích stejné, ale chování se liší.

  • Některé běžné scénáře je třeba zkontrolovat:
    • Zkontrolujte, zda jsou všechny objekty správně převedeny nebo ne.
    • Zkontrolujte, zda všechny DMLS fungují správně nebo ne.
    • Načtěte ukázková data do obou databází a zkontrolujte výsledek. Výsledek SQL z obou databází by měl být stejný.
    • Zkontrolujte výkon DML a v případě potřeby jej vylepšete.

  1. Začínáme s Shareplexem ve Windows na AWS, část 2

  2. SQL Server Interní:Plán Caching Pt. I – Plány opětovného použití

  3. Jak uvolnit tabulku v PostgreSQL

  4. Jak velký dopad může mít výběr datového typu?