PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Migration von Oracle zu PostgreSQL – was Sie wissen sollten

Unabhängig davon, ob Sie eine Datenbank oder eine Anwendung von Oracle auf PostgreSQL mit nur einer Art von Datenbankkenntnissen migrieren, gibt es nur wenige Dinge, die Sie über die Unterschiede zwischen den beiden Datenbanksystemen wissen sollten.

PostgreSQL ist die weltweit fortschrittlichste Open-Source-Datenbank. Die PostgreSQL-Community ist sehr stark und sie verbessert kontinuierlich bestehende PostgreSQL-Funktionen und fügt auch neue Funktionen hinzu. Laut db-engines.com ist PostgreSQL das DBMS des Jahres 2017.

Es gibt einige Inkompatibilitäten in Oracle und PostgreSQL. Das Verhalten einiger Funktionen unterscheidet sich zwischen Oracle und PostgreSQL.

Warum von Oracle zu PostgreSQL migrieren

  1. Kosten:Wie Sie vielleicht wissen, sind die Lizenzkosten für Oracle sehr hoch und es fallen zusätzliche Kosten für einige Funktionen wie Partitionierung und Hochverfügbarkeit an. Insgesamt also sehr teuer.
  2. Flexible Open-Source-Lizenzierung und einfache Verfügbarkeit von öffentlichen Cloud-Anbietern wie AWS.
  3. Profitieren Sie von Open-Source-Add-ons, um die Leistung zu verbessern.

Vorprüfung

Wie Sie vielleicht wissen, ist die Migration von Oracle zu PostgreSQL eine kostspielige und zeitaufwändige Aufgabe. Es ist wichtig zu verstehen, welcher Teil migriert werden soll. Verschwenden Sie keine Zeit mit der Migration nicht mehr benötigter Objekte. Überprüfen Sie auch, ob historische Daten erforderlich sind oder nicht. Verschwenden Sie keine Zeit damit, Daten zu replizieren, die Sie nicht benötigen, z. B. Sicherungsdaten und temporäre Tabellen aus vergangenen Wartungsarbeiten.

Migrationsbewertung

Nach einer vorläufigen Prüfung besteht der erste Schritt der Migration darin, die Anwendung und das Datenbankobjekt zu analysieren, die Inkompatibilitäten zwischen den beiden Datenbanken herauszufinden und den Zeit- und Kostenaufwand für die Migration abzuschätzen.

Das Ora2pg-Tool ist sehr hilfreich für die Migrationsbewertung. Es stellt eine Verbindung zur Oracle-Datenbank her, scannt sie automatisch und extrahiert die Daten, wodurch der Datenbankmigrationsbericht erstellt wird. Sie können einen Beispielbericht in Ora2pg einsehen.

Was Sie wissen sollten

Verstehen Sie die Unterschiede zwischen Oracle und PostgreSQL und konvertieren Sie es mit einem beliebigen Tool. Es gibt kein Tool, das eine 100%ige Oracle-Datenbank in PostgreSQL konvertieren kann, einige manuelle Änderungen sind erforderlich. Bitte überprüfen Sie unten einige der wichtigen Unterschiede, die Sie vor der Migration kennen sollten.

Datentypzuordnung

PostgreSQL verfügt über eine Vielzahl von Datentypen. Einige der wichtigen Datentypkonvertierungen zwischen Oracle und PostgreSQL sind wie folgt.

Der
Oracle PostgreSQL Kommentar
VARCHAR2(n) VARCHAR(n) In Oracle ist „n“ die Anzahl der Bytes, während in PostgreSQL „n“ die Anzahl der Zeichen ist
CHAR(n) CHAR(n) In Oracle ist „n“ die Anzahl der Bytes, während in PostgreSQL „n“ die Anzahl der Zeichen ist
ZAHL(n,m) NUMERIC(n,m)NUMBER-Typ kann in NUMERIC konvertiert werden, aber wenn Sie SMALLINT, INT und BIGINT verwenden, wäre die Leistung besser.
ZAHL(4) SMALLINT
ZAHL(9) INT
NUMMER(18) GROSS
ZAHL(n) ZAHL(n) NUMERIC(n) ,Wenn n>=19
DATUM TIMESTAMP(0) Beide Datenbanken haben den DATE-Typ, aber der Oracle-DATE-Typ gibt Datum und Uhrzeit zurück, während der PostgreSQL-DATE-Typ nur Datum und keine Uhrzeit zurückgibt.
ZEITSTEMPEL MIT LOKALER ZEITZONE TIMESTAMPTZ Der PostgreSQL-Typ Timestamptz (Timestamp with time zone) unterscheidet sich vom Oracle Timestamp with time zone. Es entspricht dem Zeitstempel von Oracle mit lokaler Zeitzone, aber dieser kleine Unterschied kann zu Leistungsproblemen oder Anwendungsfehlern führen.
CLOB TEXT Der PostgreSQL TEXT-Typ kann bis zu 1 GB Text speichern.
BLOB
RAW(n)
BYTEA(1 GB-Grenze)
Großes Objekt
In Oracle speichert der BLOB-Datentyp unstrukturierte Binärdaten in der Datenbank. Der BLOB-Typ kann bis zu 128 Terabyte an Binärdaten speichern. PostgreSQL BYTEA speichert Binärdaten, aber nur bis zu 1 GB. Wenn die Daten größer als 1 GB sind, verwenden Sie ein großes Objekt.

Transaktionen

Die Oracle-Datenbank verwendet immer Transaktionen, aber in PostgreSQL müssen Sie das aktivieren. In Oracle beginnt die Transaktion, wenn eine beliebige Anweisung ausgeführt wird, und endet, wenn die COMMIT-Anweisung ausgeführt wird. In PostgreSQL beginnt die Transaktion, wenn BEGIN ausgeführt wird, und endet, wenn die COMMIT-Anweisung ausgeführt wird. Auch die Isolationsstufen haben kein Problem. Die PostgreSQL-Datenbank kennt alle Isolationsstufen, die die Oracle-Datenbank kennt. Die Standard-Isolationsstufe von PostgreSQL ist Read committed.

Beispiel:

Orakel:

DELETE FROM table_name WHERE id = 120;
COMMIT;

PostgreSQL:

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

Dualer Tisch

In Oracle ist die FROM-Klausel für jede SELECT-Anweisung obligatorisch, sodass die Oracle-Datenbank die DUAL-Tabelle für die SELECT-Anweisung verwendet, bei der der Tabellenname nicht erforderlich ist. In PostgreSQL ist die FROM-Klausel nicht obligatorisch, sodass die DUAL-Tabelle nicht erforderlich ist. Die Dual-Tabelle kann in PostgreSQL als Ansicht erstellt werden, um das Portierungsproblem zu beseitigen. Das Orafce-Tool hat dies implementiert, sodass Sie auch Orafce verwenden können.

Beispiel:

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)

Nach der Installation des Orafce-Moduls:

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

SYSDATUM

Die SYSDATE-Funktion von Oracle gibt Datum und Uhrzeit zurück. Das Verhalten der SYSDATE-Funktion ist an verschiedenen Stellen unterschiedlich. PostgreSQL hat keine Funktion, die der SYSDATE-Funktion entspricht. In PostgreSQL gibt es mehrere Methoden, um Datum und Uhrzeit abzurufen, und dies hängt vom Anwendungszweck ab.

Zeitabrufmethode Zu verwendende Funktion
SQL-Startzeit Statement_timestamp()
Startzeit der Transaktion jetzt() oder

Transaction_timestamp()

Zeitpunkt der Implementierung der Funktion Clock_timestamp()

Im Beispiel unten gibt clock_timestamp() die Zeit zurück, zu der die tatsächliche Funktion ausgeführt wird, und other statement_timestamp() gibt die Zeit zurück, zu der die Ausführung der SQL-Anweisung begonnen hat.

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(zwei Argumente)

Die Funktion TO_DATE von Oracle gibt den Wert DATE (Jahr, Monat, Tag, Stunde, Minute, Sekunde) zurück, während die Funktion TO_DATE(two_argument) von PostgreSQL den Wert DATE (Jahr, Monat, Tag) zurückgibt.

Die Lösung für diese Inkompatibilität besteht darin, TO_DATE() in TO_TIMESTAMP() umzuwandeln. Wenn Sie das Orafce-Tool verwenden, müssen Sie nichts ändern, da Orafce diese Funktion implementiert hat, sodass wir dasselbe Ergebnis wie Oracle erhalten.

Orakel:

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

PostgreSQL:

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

SYNONYM

CREATE SYNONYM wird in PostgreSQL nicht unterstützt. In Oracle wird CREATE SYNONYM verwendet, um auf Remote-Objekte zuzugreifen, während wir in PostgreSQL SET search_path verwenden können, um die Remote-Definition einzuschließen.

Orakel:

CREATE SYNONYM abc.table_name FOR pqr.table_name;

PostgreSQL:

SET search_path TO 'abc.table_name';

Verhalten von leerem String und NULL

In Oracle sind leere Zeichenfolgen und NULL-Werte im Zeichenfolgenkontext gleich. Die Verkettung von NULL und String ergibt als Ergebnis einen String. In PostgreSQL ist das Verkettungsergebnis in diesem Fall null. In Oracle wird der IS NULL-Operator verwendet, um zu prüfen, ob der String leer ist oder nicht, aber in PostgreSQL ist das Ergebnis FALSE für einen leeren String und TRUE für NULL.

Sequenzen

Es gibt einen kleinen Unterschied in der Syntax von sequence in Oracle und PostgreSQL.

Orakel:

Sequence_name.nextval

PostgreSQL:

Nextval(‘sequence_name’)

Um diese Syntax zu ändern, können Sie ein Skript erstellen oder sie manuell ändern.

SUBSTR

Das Verhalten der SUBSTR-Funktion in Oracle und PostgreSQL ist unterschiedlich. Die SUBSTR-Funktion funktioniert in PostgreSQL ohne Fehler, gibt aber ein anderes Ergebnis zurück. Dieser Unterschied kann Anwendungsfehler verursachen.

Orakel:

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

PostgreSQL:

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

Die Lösung hierfür ist die Verwendung der Orafce SUBSTR-Funktion, die das gleiche Ergebnis wie Oracle in PostgreSQL zurückgibt.

DELETE-Anweisung

In Oracle kann die DELETE-Anweisung ohne FROM-Klausel funktionieren, in PostgreSQL wird sie jedoch nicht unterstützt. Wir müssen die FROM-Klausel in der PostgreSQL DELETE-Anweisung manuell hinzufügen.

Orakel:

DELETE table_name WHERE column_name = 'Col_value';

PostgreSQL:

DELETE FROM table_name WHERE column_name = 'Col_value';

Externe Kupplung +

Oracle verwendet den +-Operator für linke und rechte Verknüpfung, aber PostgreSQL verwendet ihn nicht.

Orakel:

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;

BEGINN MIT..VERBINDEN DURCH

Oracle verwendet START WITH..CONNECT BY für hierarchische Abfragen. PostgreSQL unterstützt keine START WITH..CONNECT BY-Anweisung. PostgreSQL hat WITH RECURSIVE für hierarchische Abfragen, also übersetzen Sie die CONNECT BY-Anweisung in die WITH RECURSIVE-Anweisung.

Orakel:

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-zu-PLPGSQL-Konvertierung

Die PL/pgSQL-Sprache von PostgreSQL ähnelt in vielen Aspekten der PL/SQL-Sprache von Oracle. Es ist eine blockstrukturierte, imperative Sprache, und alle Variablen müssen deklariert werden. In beiden Datenbanken sind Zuweisungen, Schleifen und Bedingungen ähnlich.

Die Hauptunterschiede, die Sie bei der Portierung von PL/SQL von Oracle zu PL/pgSQL von PostgreSQL beachten sollten

Laden Sie noch heute das Whitepaper PostgreSQL-Verwaltung und -Automatisierung mit ClusterControl herunterErfahren Sie, was Sie wissen müssen, um PostgreSQL bereitzustellen, zu überwachen, zu verwalten und zu skalierenLaden Sie das Whitepaper herunter

Migrationstools

Es gibt einige Tools, die für eine Migration von Oracle nach PostgreSQL sehr hilfreich sind. Sie können auch Ihr eigenes Tool als Erweiterung erstellen und innerhalb von PostgreSQL verwenden.

Orafce

Oracle-kompatible Funktionen, Datentypen und Pakete können wie in PostgreSQL verwendet werden. Dies ist ein Open-Source-Tool mit BSD-Lizenz, sodass jeder dieses Tool verwenden kann.

Die meisten Hauptfunktionen werden in Orafce abgedeckt.

Anwendungen verwenden diese Funktionen normalerweise mit mehreren Vorkommen. Mit diesem Tool können Sie die Änderungskosten von SQL reduzieren.

Alle Funktionen und Pakete sind korrekt implementiert und gut getestet.

Einige der Funktionen:

  • Dbms_output
  • dbms_random
  • utl_file – dateisystembezogene Funktionen
  • Dbms_pipe und dbms_alert
  • PLVdate,PLVstr, PLVchr
  • Oracle-kompatibler DATE-Datentyp und Funktionen wie ADD_MONTHS, LAST_DAY, NEXT_DAY und so weiter.
  • NVL-Funktion
  • SUBSTR- und SUBSTRB-Funktion
  • VARCHAR2- und NVARCHAR2-Unterstützung
  • TO_DATE()

Ora2pg

Ora2Pg ist ein kostenloses Tool zum Migrieren einer Oracle-Datenbank in ein PostgreSQL-kompatibles Schema.

Es verbindet sich mit der Oracle-Datenbank, scannt sie automatisch, extrahiert ihre Struktur oder Daten und generiert dann SQL-Skripte, die Sie in Ihre PostgreSQL-Datenbank laden können.

Die Kostenschätzung bei einer Migration von Oracle zu PostgreSQL ist nicht einfach.

Ora2Pg untersucht alle Datenbankobjekte, alle Funktionen und gespeicherten Prozeduren, um festzustellen, ob es noch einige Objekte und PL/SQL-Code gibt, die nicht automatisch von Ora2Pg konvertiert werden können.

Dieses Tool ist sehr hilfreich für die folgenden Konvertierungen:

  • Schemakonvertierung
  • PLSQL-zu-PLPGSQL-Konvertierung

Testen

Das Testen der gesamten Anwendung und der migrierten Datenbank ist sehr wichtig, da einige der Funktionen in beiden Datenbanken gleich sind, das Verhalten jedoch unterschiedlich ist.

  • Einige allgemeine Szenarien müssen überprüft werden:
    • Überprüfen Sie, ob alle Objekte korrekt konvertiert wurden oder nicht.
    • Überprüfen Sie, ob alle DMLS korrekt funktionieren oder nicht.
    • Laden Sie einige Beispieldaten in beide Datenbanken und überprüfen Sie das Ergebnis. Das Ergebnis von SQL aus beiden Datenbanken sollte gleich sein.
    • Überprüfen Sie die Leistung der DML und verbessern Sie sie gegebenenfalls.