Migrieren Sie virtuell generierte Spalten von Oracle nach PostgreSQL - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Migrieren Sie virtuell generierte Spalten von Oracle nach PostgreSQL

Erstellt von Veeranjaneyulu Grandhi (AWS), Rajesh Madiwale (AWS) und Ramesh Pathuri (AWS)

Umgebung: Produktion

Quelle: Oracle-Datenbank

Ziel: Amazon RDS for PostgreSQL oder Aurora PostgreSQL-kompatibel

R-Typ: Re-Architect

Arbeitslast: Oracle

Technologien: Migration; Datenbanken

AWS-Dienste: Amazon Aurora; Amazon RDS; AWS DMS

Übersicht

In Version 11 und früher bietet PostgreSQL keine Funktion, die direkt einer virtuellen Oracle-Spalte entspricht. Der Umgang mit virtuell generierten Spalten bei der Migration von Oracle Database zu PostgreSQL Version 11 oder früher ist aus zwei Gründen schwierig: 

  • Virtuelle Spalten sind während der Migration nicht sichtbar.

  • PostgreSQL unterstützt den generate Ausdruck vor Version 12 nicht.

Es gibt jedoch Problemumgehungen, um ähnliche Funktionen zu emulieren. Wenn Sie AWS Database Migration Service (AWS DMS) verwenden, um Daten von Oracle Database zu PostgreSQL Version 11 und früher zu migrieren, können Sie Triggerfunktionen verwenden, um die Werte in virtuell generierten Spalten aufzufüllen. Dieses Muster enthält Beispiele für Oracle-Datenbank- und PostgreSQL-Code, den Sie für diesen Zweck verwenden können. Auf AWS können Sie Amazon Relational Database Service (Amazon RDS) für PostgreSQL oder Amazon Aurora PostgreSQL-Compatible Edition für Ihre PostgreSQL-Datenbank verwenden.

Ab PostgreSQL Version 12 werden generierte Spalten unterstützt. Generierte Spalten können entweder spontan aus anderen Spaltenwerten berechnet oder berechnet und gespeichert werden. Von PostgreSQL generierte Spalten ähneln virtuellen Oracle-Spalten.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktives AWS-Konto

  • Eine Oracle-Quelldatenbank

  • PostgreSQL-Zieldatenbanken (auf Amazon RDS für PostgreSQL oder Aurora PostgreSQL-kompatibel)

  • Erfahrung in der PL/PgSQL-Codierung

Einschränkungen

  • Gilt nur für PostgreSQL-Versionen vor Version 12. 

  • Gilt für Oracle Database Version 11g oder höher.

  • Virtuelle Spalten werden in Datenmigrationstools nicht unterstützt.

  • Gilt nur für Spalten, die in derselben Tabelle definiert sind.

  • Wenn sich eine virtuell generierte Spalte auf eine deterministische benutzerdefinierte Funktion bezieht, kann sie nicht als Partitionierungsschlüsselspalte verwendet werden.

  • Die Ausgabe des Ausdrucks muss ein Skalarwert sein. Es kann keinen von Oracle angegebenen Datentyp, einen benutzerdefinierten Typ, oder zurückgeben. LOB LONG RAW

  • Indizes, die für virtuelle Spalten definiert sind, entsprechen funktionsbasierten Indizes in PostgreSQL.

  • Tabellenstatistiken müssen gesammelt werden.

Tools

  • pgAdmin 4 ist ein Open-Source-Verwaltungstool für PostgreSQL. Dieses Tool bietet eine grafische Oberfläche, die die Erstellung, Wartung und Verwendung von Datenbankobjekten vereinfacht.

  • Oracle SQL Developer ist eine kostenlose, integrierte Entwicklungsumgebung für die Arbeit mit SQL in Oracle-Datenbanken sowohl in herkömmlichen als auch in Cloud-Umgebungen. 

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine Oracle-Datenbankquelltabelle.

Erstellen Sie in Oracle Database eine Tabelle mit virtuell generierten Spalten, indem Sie die folgende Anweisung verwenden.

CREATE TABLE test.generated_column ( CODE NUMBER, STATUS VARCHAR2(12) DEFAULT 'PreOpen', FLAG CHAR(1) GENERATED ALWAYS AS (CASE UPPER(STATUS) WHEN 'OPEN' THEN 'N' ELSE 'Y' END) VIRTUAL VISIBLE );

In dieser Quelltabelle werden die Daten in der STATUS Spalte über AWS DMS in die Zieldatenbank migriert. Die FLAG Spalte wird jedoch mithilfe von generate by Funktionen gefüllt, sodass diese Spalte für AWS DMS während der Migration nicht sichtbar ist. Um die Funktionalität von zu implementierengenerated by, müssen Sie Trigger und Funktionen in der Zieldatenbank verwenden, um die Werte in der FLAG Spalte aufzufüllen, wie im nächsten Epic gezeigt.

DBA, App-Entwickler

Erstellen Sie eine PostgreSQL-Zieltabelle auf AWS.

Erstellen Sie mithilfe der folgenden Anweisung eine PostgreSQL-Tabelle auf AWS.

CREATE TABLE test.generated_column ( code integer not null, status character varying(12) not null , flag character(1) );

In dieser Tabelle ist die status Spalte eine Standardspalte. Bei der flag Spalte handelt es sich um eine generierte Spalte, die auf den Daten in der status Spalte basiert.

DBA, App-Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie einen PostgreSQL-Trigger.

Erstellen Sie in PostgreSQL einen Trigger.

CREATE TRIGGER tgr_gen_column AFTER INSERT OR UPDATE OF status ON test.generated_column FOR EACH ROW EXECUTE FUNCTION test.tgf_gen_column();
DBA, App-Entwickler

Erstellen Sie eine PostgreSQL-Triggerfunktion.

Erstellen Sie in PostgreSQL eine Funktion für den Trigger. Diese Funktion füllt eine virtuelle Spalte, die von der Anwendung oder AWS DMS eingefügt oder aktualisiert wird, und validiert die Daten.

CREATE OR REPLACE FUNCTION test.tgf_gen_column() RETURNS trigger AS $VIRTUAL_COL$ BEGIN IF (TG_OP = 'INSERT') THEN IF (NEW.flag IS NOT NULL) THEN RAISE EXCEPTION 'ERROR: cannot insert into column "flag"' USING DETAIL = 'Column "flag" is a generated column.'; END IF; END IF; IF (TG_OP = 'UPDATE') THEN IF (NEW.flag::VARCHAR != OLD.flag::varchar) THEN RAISE EXCEPTION 'ERROR: cannot update column "flag"' USING DETAIL = 'Column "flag" is a generated column.'; END IF; END IF; IF TG_OP IN ('INSERT','UPDATE') THEN IF (old.flag is NULL) OR (coalesce(old.status,'') != coalesce(new.status,'')) THEN UPDATE test.generated_column SET flag = (CASE UPPER(status) WHEN 'OPEN' THEN 'N' ELSE 'Y' END) WHERE code = new.code; END IF; END IF; RETURN NEW; END $VIRTUAL_COL$ LANGUAGE plpgsql;
DBA, App-Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine Replikationsinstanz.

Folgen Sie den Anweisungen in der AWS DMS-Dokumentation, um eine Replikationsinstanz zu erstellen. Die Replikationsinstanz sollte sich in derselben Virtual Private Cloud (VPC) wie Ihre Quell- und Zieldatenbanken befinden.

DBA, App-Entwickler

Erstellen Sie Quell- und Zielendpunkte.

Folgen Sie den Anweisungen in der AWS DMS-Dokumentation, um die Endpoints zu erstellen.

DBA, App-Entwickler

Testen Sie die Endpunktverbindungen.

Sie können die Endpunktverbindungen testen, indem Sie die VPC und die Replikationsinstanz angeben und Test ausführen wählen.

DBA, App-Entwickler

Erstellen und starten Sie eine Vollladeaufgabe.

Anweisungen finden Sie in der AWS DMS-Dokumentation unter Aufgaben erstellen und Aufgabeneinstellungen unter Vollladen.

DBA, App-Entwickler

Überprüfen Sie die Daten für die virtuelle Spalte.

Vergleichen Sie die Daten in der virtuellen Spalte in der Quell- und Zieldatenbank. Sie können die Daten manuell validieren oder ein Skript für diesen Schritt schreiben.

DBA, App-Entwickler

Zugehörige Ressourcen