Bekannte Probleme/Migrationseinschränkungen bei Onlinemigrationen von PostgreSQL zum Azure DB for PostgreSQL-EinzelserverKnown issues/migration limitations with online migrations from PostgreSQL to Azure DB for PostgreSQL-Single server

In den folgenden Abschnitten werden bekannte Probleme und Einschränkungen bei Onlinemigrationen von PostgreSQL zum Azure Database for PostgreSQL-Einzelserver beschrieben.Known issues and limitations associated with online migrations from PostgreSQL to Azure Database for PostgreSQL-Single server are described in the following sections.

Konfiguration der OnlinemigrationOnline migration configuration

  • Auf dem PostgreSQL-Quellserver muss Version 9.5.11, 9.6.7, 10.3 oder höher ausgeführt werden.The source PostgreSQL server must be running version 9.5.11, 9.6.7, or 10.3 or later. Weitere Informationen finden Sie im Artikel Unterstützte PostgreSQL-Datenbankversionen.For more information, see the article Supported PostgreSQL Database Versions.

  • Es werden nur Migrationen innerhalb einer Version unterstützt.Only same version migrations are supported. Das Migrieren von PostgreSQL 9.5.11 zu Azure Database for PostgreSQL 9.6.7 wird z.B. nicht unterstützt.For example, migrating PostgreSQL 9.5.11 to Azure Database for PostgreSQL 9.6.7 is not supported.

    Hinweis

    Für PostgreSQL Version 10 unterstützt DMS zurzeit nur die Migration von Version 10.3 zu Azure Database for PostgreSQL.For PostgreSQL version 10, currently DMS only supports migration of version 10.3 to Azure Database for PostgreSQL. Wir planen, neuere Versionen von PostgreSQL schon bald zu unterstützen.We are planning to support newer versions of PostgreSQL very soon.

  • Um die logische Replikation in der PostgreSQL-Quelldatei postgresql.config zu aktivieren, legen Sie die folgenden Parameter fest:To enable logical replication in the source PostgreSQL postgresql.conf file, set the following parameters:

    • wal_level = logicalwal_level = logical
    • max_replication_slots = [maximale Anzahl von Datenbanken für die Migration]. Wenn Sie vier Datenbanken migrieren möchten, legen Sie den Wert auf 4 fest.max_replication_slots = [max number of databases for migration]; if you want to migrate four databases, set the value to 4
    • max_wal_senders = [Anzahl der gleichzeitig ausgeführten Datenbanken]. Der empfohlene Wert ist 10.max_wal_senders = [number of databases running concurrently]; the recommended value is 10
  • Hinzufügen der IP-Adresse des DMS-Agents zur PostgreSQL-Quelldatei „pg_hba.conf“Add DMS agent IP to the source PostgreSQL pg_hba.conf

    1. Notieren Sie sich die DMS-IP-Adresse, nachdem Sie die Bereitstellung einer Instanz von DMS abgeschlossen haben.Make a note of the DMS IP address after you finish provisioning an instance of DMS.

    2. Fügen Sie die IP-Adresse der Datei „pg_hba.conf“ wie gezeigt hinzu:Add the IP address to the pg_hba.conf file as shown:

      host all 172.16.136.18/10 md5 host replication postgres 172.16.136.18/10 md5host all 172.16.136.18/10 md5 host replication postgres 172.16.136.18/10 md5

  • Der Benutzer muss über Administratorberechtigung auf dem Server verfügen, der die Datenbank hostet.The user must have the super user permission on the server hosting the source database

  • Abgesehen davon, dass ENUM im Quelldatenbankschema enthalten ist, müssen das Quell- und das Zieldatenbankschema übereinstimmen.Aside from having ENUM in the source database schema, the source and target database schemas must match.

  • Das Schema des betreffenden Azure Database for PostgreSQL-Einzelservers darf keine Fremdschlüssel enthalten.The schema in the target Azure Database for PostgreSQL-Single server must not have foreign keys. Verwenden Sie die folgende Abfrage, um Fremdschlüssel zu löschen:Use the following query to drop foreign keys:

                                SELECT Queries.tablename
           ,concat('alter table ', Queries.tablename, ' ', STRING_AGG(concat('DROP CONSTRAINT ', Queries.foreignkey), ',')) as DropQuery
                ,concat('alter table ', Queries.tablename, ' ', 
                                                STRING_AGG(concat('ADD CONSTRAINT ', Queries.foreignkey, ' FOREIGN KEY (', column_name, ')', 'REFERENCES ', foreign_table_name, '(', foreign_column_name, ')' ), ',')) as AddQuery
        FROM
        (SELECT
        tc.table_schema, 
        tc.constraint_name as foreignkey, 
        tc.table_name as tableName, 
        kcu.column_name, 
        ccu.table_schema AS foreign_table_schema,
        ccu.table_name AS foreign_table_name,
        ccu.column_name AS foreign_column_name 
    FROM 
        information_schema.table_constraints AS tc 
        JOIN information_schema.key_column_usage AS kcu
          ON tc.constraint_name = kcu.constraint_name
          AND tc.table_schema = kcu.table_schema
        JOIN information_schema.constraint_column_usage AS ccu
          ON ccu.constraint_name = tc.constraint_name
          AND ccu.table_schema = tc.table_schema
    WHERE constraint_type = 'FOREIGN KEY') Queries
      GROUP BY Queries.tablename;
    
    

    Führen Sie „drop foreign key“ (zweite Spalte) im Abfrageergebnis aus.Run the drop foreign key (which is the second column) in the query result.

  • Das Schema des betreffenden Azure Database for PostgreSQL-Einzelservers darf keine Trigger enthalten.The schema in target Azure Database for PostgreSQL-Single server must not have any triggers. Führen Sie zum Deaktivieren von Triggern in der Zieldatenbank Folgendes aus:Use the following to disable triggers in target database:

    SELECT Concat('DROP TRIGGER ', Trigger_Name, ';') FROM  information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'your_schema';
    

Einschränkungen bei DatentypenDatatype limitations

  • Einschränkung: Wenn die PostgreSQL-Quelldatenbank einen ENUM-Datentyp enthält, treten bei der Migration während der fortlaufenden Synchronisierung Fehler auf.Limitation: If there's an ENUM datatype in the source PostgreSQL database, the migration will fail during continuous sync.

    Problemumgehung: Ändern Sie den ENUM-Datentyp in Azure Database for PostgreSQL in „character varying“.Workaround: Modify ENUM datatype to character varying in Azure Database for PostgreSQL.

  • Einschränkung: Wenn in Tabellen kein Primärschlüssel vorhanden ist, tritt bei der fortlaufenden Synchronisierung ein Fehler auf.Limitation: If there's no primary key on tables, continuous sync will fail.

    Problemumgehung: Legen Sie vorübergehend einen Primärschlüssel für die Tabelle fest, damit die Migration fortgesetzt wird.Workaround: Temporarily set a primary key for the table for migration to continue. Sie können den Primärschlüssel nach Abschluss der Datenmigration entfernen.You can remove the primary key after data migration is complete.

  • Einschränkung: Der JSONB-Datentyp wird für die Migration nicht unterstützt.Limitation: JSONB datatype not supported for migration.

LOB-EinschränkungenLOB limitations

LOB-Spalten (Large Object) sind Spalten, die groß werden können.Large Object (LOB) columns are columns that can grow large. Für PostgreSQL sind XML, JSON, IMAGE, TEXT usw. Beispiele für LOB-Datentypen.For PostgreSQL, examples of LOB data types include XML, JSON, IMAGE, TEXT, etc.

  • Einschränkung: Wenn LOB-Datentypen als Primärschlüssel verwendet werden, tritt bei der Migration ein Fehler auf.Limitation: If LOB data types are used as primary keys, migration will fail.

    Problemumgehung: Ersetzen Sie den Primärschlüssel durch andere Datentypen oder Spalten, die keine LOB-Datentypen oder LOB-Spalten sind.Workaround: Replace primary key with other datatypes or columns that aren't LOB.

  • Einschränkung: Wenn die Länge der LOB-Spalte (Large Object) 32 KB überschreitet, werden die Daten möglicherweise am Ziel abgeschnitten.Limitation: If the length of Large Object (LOB) column is bigger than 32 KB, data might be truncated at the target. Mithilfe der folgenden Abfrage können Sie die Länge der LOB-Spalte überprüfen:You can check the length of LOB column using this query:

    SELECT max(length(cast(body as text))) as body FROM customer_mail
    

    Problemumgehung: Wenden Sie sich bei einem LOB-Objekt, das größer als 32 KB ist, unter Fragen zur Azure-Datenbankmigration an das Entwicklerteam.Workaround: If you have LOB object that is bigger than 32 KB, contact engineering team at Ask Azure Database Migrations.

  • Einschränkung: Wenn LOB-Spalten in der Tabelle vorhanden sind und kein Primärschlüssel für die Tabelle festgelegt wurde, werden möglicherweise keine Daten für diese Tabelle migriert.Limitation: If there are LOB columns in the table, and there's no primary key set for the table, data might not be migrated for this table.

    Problemumgehung: Legen Sie vorübergehend einen Primärschlüssel für die Tabelle fest, damit die Migration fortgesetzt wird.Workaround: Temporarily set a primary key for the table for migration to proceed. Sie können den Primärschlüssel nach Abschluss der Datenmigration entfernen.You can remove the primary key after data migration is complete.

PostgreSQL10-ProblemumgehungPostgreSQL10 workaround

PostgreSQL 10.x nimmt verschiedene Änderungen an pg_xlog-Ordnernamen vor und bewirkt damit, dass die Migration nicht wie erwartet ausgeführt wird.PostgreSQL 10.x makes various changes to pg_xlog folder names and hence causing migration not running as expected. Wenn Sie von PostgreSQL 10.x zu Azure Database for PostgreSQL 10.3 migrieren, führen Sie das folgende Skript für die PostgreSQL-Quelldatenbank aus, um eine Wrapper-Funktion um pg_xlog-Funktionen zu erstellen.If you're migrating from PostgreSQL 10.x to Azure Database for PostgreSQL 10.3, execute the following script on the source PostgreSQL database to create wrapper function around pg_xlog functions.

BEGIN;
CREATE SCHEMA IF NOT EXISTS fnRenames;
CREATE OR REPLACE FUNCTION fnRenames.pg_switch_xlog() RETURNS pg_lsn AS $$ 
   SELECT pg_switch_wal(); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_replay_pause() RETURNS VOID AS $$ 
   SELECT pg_wal_replay_pause(); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_replay_resume() RETURNS VOID AS $$ 
   SELECT pg_wal_replay_resume(); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_location() RETURNS pg_lsn AS $$ 
   SELECT pg_current_wal_lsn(); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_is_xlog_replay_paused() RETURNS boolean AS $$ 
   SELECT pg_is_wal_replay_paused(); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_xlogfile_name(lsn pg_lsn) RETURNS TEXT AS $$ 
   SELECT pg_walfile_name(lsn); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_last_xlog_replay_location() RETURNS pg_lsn AS $$ 
   SELECT pg_last_wal_replay_lsn(); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_last_xlog_receive_location() RETURNS pg_lsn AS $$ 
   SELECT pg_last_wal_receive_lsn(); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_flush_location() RETURNS pg_lsn AS $$ 
   SELECT pg_current_wal_flush_lsn(); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_insert_location() RETURNS pg_lsn AS $$ 
   SELECT pg_current_wal_insert_lsn(); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_location_diff(lsn1 pg_lsn, lsn2 pg_lsn) RETURNS NUMERIC AS $$ 
   SELECT pg_wal_lsn_diff(lsn1, lsn2); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_xlogfile_name_offset(lsn pg_lsn, OUT TEXT, OUT INTEGER) AS $$ 
   SELECT pg_walfile_name_offset(lsn); $$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION fnRenames.pg_create_logical_replication_slot(slot_name name, plugin name, 
   temporary BOOLEAN DEFAULT FALSE, OUT slot_name name, OUT xlog_position pg_lsn) RETURNS RECORD AS $$ 
   SELECT slot_name::NAME, lsn::pg_lsn FROM pg_catalog.pg_create_logical_replication_slot(slot_name, plugin, 
   temporary); $$ LANGUAGE SQL;
ALTER USER PG_User SET search_path = fnRenames, pg_catalog, "$user", public;

-- DROP SCHEMA fnRenames CASCADE;
-- ALTER USER PG_User SET search_path TO DEFAULT;
COMMIT;

Hinweis

Im vorhergehenden Skript bezieht sich „PG_User“ auf den Benutzernamen, der zum Herstellen der Verbindung mit der Migrationsquelle verwendet wird.In the preceding script, "PG_User" refers to the username being used to connect to the migration source.

Einschränkungen bei der Onlinemigration von AWS RDS PostgreSQLLimitations when migrating online from AWS RDS PostgreSQL

Beim Versuch der Onlinemigration von AWS RDS PostgreSQL zu Azure Database for PostgreSQL können die folgenden Fehler auftreten.When you try to perform an online migration from AWS RDS PostgreSQL to Azure Database for PostgreSQL, you may encounter the following errors.

  • Fehler: Der Standardwert der Spalte „{column}“ in der Tabelle „{table}“ der Datenbank „{database}“ unterscheidet sich für den Quell- und Zielserver.Error: The Default value of column '{column}' in table '{table}' in database '{database}' is different on source and target servers. Auf der Quelle lautet er „{value on source}“, und auf dem Ziel „{value on target}“.It's '{value on source}' on source and '{value on target}' on target.

    Einschränkung: Dieser Fehler tritt auf, wenn der Standardwert für ein Spaltenschema in Quell- und Zieldatenbank unterschiedlich ist.Limitation: This error occurs when the default value on a column schema is different between the source and target databases. Problemumgehung: Stellen Sie sicher, dass das Schema des Ziels mit dem Schema der Quelle übereinstimmt.Workaround: Ensure that the schema on the target matches schema on the source. Details zum Migrieren des Schemas finden Sie in der Dokumentation zur Azure PostgreSQL-Onlinemigration.For detail on migrating schema, refer to the Azure PostgreSQL online migration documentation.

  • Fehler: Die Zieldatenbank „{database}“ enthält „{number of tables}“ Tabellen, während die Quelldatenbank „{database}“ „{number of tables}“ Tabellen enthält.Error: Target database '{database}' has '{number of tables}' tables where as source database '{database}' has '{number of tables}' tables. Die Anzahl von Tabellen in der Quell- und Zieldatenbank sollte jeweils übereinstimmen.The number of tables on source and target databases should match.

    Einschränkung: Dieser Fehler tritt auf, wenn sich die Anzahl der Tabellen in Quell- und Zieldatenbank unterscheidet.Limitation: This error occurs when the number of tables is different between the source and target databases. Problemumgehung: Stellen Sie sicher, dass das Schema des Ziels mit dem Schema der Quelle übereinstimmt.Workaround: Ensure that the schema on the target matches schema on the source. Details zum Migrieren des Schemas finden Sie in der Dokumentation zur Azure PostgreSQL-Onlinemigration.For detail on migrating schema, refer to the Azure PostgreSQL online migration documentation.

  • Fehler: Die Quelldatenbank {database} ist leer.Error: The source database {database} is empty.

    Einschränkung: Dieser Fehler tritt auf, wenn die Quelldatenbank leer ist.Limitation: This error occurs when the source database is empty. Meistens besteht die Ursache darin, dass Sie die falsche Datenbank als Quelle ausgewählt haben.This is most likely because you have selected the wrong database as source. Problemumgehung: Überprüfen Sie erneut die Quelldatenbank, die Sie für die Migration ausgewählt haben, und wiederholen Sie den Vorgang.Workaround: Double-check the source database you selected for migration, and then try again.

  • Fehler: Die Zieldatenbank „{database}“ ist leer.Error: The target database {database} is empty. Migrieren Sie das Schema.Please migrate the schema.

    Einschränkung: Dieser Fehler tritt auf, wenn für die Zieldatenbank kein Schema vorhanden ist.Limitation: This error occurs when there is no schema on the target database. Stellen Sie sicher, dass das Schema des Ziels mit dem Schema der Quelle übereinstimmt.Make sure schema on the target matches schema on the source. Problemumgehung: Stellen Sie sicher, dass das Schema des Ziels mit dem Schema der Quelle übereinstimmt.Workaround: Ensure that the schema on the target matches schema on the source. Details zum Migrieren des Schemas finden Sie in der Dokumentation zur Azure PostgreSQL-Onlinemigration.For detail on migrating schema, refer to the Azure PostgreSQL online migration documentation.

Weitere EinschränkungenOther limitations

  • Der Name der Datenbank darf kein Semikolon (;) enthalten.The database name can't include a semi-colon (;).

  • Eine Kennwortzeichenfolge mit öffnenden und schließenden geschweiften Klammern { } wird nicht unterstützt.Password string that has opening and closing curly brackets { } isn't supported. Diese Einschränkung gilt für Verbindungen mit der PostgreSQL-Quelldatenbank sowie der Azure Database for PostgreSQL-Zielinstanz.This limitation applies to both connecting to source PostgreSQL and target Azure Database for PostgreSQL.

  • Eine erfasste Tabelle muss über einen Primärschlüssel verfügen.A captured table must have a Primary Key. Wenn eine Tabelle keinen Primärschlüssel besitzt, ist das Ergebnis der Vorgänge DELETE- und UPDATE für Datensätze unvorhersehbar.If a table doesn't have a primary key, the result of DELETE and UPDATE record operations will be unpredictable.

  • Die Aktualisierung eines Primärschlüsselsegments wird ignoriert.Updating a Primary Key segment is ignored. In solchen Fällen wird das Anwenden einer solchen Aktualisierung vom Ziel als eine Aktualisierung identifiziert, die keine Zeilen aktualisiert hat und zu einem Datensatz führt, der in die Ausnahmetabelle geschrieben wird.In such cases, applying such an update will be identified by the target as an update that didn't update any rows and will result in a record written to the exceptions table.

  • Die Migration mehrerer Tabellen mit gleichem Namen, aber unterschiedlicher Groß- und Kleinschreibung (z.B. table1, TABLE1 und Table1) kann zu unvorhersehbarem Verhalten führen und wird daher nicht unterstützt.Migration of multiple tables with the same name but a different case (e.g. table1, TABLE1, and Table1) may cause unpredictable behavior and is therefore not supported.

  • Die Änderungsverarbeitung von [CREATE | ALTER | DROP] für Tabellen-DDLs wird unterstützt, es sei denn, sie sind in einem inneren Funktions-/Prozedurentextblock oder in anderen geschachtelten Konstrukten enthalten.Change processing of [CREATE | ALTER | DROP] table DDLs are supported unless they are held in an inner function/procedure body block or in other nested constructs. Beispielsweise wird die folgende Änderung nicht erfasst:For example, the following change will not be captured:

    CREATE OR REPLACE FUNCTION pg.create_distributors1() RETURNS void
    LANGUAGE plpgsql
    AS $$
    BEGIN
    create table pg.distributors1(did serial PRIMARY KEY,name varchar(40)
    NOT NULL);
    END;
    $$;
    
  • Die Änderungsverarbeitung (fortlaufende Synchronisierung) von TRUNCATE-Vorgängen wird nicht unterstützt.Change processing (continuous sync) of TRUNCATE operations isn't supported. Die Migration partitionierter Tabellen wird nicht unterstützt.Migration of partitioned tables is not supported. Wenn eine partitionierte Tabelle erkannt wird, werden die folgenden Aktionen ausgeführt:When a partitioned table is detected, the following things occur:

    • Die Datenbank meldet eine Liste von übergeordneten und untergeordneten Tabellen.The database will report a list of parent and child tables.
    • Die Tabelle wird im Ziel als reguläre Tabelle mit den gleichen Eigenschaften wie die ausgewählten Tabellen erstellt.The table will be created on the target as a regular table with the same properties as the selected tables.
    • Wenn die übergeordnete Tabelle in der Quelldatenbank den gleichen Primärschlüsselwert wie die untergeordneten Tabellen aufweist, wird ein Fehler des Typs „doppelt vorhandener Schlüssel“ generiert.If the parent table in the source database has the same Primary Key value as its child tables, a “duplicate key” error will be generated.
  • In DMS ist die Anzahl der in einer einzelnen Migrationsaktivität zu migrierenden Datenbanken auf vier Datenbanken beschränkt.In DMS, the limit of databases to migrate in one single migration activity is four.