PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Migracja z Oracle do PostgreSQL — co powinieneś wiedzieć

Niezależnie od tego, czy migrujesz bazę danych, czy aplikację z Oracle do PostgreSQL z tylko jednym rodzajem wiedzy o bazach danych, jest kilka rzeczy, które należy wiedzieć o różnicach między tymi dwoma systemami baz danych.

PostgreSQL to najbardziej zaawansowana na świecie baza danych typu open source. Społeczność PostgreSQL jest bardzo silna i stale ulepsza istniejące funkcje PostgreSQL, a także dodaje nowe. Zgodnie z db-engines.com, PostgreSQL jest DBMS roku 2017.

Istnieją pewne niezgodności w Oracle i PostgreSQL. Zachowanie niektórych funkcji jest inne w Oracle i PostgreSQL.

Dlaczego migrować z Oracle do PostgreSQL

  1. Koszt:Jak być może wiesz, koszt licencji Oracle jest bardzo wysoki, a niektóre funkcje, takie jak partycjonowanie i wysoka dostępność, wiążą się z dodatkowymi kosztami. Więc ogólnie jest to bardzo drogie.
  2. Elastyczne licencjonowanie open source i łatwa dostępność od dostawców chmury publicznej, takich jak AWS.
  3. Skorzystaj z dodatków typu open source, aby poprawić wydajność.

Wstępna kontrola

Jak zapewne wiesz, migracja z Oracle do PostgreSQL jest zadaniem kosztownym i czasochłonnym. Ważne jest, aby zrozumieć, którą część należy migrować. Nie trać czasu na migrację obiektów, które nie są już potrzebne. Sprawdź również, czy są wymagane jakieś dane historyczne, czy nie. Nie trać czasu na replikowanie danych, których nie potrzebujesz, na przykład danych kopii zapasowej i tabeli tymczasowej z poprzedniej konserwacji.

Ocena migracji

Po wstępnym sprawdzeniu, pierwszym krokiem migracji jest analiza aplikacji i obiektu bazy danych, znalezienie niezgodności między obiema bazami danych oraz oszacowanie czasu i kosztów wymaganych do migracji.

Narzędzie Ora2pg jest bardzo pomocne przy ocenie migracji. Łączy się z bazą danych Oracle, automatycznie ją skanuje i wyodrębnia dane, generując raport z migracji bazy danych. Możesz sprawdzić przykładowy raport w Ora2pg.

Co powinieneś wiedzieć

Poznaj różnice między Oracle i PostgreSQL i przekonwertuj je za pomocą dowolnego narzędzia. Nie ma żadnego narzędzia, które może przekonwertować bazę danych 100% Oracle na PostgreSQL, wymagane są pewne ręczne zmiany. Sprawdź poniżej niektóre z ważnych różnic, które powinieneś znać przed migracją.

Mapowanie typu danych

PostgreSQL posiada bogaty zestaw typów danych. Niektóre z ważnych konwersji typów danych między Oracle i PostgreSQL są następujące.

Oracle PostgreSQL Komentarz
VARCHAR2(n) VARCHAR(n) W Oracle „n” to liczba bajtów, podczas gdy w PostgreSQL „n” to liczba znaków
ZNAK(n) ZNAK(n) W Oracle „n” to liczba bajtów, podczas gdy w PostgreSQL „n” to liczba znaków
LICZBA(n,m) LICZBA(n,m) Typ NUMBER można przekonwertować na NUMERIC, ale jeśli użyjesz SMALLINT, INT i BIGINT, wydajność będzie lepsza.
NUMBER(4) MAŁY
NUMBER(9) INT
NUMBER(18) WIELKIE
NUMBER(n) NUMERYCZNE(n) LICZBA(n) ,Jeśli n>=19
DATA ZNACZNIK CZASOWY(0) Obie bazy danych mają typ DATE, ale typ Oracle DATE zwraca datę i godzinę, podczas gdy typ PostgreSQL DATE zwraca tylko datę bez czasu.
ZNACZNIK CZASOWY Z LOKALNĄ STREFĄ CZASOWĄ ZNACZNIK CZASU Typ czasu PostgreSQL Timestamptz (znacznik czasu ze strefą czasową) różni się od znacznika czasu Oracle ze strefą czasową. Jest to odpowiednik znacznika czasu Oracle z lokalną strefą czasową, ale ta niewielka różnica może powodować problemy z wydajnością lub błąd aplikacji.
CLOB TEKST Typ PostgreSQL TEXT może przechowywać do 1 GB tekstu.
BLOB
SUROWY(n)
BYTEA (limit 1 GB)
Duży obiekt
W Oracle typ danych BLOB przechowuje nieustrukturyzowane dane binarne w bazie danych. Typ BLOB może przechowywać do 128 terabajtów danych binarnych. PostgreSQL BYTEA przechowuje dane binarne, ale tylko do 1 GB. Jeśli dane przekraczają 1 GB, użyj dużego obiektu.

Transakcje

Baza danych Oracle zawsze korzysta z transakcji, ale w PostgreSQL musisz to aktywować. W Oracle transakcja rozpoczyna się po wykonaniu dowolnej instrukcji i kończy po wykonaniu instrukcji COMMIT. W PostgreSQL transakcja rozpoczyna się po wykonaniu BEGIN i kończy po wykonaniu instrukcji COMMIT. Nawet poziomy izolacji również nie stanowią problemu. Baza danych PostgreSQL zna wszystkie poziomy izolacji znane z bazy danych Oracle. Domyślnym poziomem izolacji PostgreSQL jest zatwierdzony odczyt.

Przykład:

Wyrocznia:

DELETE FROM table_name WHERE id = 120;
COMMIT;

PostgreSQL:

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

Podwójny stół

W Oracle FROM klauzula jest obowiązkowa dla każdej instrukcji SELECT, więc baza danych Oracle używa tabeli DUAL dla instrukcji SELECT, gdzie nazwa tabeli nie jest wymagana. W PostgreSQL klauzula FROM nie jest obowiązkowa, więc tabela DUAL nie jest konieczna. W PostgreSQL można utworzyć tabelę Dual w celu wyeliminowania problemu z portowaniem. Narzędzie Orafce zaimplementowało to, dzięki czemu możesz również używać Orafce.

Przykład:

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 zainstalowaniu modułu Orafce:

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

SYSDATE

Funkcja Oracle SYSDATE zwraca datę i godzinę. Zachowanie funkcji SYSDATE jest różne w różnych miejscach. PostgreSQL nie posiada żadnej funkcji odpowiadającej funkcji SYSDATE. W PostgreSQL istnieje wiele metod uzyskiwania daty i czasu i jest to oparte na celu aplikacji.

Metoda wyszukiwania czasu Funkcja do użycia
Czas uruchomienia SQL Statement_timestamp()
Czas rozpoczęcia transakcji teraz() lub

Znacznik_czasu transakcji()

Czas implementacji funkcji Clock_timestamp()

W poniższym przykładzie clock_timestamp() zwraca czas, w którym rzeczywista funkcja jest wykonywana, a inne statement_timestamp() zwracają czas, w którym instrukcja SQL rozpoczęła wykonywanie.

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

Funkcja Oracle TO_DATE zwraca wartość typu DATE (rok, miesiąc, dzień, godzina, minuta, sekunda), podczas gdy TO_DATE(dwa_argument) PostgreSQL zwraca wartość typu DATE (rok, miesiąc, dzień).

Rozwiązaniem tej niezgodności jest przekonwertowanie TO_DATE() na TO_TIMESTAMP(). Jeśli używasz narzędzia Orafce, nie musisz nic zmieniać, ponieważ Orafce zaimplementowało tę funkcję, dzięki czemu otrzymujemy ten sam wynik w Oracle.

Wyrocznia:

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

PostgreSQL:

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

SYNONIM

CREATE SYNONYM nie jest obsługiwane w PostgreSQL. W Oracle CREATE SYNONYM służy do uzyskiwania dostępu do zdalnych obiektów, podczas gdy w PostgreSQL możemy użyć SET search_path, aby uwzględnić zdalną definicję.

Wyrocznia:

CREATE SYNONYM abc.table_name FOR pqr.table_name;

PostgreSQL:

SET search_path TO 'abc.table_name';

Zachowanie pustego ciągu i NULL

W Oracle puste ciągi i wartości NULL w kontekście ciągów są takie same. Konkatenacja NULL i string daje w wyniku łańcuch. W PostgreSQL wynik konkatenacji jest w tym przypadku pusty. W Oracle IS NULL operator służy do sprawdzania, czy ciąg jest pusty, czy nie, ale w PostgreSQL wynik jest FALSE dla pustego ciągu i TRUE dla NULL.

Sekwencje

Istnieje niewielka różnica w składni sekwencji w Oracle i PostgreSQL.

Wyrocznia:

Sequence_name.nextval

PostgreSQL:

Nextval(‘sequence_name’)

Aby zmienić tę składnię, możesz utworzyć skrypt lub zmienić go ręcznie.

SUBSTR

Zachowanie funkcji SUBSTR w Oracle i PostgreSQL jest inne. Funkcja SUBSTR działa w PostgreSQL bez błędów, ale zwraca inny wynik. Ta różnica może powodować błędy aplikacji.

Wyrocznia:

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

PostgreSQL:

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

Rozwiązaniem jest użycie funkcji Orafce SUBSTR, która zwraca ten sam wynik, co Oracle w PostgreSQL.

DELETE oświadczenie

W Oracle instrukcja DELETE może działać bez klauzuli FROM, ale w PostgreSQL nie jest obsługiwana. Musimy ręcznie dodać klauzulę FROM w instrukcji PostgreSQL DELETE.

Wyrocznia:

DELETE table_name WHERE column_name = 'Col_value';

PostgreSQL:

DELETE FROM table_name WHERE column_name = 'Col_value';

Łącznik zewnętrzny +

Oracle używa operatora + do łączenia lewego i prawego, ale PostgreSQL go nie używa.

Wyrocznia:

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;

ROZPOCZNIJ OD..POŁĄCZ PRZEZ

Oracle używa START WITH..CONNECT BY do zapytań hierarchicznych. PostgreSQL nie obsługuje instrukcji START WITH..CONNECT BY. PostgreSQL ma WITH RECURSIVE dla zapytań hierarchicznych, więc przetłumacz instrukcję CONNECT BY na instrukcję WITH RECURSIVE.

Wyrocznia:

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;

Konwersja PLSQL do PLPGSQL

Język PL/pgSQL PostgreSQL jest pod wieloma względami podobny do języka PL/SQL Oracle. Jest to język o strukturze blokowej, imperatyw, a wszystkie zmienne muszą być zadeklarowane. W obu bazach danych przypisania, pętle i warunki są podobne.

Główne różnice, o których należy pamiętać podczas przenoszenia z Oracle PL/SQL na PL/pgSQL PostgreSQL

Pobierz oficjalny dokument już dziś Zarządzanie i automatyzacja PostgreSQL za pomocą ClusterControlDowiedz się, co musisz wiedzieć, aby wdrażać, monitorować, zarządzać i skalować PostgreSQLPobierz oficjalny dokument

Narzędzia migracji

Istnieje kilka narzędzi, które są bardzo pomocne przy migracji z Oracle do PostgreSQL. Możesz także stworzyć własne narzędzie jako rozszerzenie i używać go w PostgreSQL.

Orafa

Funkcje, typy danych i pakiety kompatybilne z Oracle mogą być używane tak jak w PostgreSQL. Jest to narzędzie typu open source z licencją BSD, więc każdy może z niego korzystać.

Większość głównych funkcji jest obsługiwana w Orafce.

Aplikacje zwykle używają tych funkcji w wielu wystąpieniach. Korzystając z tego narzędzia, możesz zmniejszyć koszt modyfikacji SQL.

Wszystkie funkcje i pakiety są poprawnie zaimplementowane i dobrze przetestowane.

Niektóre funkcje:

  • Dbms_output
  • dbms_losowo
  • utl_file – funkcje związane z systemem plików
  • Dbms_pipe i dbms_alert
  • PLVdate,PLVstr,PLVchr
  • Zgodny z Oracle typ danych DATE i funkcje, takie jak ADD_MONTHS, LAST_DAY, NEXT_DAY i tak dalej.
  • Funkcja NVL
  • Funkcja SUBSTR i SUBSTRB
  • Obsługa VARCHAR2 i NVARCHAR2
  • DO_DATA()

Ora2pg

Ora2Pg to darmowe narzędzie używane do migracji bazy danych Oracle do schematu kompatybilnego z PostgreSQL.

Łączy się z bazą danych Oracle, automatycznie ją skanuje, wyodrębnia jej strukturę lub dane, a następnie generuje skrypty SQL, które można załadować do bazy danych PostgreSQL.

Oszacowanie kosztów migracji z Oracle do PostgreSQL nie jest łatwe.

Ora2Pg sprawdza wszystkie obiekty bazy danych, wszystkie funkcje i procedury składowane, aby wykryć, czy nadal istnieją jakieś obiekty i kod PL/SQL, których nie można automatycznie przekonwertować przez Ora2Pg.

To narzędzie jest bardzo przydatne przy następujących konwersjach:

  • Konwersja schematu
  • Konwersja PLSQL do PLPGSQL

Testowanie

Testowanie całej aplikacji i zmigrowanej bazy danych jest bardzo ważne, ponieważ niektóre funkcje są takie same w obu bazach danych, jednak zachowanie jest inne.

  • Niektóre typowe scenariusze wymagają sprawdzenia:
    • Sprawdź, czy wszystkie obiekty są poprawnie przekonwertowane, czy nie.
    • Sprawdź, czy wszystkie DMLS działają poprawnie, czy nie.
    • Załaduj przykładowe dane do obu baz danych i sprawdź wynik. Wynik SQL z obu baz danych powinien być taki sam.
    • Sprawdź wydajność DML i popraw ją, jeśli to konieczne.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przegląd metod JOIN w PostgreSQL

  2. Postgresql wybierz aż do osiągnięcia określonej łącznej kwoty

  3. pg gem '0.14.0' w Mountain Lion nie działa

  4. Jak przeprowadzić audyt bazy danych PostgreSQL

  5. Wiele generatorów sekwencji Hibernate dla jednej jednostki z PostgreSQL