Verwenden einer PostgreSQL-Datenbank als Ziel für AWS Database Migration Service - AWS Database Migration Service

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.

Verwenden einer PostgreSQL-Datenbank als Ziel für AWS Database Migration Service

Sie können Daten entweder aus einer anderen PostgreSQL-Datenbank oder aus einer der anderen unterstützten Datenbanken in PostgreSQL-Datenbanken migrieren. AWS DMS

Hinweise zu Versionen von PostgreSQL, die als Ziel AWS DMS unterstützen, finden Sie unter. Ziele für AWS DMS

PostgreSQL-Quellversion

AWS DMS zu verwendende Version

9.x, 10.x, 11.x, 12.x

Verwenden Sie eine beliebige verfügbare AWS DMS Version.

13.x

Verwenden Sie AWS DMS Version 3.4.3 und höher.

14.x

Verwenden Sie AWS DMS Version 3.4.7 und höher.

15.x

Verwenden Sie AWS DMS Version 3.5.1 und höher.

Anmerkung
  • Amazon Aurora Serverless ist als ZIEL für Amazon Aurora mit PostgreSQL-Kompatibilität verfügbar. Weitere Informationen zu Amazon Aurora Serverless finden Sie unter Using Amazon Aurora Serverless v2 im Amazon Aurora Aurora-Benutzerhandbuch.

  • Aurora-Serverless-DB-Cluster sind nur von einer Amazon VPC aus zugänglich und können keine öffentliche IP-Adresse verwenden. Wenn Sie also eine Replikations-Instance in einer anderen Region als Aurora PostgreSQL Serverless haben möchten, müssen Sie VPC-Peering konfigurieren. Prüfen Sie andernfalls die Verfügbarkeit von Aurora-PostgreSQL-Serverless-Regionen und entscheiden Sie sich, eine dieser Regionen sowohl für Aurora PostgreSQL Serverless als auch für Ihre Replikations-Instance zu verwenden.

  • Die Babelfish-Funktion ist in Amazon Aurora integriert. Hierfür entstehen keine zusätzlichen Kosten. Weitere Informationen finden Sie unter Verwendung von Babelfish für Aurora PostgreSQL als Ziel für AWS Database Migration Service.

AWS DMS verfolgt einen table-by-table Ansatz bei der Migration von Daten von der Quelle zum Ziel in der Volllastphase. Die Tabellenreihenfolge kann während der Volllastphase nicht garantiert werden. Die Tabellen sind während der Vollastphase und während des Anwendens der zwischengespeicherten Transaktionen für einzelne Tabellen nicht synchron. Dies hat zur Folge, dass aktive referentielle Integritätseinschränkungen während der Volllastphase zu Aufgabenfehlern führen können.

In PostgreSQL werden Fremdschlüssel (referentielle Integritätseinschränkungen) mithilfe von Auslösern implementiert. AWS DMS Lädt während der Vollladephase jede Tabelle einzeln. Es wird ausdrücklich empfohlen, dass Sie Fremdschlüsseleinschränkungen während eines vollständigen Ladevorgangs mit einer der folgenden Methoden deaktivieren:

  • Deaktivieren Sie vorübergehend alle Auslöser aus der Instance und beenden Sie den vollständigen Ladevorgang.

  • Verwenden Sie den session_replication_role-Parameter in PostgreSQL.

Ein Auslöser kann sich zu jedem beliebigen Zeitpunkt in einem der folgenden Zustände befinden: origin, replica, always und disabled. Wenn der session_replication_role-Parameter auf replica gesetzt ist, sind nur Auslöser aktiv, die sich im Status replica befinden, und sie werden ausgelöst, wenn sie aufgerufen werden. Andernfalls bleiben die Auslöser inaktiv.

PostgreSQL verfügt über einen ausfallsicheren Mechanismus, um zu verhindern, dass eine Tabelle gekürzt wird, auch dann, wenn session_replication_role festgelegt ist. Sie können diesen als Alternative zur Deaktivierung von Auslösern verwenden, um den vollständigen Ladevorgang abzuschließen. Legen Sie hierfür den Vorbereitungsmodus der Zieltabelle auf DO_NOTHING fest. Andernfalls schlagen DROP- und TRUNCATE-Operationen fehl, wenn Fremdschlüsseleinschränkungen bestehen.

In Amazon RDS können Sie diesen Parameter mithilfe einer Parametergruppe steuern/festlegen. Für eine PostgreSQL-Instance, die in Amazon EC2 ausgeführt wird, können Sie den Parameter direkt festlegen.

Weitere Informationen zur Arbeit mit einer PostgreSQL-Datenbank als Ziel für AWS DMS finden Sie in den folgenden Abschnitten:

Einschränkungen bei der Verwendung von PostgreSQL als Ziel für AWS Database Migration Service

Bei der Verwendung einer PostgreSQL-Datenbank als Ziel für AWS DMS gelten die folgenden Einschränkungen:

  • Bei heterogenen Migrationen wird der JSON-Datentyp intern in den nativen CLOB-Datentyp konvertiert.

  • Wenn bei einer Migration von Oracle nach PostgreSQL eine Spalte in Oracle ein NULL-Zeichen (Hexadezimalwert U+0000) enthält, wird das NULL-Zeichen in ein Leerzeichen AWS DMS umgewandelt (Hexadezimalwert U+0020). Der Grund hierfür ist eine PostgreSQL-Einschränkung.

  • AWS DMS unterstützt keine Replikation in eine Tabelle mit einem eindeutigen Index, der mit der Coalesce-Funktion erstellt wurde.

  • Wenn Ihre Tabellen Sequenzen verwenden, aktualisieren Sie den Wert von NEXTVAL für jede Sequenz in der Zieldatenbank, nachdem Sie die Replikation aus der Quelldatenbank beendet haben. AWS DMS kopiert Daten aus Ihrer Quelldatenbank, migriert aber während der laufenden Replikation keine Sequenzen zur Zieldatenbank.

Sicherheitsanforderungen bei der Verwendung einer PostgreSQL-Datenbank als Ziel für AWS Database Migration Service

Aus Sicherheitsgründen muss das für die Datenmigration verwendete Benutzerkonto ein registrierter Benutzer in einer PostgreSQL-Zieldatenbank sein.

Ihr PostgreSQL-Zielendpunkt erfordert Mindestbenutzerberechtigungen, um eine AWS DMS Migration durchzuführen. Weitere Informationen finden Sie in den folgenden Beispielen.

CREATE USER newuser WITH PASSWORD 'your-password'; ALTER SCHEMA schema_name OWNER TO newuser;

Oder

GRANT USAGE ON SCHEMA schema_name TO myuser; GRANT CONNECT ON DATABASE postgres to myuser; GRANT CREATE ON DATABASE postgres TO myuser; GRANT CREATE ON SCHEMA schema_name TO myuser; GRANT UPDATE, INSERT, SELECT, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA schema_name TO myuser; GRANT TRUNCATE ON schema_name."BasicFeed" TO myuser;

Endpunkteinstellungen und zusätzliche Verbindungsattribute (ECAs) bei Verwendung von PostgreSQL als Ziel für AWS DMS

Sie können Endpunkteinstellungen und Extra Connection Attributes (ECAs) verwenden, um Ihre PostgreSQL-Zieldatenbank zu konfigurieren.

Sie geben die Einstellungen an, wenn Sie den Zielendpunkt mithilfe der AWS DMS Konsole erstellen, oder indem Sie den create-endpoint Befehl in AWS CLI, mit der --postgre-sql-settings '{"EndpointSetting": "value", ...}' JSON-Syntax verwenden.

Sie geben ECAs mithilfe des ExtraConnectionAttributes Parameters für Ihren Endpunkt an.

Die folgende Tabelle zeigt die Endpunkteinstellungen, die Sie mit PostgreSQL als Ziel verwenden können.

Name Beschreibung

MaxFileSize

Gibt die maximale Größe (in KB) der CSV-Datei zum Übertragen von Daten nach PostgreSQL an.

Standardwert: 32768 KB (32 MB)

Gültige Werte: 1 bis 1 048 576 KB (bis zu 1,1 GB)

Beispiel: --postgre-sql-settings '{"MaxFileSize": 512}'

ExecuteTimeout

Stellt die Zeitbeschränkung der Client-Anweisung für die PostgreSQL-Instance in Sekunden ein. Der Standardwert liegt bei 60 Sekunden.

Beispiel: --postgre-sql-settings '{"ExecuteTimeout": 100}'

AfterConnectScript= SET session_replication_role = replica

Dieses Attribut verfügt über AWS DMS Bypass-Fremdschlüssel und Benutzer-Trigger, um die Zeit zu reduzieren, die für das Laden von Daten in großen Mengen benötigt wird.

MapUnboundedNumericAsString

Dieser Parameter behandelt Spalten mit unbegrenzten NUMERIC-Datentypen als STRING, um eine erfolgreiche Migration ohne Verlust der Präzision des numerischen Werts zu ermöglichen. Verwenden Sie diesen Parameter nur für die Replikation von einer PostgreSQL-Quelle zu einem PostgreSQL-Ziel oder für Datenbanken mit PostgreSQL-Kompatibilität.

Standardwert: false

Zulässige Werte: false/true

Beispiel: --postgre-sql-settings '{"MapUnboundedNumericAsString": "true"}

Die Verwendung dieses Parameters kann zu einer gewissen Beeinträchtigung der Replikationsleistung führen, da eine Transformation von numerischen Werten in Zeichenfolgen und zurück in numerische Werte erfolgt. Dieser Parameter wird für DMS-Version 3.4.4 und höher unterstützt

Anmerkung

Verwenden Sie MapUnboundedNumericAsString nur in PostgreSQL-Quell- und -Zielendpunkten gemeinsam.

Bei Verwendung von MapUnboundedNumericAsString für PostgreSQL-Quellendpunkte wird die Präzision während CDC auf 28 beschränkt. Bei Verwendung von MapUnboundedNumericAsString für Zielendpunkte werden Daten mit einer Präzision von 28 und einer Skalierung von 6 migriert.

Verwenden Sie MapUnboundedNumericAsString nicht mit Nicht-PostgreSQL-Zielen.

loadUsingCSV

Verwenden Sie dieses Extra Connection Attribute (ECA), um Daten für Vollladevorgänge mit dem Befehl\ COPY zu übertragen.

Standardwert: true

Zulässige Werte: true/false

ECA-Beispiel: loadUsingCSV=true;

Hinweis: Wenn Sie diesen ECA auf „False“ setzen, kann dies zu einer gewissen Beeinträchtigung der Replikationsleistung führen, da INSERTs direkt ausgeführt werden.

DatabaseMode

Verwenden Sie dieses Attribut, um das Standardverhalten der Replikationsverarbeitung von Postgresql-kompatiblen Endpunkten zu ändern, die eine zusätzliche Konfiguration erfordern, wie z. B. Babelfish-Endpunkte.

Standardwert: DEFAULT

Zulässige Werte: DEFAULT, BABELFISH

Beispiel: DatabaseMode=default;

BabelfishDatabaseName

Verwenden Sie dieses Attribut, um den Namen der Babelfish-T-SQL-Zieldatenbank anzugeben, zu der migriert wird. Dieser ist erforderlich, wenn DatabaseMode auf Babelfish festgelegt ist. Es handelt sich hier nicht um die reservierte babelfish_db-Datenbank.

Beispiel: BabelfishDatabaseName=TargetDb;

Zieldatentypen für PostgreSQL

Der PostgreSQL-Datenbankendpunkt für AWS DMS unterstützt die meisten PostgreSQL-Datenbankdatentypen. Die folgende Tabelle zeigt die Zieldatentypen der PostgreSQL-Datenbank, die bei der Verwendung unterstützt werden, AWS DMS und die Standardzuordnung von AWS DMS Datentypen.

Weitere Hinweise zu AWS DMS Datentypen finden Sie unter. Datentypen für den AWS Database Migration Service

AWS DMS Datentyp

PostgreSQL-Datentyp

BOOLEAN

BOOLEAN

BLOB

BYTEA

BYTES

BYTEA

DATUM

DATUM

TIME

TIME

DATETIME

Wenn die Skalierung 0 bis 6 ist, verwenden Sie TIMESTAMP.

Wenn die Skalierung 7 bis 9 ist, verwenden Sie VARCHAR (37).

INT1

SMALLINT

INT2

SMALLINT

INT4

INTEGER

INT8

BIGINT

NUMERIC

DECIMAL (P,S)

REAL4

FLOAT4

REAL8

FLOAT8

STRING

Ist die Länge 1 bis 21.845, verwenden Sie VARCHAR (Länge in Byte).

Ist die Länge 21.846 bis 2.147.483.647, verwenden Sie VARCHAR (65535).

UINT1

SMALLINT

UINT2

INTEGER

UINT4

BIGINT

UINT8

BIGINT

WSTRING

Ist die Länge 1 bis 21.845, verwenden Sie VARCHAR (Länge in Byte).

Ist die Länge 21.846 bis 2.147.483.647, verwenden Sie VARCHAR (65535).

NCLOB

TEXT

CLOB

TEXT

Anmerkung

AWS DMS Erstellt bei der Replikation aus einer PostgreSQL-Quelle die Zieltabelle mit den gleichen Datentypen für alle Spalten, mit Ausnahme von Spalten mit benutzerdefinierten Datentypen. In solchen Fällen wird der Datentyp als "character varying" im Ziel erstellt.

Verwenden von Babelfish für Aurora PostgreSQL als Ziel für AWS Database Migration Service

Sie können SQL-Server-Quelltabellen unter Verwendung von AWS Database Migration Service zu einem Babelfish-für-Amazon-Aurora-PostgreSQL-Ziel migrieren. Mithilfe von Babelfish versteht Aurora PostgreSQL T-SQL, den proprietären SQL-Dialekt von Microsoft SQL Server, und unterstützt dasselbe Kommunikationsprotokoll. Somit können für SQL Server geschriebene Anwendungen jetzt mit weniger Codeänderungen mit Aurora verwendet werden. Die Babelfish-Funktion ist in Amazon Aurora integriert. Hierfür entstehen keine zusätzlichen Kosten. Sie können Babelfish über die Amazon-RDS-Konsole in Ihrem Amazon-Aurora-Cluster aktivieren.

Wenn Sie Ihren AWS DMS Zielendpunkt mithilfe der AWS DMS Konsolen-, API- oder CLI-Befehle erstellen, geben Sie als Ziel-Engine Amazon Aurora PostgreSQL an und nennen Sie die Datenbank babelfish_db. Fügen Sie im Abschnitt Endpunkteinstellungen Einstellungen hinzu, um für DatabaseMode Babelfishund für BabelfishDatabaseName den Namen der Babelfish-T-SQL-Zieldatenbank festzulegen.

Hinzufügen von Transformationsregeln zu Ihrer Migrationsaufgabe

Wenn Sie eine Migrationsaufgabe für ein Babelfish-Ziel definieren, müssen Sie Transformationsregeln einbeziehen, die sicherstellen, dass DMS die vorab erstellten T-SQL-Babelfish-Tabellen in der Zieldatenbank verwendet.

Fügen Sie Ihrer Migrationsaufgabe zunächst eine Transformationsregel hinzu, die alle Tabellennamen in Kleinbuchstaben umschreibt. Babelfish speichert die Namen von Tabellen, die Sie mit T-SQL erstellen, in Kleinbuchstaben im PostgreSQL-Katalog pg_class. Wenn Sie jedoch über SQL-Server-Tabellen mit Namen in Groß- und Kleinschreibung verfügen, erstellt DMS die Tabellen unter Verwendung von systemeigenen PostgreSQL-Datentypen anstelle der T-SQL-kompatiblen Datentypen. Aus diesem Grund sollten Sie unbedingt eine Transformationsregel hinzufügen, die alle Tabellennamen in Kleinbuchstaben umschreibt. Beachten Sie, dass Spaltennamen nicht in Kleinbuchstaben umgewandelt werden sollten.

Wenn Sie bei der Definition Ihres Clusters den Migrationsmodus für mehrere Datenbanken verwendet haben, fügen Sie als Nächstes eine Transformationsregel hinzu, die das ursprüngliche SQL-Server-Schema umbenennt. Achten Sie darauf, das SQL-Server-Schema so umzubenennen, dass der Name den Namen der T-SQL-Datenbank beinhaltet. Wenn der ursprüngliche SQL-Server-Schemaname beispielsweise dbo und Ihr T-SQL-Datenbankname mydb lautet, benennen Sie das Schema unter Verwendung einer Transformationsregel in mydb_dbo um.

Wenn Sie den Einzeldatenbankmodus verwenden, benötigen Sie keine Transformationsregel, um Schemanamen umzubenennen. Schemanamen haben eine one-to-one Zuordnung zur T-SQL-Zieldatenbank in Babelfish.

Die folgende Beispieltransformationsregel schreibt alle Tabellennamen in Kleinbuchstaben um und benennt den ursprünglichen SQL-Server-Schemanamen von dbo in mydb_dbo um.

{ "rules": [ { "rule-type": "transformation", "rule-id": "566251737", "rule-name": "566251737", "rule-target": "schema", "object-locator": { "schema-name": "dbo" }, "rule-action": "rename", "value": "mydb_dbo", "old-value": null }, { "rule-type": "transformation", "rule-id": "566139410", "rule-name": "566139410", "rule-target": "table", "object-locator": { "schema-name": "%", "table-name": "%" }, "rule-action": "convert-lowercase", "value": null, "old-value": null }, { "rule-type": "selection", "rule-id": "566111704", "rule-name": "566111704", "object-locator": { "schema-name": "dbo", "table-name": "%" }, "rule-action": "include", "filters": [] } ] }

Einschränkungen bei der Verwendung eines PostgreSQL-Zielendpunkts mit Babelfish-Tabellen

Bei der Verwendung eines PostgreSQL-Zielendpunkts mit Babelfish-Tabellen gelten folgende Einschränkungen:

  • Verwenden Sie für den Zieltabellen-Vorbereitungsmodus nur die Modi Nichts unternehmen oder Kürzen. Verwenden Sie nicht den Modus Tabellen am Ziel ablegen. In diesem Modus erstellt DMS die Tabellen als PostgreSQL-Tabellen, die T-SQL möglicherweise nicht erkennt.

  • AWS DMS unterstützt den Datentyp sql_variant nicht.

  • Babelfish unterstützt die Datentypen HEIRARCHYID, GEOMETRY und GEOGRAPHY nicht. Für die Migration dieser Datentypen können Sie Transformationsregeln hinzufügen, um den Datentyp in wstring(250) zu konvertieren.

  • Babelfish unterstützt nur die Migration der Datentypen BINARY, VARBINARY und IMAGE unter Verwendung des Datentyps BYTEA. Für frühere Versionen von Aurora PostgreSQL können Sie DMS verwenden, um diese Tabellen zu einem Babelfish-Zielendpunkt zu migrieren. Sie müssen keine Länge für den Datentyp BYTEA angeben, wie im folgenden Beispiel zu sehen.

    [Picture] [VARBINARY](max) NULL

    Ändern Sie den vorherigen T-SQL-Datentyp in den von T-SQL unterstützten Datentyp BYTEA.

    [Picture] BYTEA NULL
  • Wenn Sie in früheren Versionen von Aurora PostgreSQL Babelfish eine Migrationsaufgabe für die laufende Replikation von SQL Server zu Babelfish unter Verwendung des PostgreSQL-Zielendpunkts erstellen, müssen Sie den Datentyp SERIAL allen Tabellen zuweisen, die Spalten IDENTITY verwenden. Ab Aurora PostgreSQL (Version 15.3/14.8 und höher) und Babelfish (Version 3.2.0 und höher) wird die Identitätsspalte unterstützt und es ist nicht mehr erforderlich, den Datentyp SERIAL zuzuweisen. Weitere Informationen finden Sie unter Verwendung von SERIAL im Abschnitt zu Sequenzen und Identität des Playbooks zur Migration von SQL Server zu Aurora PostgreSQL. Wenn Sie dann die Tabelle in Babelfish erstellen, ändern Sie die Spaltendefinition der folgenden Angabe.

    [IDCol] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY

    Ändern Sie die vorherige Angabe in Folgendes.

    [IDCol] SERIAL PRIMARY KEY

    Das Babelfish-kompatible Aurora PostgreSQL erstellt eine Sequenz mit der Standardkonfiguration und fügt der Spalte eine Einschränkung NOT NULL hinzu. Die neu erstellte Sequenz verhält sich wie eine reguläre Sequenz (um 1 erhöht) und enthält keine zusammengesetzte Option SERIAL.

  • Nachdem Sie Daten mit Tabellen migriert haben, die Spalten IDENTITY oder den Datentyp SERIAL verwenden, setzen Sie das PostgreSQL-basierte Sequenzobjekt auf der Grundlage des Maximalwerts für die Spalte zurück. Wenn die Tabellen vollständig geladen sind, verwenden Sie die folgende T-SQL-Abfrage, um Anweisungen zu generieren, um das zugehörige Sequenzobjekt zu setzen.

    DECLARE @schema_prefix NVARCHAR(200) = '' IF current_setting('babelfishpg_tsql.migration_mode') = 'multi-db' SET @schema_prefix = db_name() + '_' SELECT 'SELECT setval(pg_get_serial_sequence(''' + @schema_prefix + schema_name(tables.schema_id) + '.' + tables.name + ''', ''' + columns.name + ''') ,(select max(' + columns.name + ') from ' + schema_name(tables.schema_id) + '.' + tables.name + '));' FROM sys.tables tables JOIN sys.columns columns ON tables.object_id = columns.object_id WHERE columns.is_identity = 1 UNION ALL SELECT 'SELECT setval(pg_get_serial_sequence(''' + @schema_prefix + table_schema + '.' + table_name + ''', ''' + column_name + '''),(select max(' + column_name + ') from ' + table_schema + '.' + table_name + '));' FROM information_schema.columns WHERE column_default LIKE 'nextval(%';

    Die Abfrage generiert eine Reihe von SELECT-Anweisungen, die Sie ausführen, um die maximalen IDENTITY- und SERIAL-Werte zu aktualisieren.

  • Bei Babelfish-Versionen vor 3.2 kann Vollständiger LOB-Modus zu einem Tabellenfehler führen. Erstellen Sie in diesem Fall eine separate Aufgabe für die Tabellen, die nicht geladen werden konnten. Verwenden Sie dann Limitierter LOB-Modus, um den entsprechenden Wert für Maximale LOB-Größe (KB) anzugeben. Eine weitere Option besteht darin, für das SQL-Server-Endpunkt-Verbindungsattribut die Einstellung ForceFullLob=True festzulegen.

  • Bei Babelfish-Versionen vor 3.2 wird bei der Datenvalidierung mit Babelfish-Tabellen, die keine auf Ganzzahlen basierenden Primärschlüssel verwenden, eine Meldung generiert, dass kein geeigneter eindeutiger Schlüssel gefunden werden kann. Ab Aurora PostgreSQL (Version 15.3/14.8 und höher) und Babelfish (Version 3.2.0 und höher) wird die Datenvalidierung für nicht ganzzahlige Primärschlüssel unterstützt.

  • Aufgrund von Genauigkeitsunterschieden bei der Anzahl der Dezimalstellen für Sekunden meldet DMS Datenvalidierungsfehler für Babelfish-Tabellen, die Datentypen DATETIME verwenden. Um diese Fehler zu unterdrücken, können Sie den folgenden Validierungsregeltyp für Datentypen DATETIME hinzufügen.

    { "rule-type": "validation", "rule-id": "3", "rule-name": "3", "rule-target": "column", "object-locator": { "schema-name": "dbo", "table-name": "%", "column-name": "%", "data-type": "datetime" }, "rule-action": "override-validation-function", "source-function": "case when ${column-name} is NULL then NULL else 0 end", "target-function": "case when ${column-name} is NULL then NULL else 0 end" }