View a markdown version of this page

Utilizzo di un database PostgreSQL come destinazione per AWS Database Migration Service - AWS Database Migration Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo di un database PostgreSQL come destinazione per AWS Database Migration Service

È possibile migrare i dati ai database PostgreSQL utilizzando AWS DMS, da un altro database PostgreSQL o da uno degli altri database supportati.

Per informazioni sulle versioni di PostgreSQL supportate come destinazione, AWS DMS consulta. Obiettivi per AWS DMS

Nota

AWS DMS adotta un approccio tabella per tabella durante la migrazione dei dati dall'origine alla destinazione nella fase di caricamento completo. L'ordine delle tabelle durante la fase di caricamento completo non può essere garantita. Le tabelle non sono sincronizzate durante la fase di caricamento completo e durante l'applicazione di transazioni memorizzate nella cache per singole tabelle. Di conseguenza, i vincoli di integrità referenziale attivi possono causare un errore dell'attività durante la fase di caricamento completo.

In PostgreSQL, le chiavi esterne (vincoli di integrità referenziale) sono implementate mediante trigger. Durante la fase di caricamento completo, AWS DMS carica ogni tabella una alla volta. Consigliamo vivamente di disabilitare i vincoli delle chiavi esterne durante un caricamento completo, utilizzando uno dei seguenti metodi:

  • Disabilitare temporaneamente tutti i trigger dall'istanza, quindi terminare il caricamento completo.

  • Utilizzare il parametro session_replication_role in PostgreSQL.

In qualsiasi momento, un trigger può trovarsi in uno dei seguenti stati: origin, replica, always o disabled. Quando il parametro session_replication_role è impostato su replica, solo i trigger nello stato replica sono attivi e vengono attivati quando sono chiamati. In caso contrario, i trigger rimangono inattivi.

PostgreSQL dispone di un meccanismo di sicurezza per evitare che una tabella venga troncata, anche quando session_replication_role è impostato. Puoi utilizzare tale opzione come alternativa alla disabilitazione dei trigger, per facilitare il completamento dell'esecuzione del caricamento completo. Per eseguire questa operazione, imposta la modalità di preparazione della tabella di destinazione su DO_NOTHING. In caso contrario, le operazioni DROP e TRUNCATE avranno esito negativo in presenza di vincoli delle chiavi esterne.

In Amazon RDS, puoi controllare l'impostazione di questo parametro mediante un gruppo di parametri. Per un'istanza PostgreSQL in esecuzione su Amazon EC2, puoi impostare il parametro direttamente.

Per ulteriori dettagli sull'utilizzo di un database PostgreSQL come destinazione AWS DMS per, consulta le seguenti sezioni:

Limitazioni all'uso di PostgreSQL come destinazione per AWS Database Migration Service

Quando si utilizza un database PostgreSQL come destinazione per AWS DMS, si applicano le seguenti limitazioni:

  • Per le migrazioni eterogenee, il tipo di dati JSON viene convertito internamente nel tipo di dati CLOB nativo.

  • In una migrazione da Oracle a PostgreSQL, se una colonna in Oracle contiene un carattere NULL (valore esadecimale U+0000), converte il carattere NULL in uno spazio (valore esadecimale U+0020) AWS DMS . Ciò si verifica a causa di una limitazione di PostgreSQL.

  • AWS DMS non supporta la replica su una tabella con un indice univoco creato con la funzione coalesce.

  • Se le tabelle utilizzano sequenze, aggiorna il valore di NEXTVAL per ogni sequenza nel database di destinazione dopo aver interrotto la replica dal database di origine. AWS DMS copia i dati dal database di origine, ma non migra le sequenze verso il target durante la replica in corso.

Limitazioni all'uso di Amazon Aurora PostgreSQL Limitless come destinazione per AWS Database Migration Service

Le seguenti limitazioni si applicano quando si utilizza Amazon Aurora PostgreSQL Limitless come destinazione per: AWS DMS

  • AWS DMS La convalida dei dati non supporta Amazon Aurora PostgreSQL Limitless.

  • AWS DMS migra le tabelle di origine come tabelle standard, che non sono distribuite. Dopo la migrazione, puoi convertire queste tabelle Standard in tabelle Limitless seguendo la guida ufficiale alla conversione.

Requisiti di sicurezza quando si utilizza un database PostgreSQL come destinazione per AWS Database Migration Service

Per motivi di sicurezza, l'account utente utilizzato per la migrazione dei dati deve corrispondere a un utente registrato in qualsiasi database PostgreSQL utilizzato come destinazione.

L'endpoint di destinazione PostgreSQL richiede autorizzazioni utente minime per eseguire AWS DMS una migrazione, vedi gli esempi seguenti.

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

Oppure

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;

Impostazioni degli endpoint e attributi di connessione aggiuntivi (ECA) quando si utilizza PostgreSQL come destinazione per AWS DMS

È possibile utilizzare le impostazioni degli endpoint e gli attributi di connessione aggiuntivi (ECA) per configurare il database di destinazione PostgreSQL.

Le impostazioni vengono specificate quando si crea l'endpoint di destinazione utilizzando la AWS DMS console o utilizzando il create-endpoint comando in, con la sintassi JSON. AWS CLI--postgre-sql-settings '{"EndpointSetting": "value", ...}'

È possibile specificare le ECA utilizzando il ExtraConnectionAttributes parametro per l'endpoint.

La tabella riportata di seguito mostra le impostazioni degli endpoint che è possibile utilizzare con PostgreSQL come destinazione.

Nome Description

ConnectionTimeout

Usa questo attributo di connessione aggiuntivo (ECA) per impostare il timeout di connessione all'endpoint per l'istanza PostgreSQL, in secondi. Il valore predefinito è 10 secondi. ConnectionTimeout=30Esempio ECA:.

MaxFileSize

Specifica le dimensioni massime (in KB) di qualsiasi file .csv utilizzato per il trasferimento dei dati su PostgreSQL.

Valore predefinito: 32.768 KB (32 MB)

Valori validi: 1-1.048.576 KB (fino a 1,1 GB)

Ad esempio: --postgre-sql-settings '{"MaxFileSize": 512}'

ExecuteTimeout

Imposta il timeout dell'istruzione del client per l'istanza PostgreSQL in secondi. Il valore predefinito è 60 secondi.

Ad esempio: --postgre-sql-settings '{"ExecuteTimeout": 100}'

AfterConnectScript= SET session_replication_role = replica

Questo attributo AWS DMS ignora le chiavi esterne e i trigger utente per ridurre il tempo necessario per caricare in blocco i dati.

MapUnboundedNumericAsString

Questo parametro tratta le colonne con tipi di dati NUMERIC illimitati come STRING per eseguire correttamente la migrazione senza perdere la precisione del valore numerico. Usa questo parametro solo per la replica dall'origine PostgreSQL alla destinazione PostgreSQL o ai database con compatibilità PostgreSQL.

Valore predefinito: false

Valori validi: false/true

Ad esempio: --postgre-sql-settings '{"MapUnboundedNumericAsString": "true"}

L'utilizzo di questo parametro può comportare un peggioramento delle prestazioni di replica a causa della trasformazione da valore numerico a stringa e di nuovo a valore numerico. Questo parametro è supportato per l'uso da DMS versione 3.4.4 e successive

Nota

Utilizza MapUnboundedNumericAsString solo negli endpoint di origine e di destinazione PostgreSQL insieme.

L'uso di MapUnboundedNumericAsString su endpoint PostgreSQL di origine limita la precisione a 28 durante la CDC. L'uso di MapUnboundedNumericAsString su endpoint di destinazione, migra i dati con precisione 28 scala 6.

Non utilizzare MapUnboundedNumericAsString con destinazioni non PostgreSQL.

Durante CDC, i valori NUMERICI illimitati vengono troncati a 1.000 caratteri se la loro rappresentazione in stringa supera tale limite.

loadUsingCSV

Utilizzate questo attributo di connessione aggiuntivo (ECA) per trasferire dati per operazioni a pieno carico utilizzando il comando\ COPY.

Valore predefinito: true

Valori validi: true/false

Esempio ECA: loadUsingCSV=true;

Nota: l'impostazione di questa ECA su false potrebbe comportare un peggioramento delle prestazioni di replica a causa dell'esecuzione diretta degli INSERT.

DatabaseMode

Utilizza questo attributo per modificare il comportamento predefinito della gestione da parte della replica degli endpoint compatibili con PostgreSQL che richiedono una configurazione aggiuntiva, come gli endpoint Babelfish.

Valore predefinito: DEFAULT

Valori validi: DEFAULT, BABELFISH

Ad esempio: DatabaseMode=default;

BabelfishDatabaseName

Utilizzate questo attributo per specificare il nome del database Babelfish T-SQL di destinazione verso cui migrare. Questo è necessario se DatabaseMode è impostato su Babelfish. Questo non è il database babelfish_db riservato.

Ad esempio: BabelfishDatabaseName=TargetDb;

Tipi di dati di destinazione per PostgreSQL

L'endpoint del database PostgreSQL per AWS DMS supporta la maggior parte dei tipi di dati del database PostgreSQL. La tabella seguente mostra i tipi di dati di destinazione del database PostgreSQL supportati durante l' AWS DMS utilizzo e la mappatura predefinita dei tipi di dati. AWS DMS

Per ulteriori informazioni sui tipi di AWS DMS dati, vedere. Tipi di dati per AWS Database Migration Service

AWS DMS tipo di dati

Tipo di dati PostgreSQL

BOOLEAN

BOOLEAN

BLOB

BYTEA

BYTES

BYTEA

DATE

DATE

TIME

TIME

DATETIME

Se il dimensionamento è compreso tra 0 e 6, utilizzare TIMESTAMP.

Se il dimensionamento è compreso tra 7 e 9, utilizzare VARCHAR (37).

INT1

SMALLINT

INT2

SMALLINT

INT4

INTEGER

INT8

BIGINT

NUMERIC

DECIMAL (P,S)

REAL4

FLOAT4

REAL8

FLOAT8

STRING

Se la lunghezza è compresa tra 1 e 21.845, utilizzare VARCHAR (lunghezza in byte).

Se la lunghezza è compresa tra 21.846 e 2.147.483.647, utilizzare VARCHAR (65535).

UINT1

SMALLINT

UINT2

INTEGER

UINT4

BIGINT

UINT8

BIGINT

WSTRING

Se la lunghezza è compresa tra 1 e 21.845, utilizzare VARCHAR (lunghezza in byte).

Se la lunghezza è compresa tra 21.846 e 2.147.483.647, utilizzare VARCHAR (65535).

NCLOB

TEXT

CLOB

TEXT

Nota

Quando si esegue la replica da un'origine PostgreSQL AWS DMS , crea la tabella di destinazione con gli stessi tipi di dati per tutte le colonne, ad eccezione delle colonne con tipi di dati definiti dall'utente. In questi casi, il tipo di dati viene creato come "carattere variabile" nella destinazione.

Usare Babelfish per Aurora PostgreSQL come destinazione per AWS Database Migration Service

È possibile migrare le tabelle di origine SQL Server in una destinazione Babelfish per Amazon Aurora PostgreSQL mediante AWS Database Migration Service. Con Babelfish, Aurora PostgreSQL comprende il dialetto SQL proprietario di Microsoft SQL Server e T-SQL supporta lo stesso protocollo di comunicazione. Pertanto, le applicazioni scritte per SQL Server possono ora funzionare con Aurora con meno modifiche al codice. La funzionalità Babelfish è integrata in Amazon Aurora senza costi aggiuntivi. Puoi attivare Babelfish sul tuo cluster Amazon Aurora dalla console Amazon RDS.

Quando crei l'endpoint di AWS DMS destinazione utilizzando la AWS DMS console, l'API o i comandi CLI, specifica il motore di destinazione Amazon Aurora PostgreSQL e assegna un nome al database babelfish_db. Nella sezione Endpoint Settings, aggiungi le impostazioni da impostare e sul nome del database Babelfish di destinazioneDatabaseMode. Babelfish BabelfishDatabaseName T-SQL

Aggiunta delle regole di trasformazione all'attività di migrazione

Quando definisci un'attività di migrazione per un target Babelfish, devi includere regole di trasformazione che assicurino che DMS utilizzi le tabelle Babelfish precreate T-SQL nel database di destinazione.

Innanzitutto, aggiungi all'attività di migrazione una regola di trasformazione che renda tutti i nomi delle tabelle in minuscolo. Babelfish memorizza in lettere minuscole nel catalogo PostgreSQL i nomi delle tabelle create utilizzandopg_class. T-SQL Tuttavia, quando si dispone di tabelle SQL Server con nomi misti tra maiuscole e minuscole, DMS crea le tabelle utilizzando i tipi di dati nativi di PostgreSQL anziché i tipi di dati compatibili. T-SQL Per questo motivo, assicurati di aggiungere una regola di trasformazione che renda tutti i nomi delle tabelle in minuscolo. I nomi delle colonne non devono essere trasformati in lettere minuscole.

Successivamente, se hai utilizzato la modalità di migrazione di più database quando hai definito il cluster, aggiungi una regola di trasformazione che rinomina lo schema SQL Server originale. Assicurati di rinominare il nome dello schema di SQL Server per includere il nome del database. T-SQL Ad esempio, se il nome dello schema originale di SQL Server è dbo e il nome del T-SQL database è mydb, rinomina lo schema in mydb_dbo utilizzando una regola di trasformazione.

Nota

Quando si utilizza Babelfish per Aurora PostgreSQL 16 o versioni successive, la modalità di migrazione predefinita è «mutidatabase». Quando esegui attività di migrazione DMS, assicurati di rivedere il parametro della modalità di migrazione e di aggiornare le regole di trasformazione, se necessario.

Se usi la modalità di un database singolo, non è necessaria una regola di trasformazione per rinominare i nomi degli schemi. I nomi degli schemi hanno una mappatura individuale con il database di destinazione T-SQL in Babelfish.

La seguente regola di trasformazione di esempio rende tutti i nomi delle tabelle in minuscolo e rinomina il nome dello schema SQL Server originale da dbo in mydb_dbo.

{ "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": [] } ] }

Limitazioni all'utilizzo di un endpoint di destinazione PostgreSQL con le tabelle Babelfish

Le seguenti limitazioni si applicano quando si utilizza un endpoint di destinazione PostgreSQL con tabelle Babelfish:

  • Per Modalità di preparazione della tabella di destinazione usa solo le modalità Nessuna operazione o Tronca. Non utilizzare la modalità Rilascia tabelle nella destinazione. In questa modalità, DMS crea le tabelle come tabelle PostgreSQL che potrebbero non riconoscere. T-SQL

  • AWS DMS non supporta il tipo di dati sql_variant.

  • Babelfish su Postgres endpoint non supporta i tipi di datiHEIRARCHYID, GEOMETRY (precedenti alla 3.5.4) e (precedenti alla 3.5.4). GEOGRAPHY Per migrare questi tipi di dati, puoi aggiungere regole di trasformazione per convertire il tipo di dati in wstring (250).

  • Babelfish supporta solo la migrazione di tipi di dati BINARY, VARBINARY e IMAGE che utilizzano il tipo di dati BYTEA. Per le versioni precedenti di Aurora PostgreSQL, puoi utilizzare DMS per migrare queste tabelle su un endpoint di destinazione Babelfish. Non è necessario specificare la lunghezza per il tipo di dati BYTEA, come mostrato nell'esempio seguente.

    [Picture] [VARBINARY](max) NULL

    Cambia il tipo di T-SQL dati precedente con il tipo di dati T-SQL supportatoBYTEA.

    [Picture] BYTEA NULL
  • Per le versioni precedenti di Aurora PostgreSQL Babelfish, se si crea un'attività di migrazione per la replica continua da SQL Server a Babelfish utilizzando l'endpoint di destinazione PostgreSQL, è necessario assegnare il tipo di dati SERIAL a tutte le tabelle che utilizzano colonne IDENTITY. A partire da Aurora PostgreSQL (versione 1.5). 3/14.8 e successive) e Babelfish (versione 3.2.0 e successive), la colonna identity è supportata e non è più necessario assegnare il tipo di dati SERIAL. Per ulteriori informazioni, consulta SERIAL Usage nella sezione Sequences and Identity in SQL Server to Aurora PostgreSQL Migration Playbook. Quindi, quando crei la tabella in Babelfish, modifica la definizione della colonna come segue.

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

    Cambia la definizione precedente come segue.

    [IDCol] SERIAL PRIMARY KEY

    Babelfish-compatible Aurora PostgreSQL crea una sequenza utilizzando la configurazione predefinita e aggiunge un vincolo alla colonna. NOT NULL La sequenza appena creata si comporta come una sequenza normale (con incrementi di 1) e non include alcuna opzione SERIAL composita.

  • Dopo la migrazione dei dati con tabelle che utilizzano IDENTITY colonne o il tipo di SERIAL dati, reimposta l'oggetto della PostgreSQL-based sequenza in base al valore massimo per la colonna. Dopo aver eseguito il caricamento completo delle tabelle, utilizzate la seguente T-SQL query per generare istruzioni per il seeding dell'oggetto di sequenza associato.

    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(%';

    La query genera una serie di istruzioni SELECT da eseguire in ordine per aggiornare i valori massimi di IDENTITY e SERIAL.

  • Per le versioni di Babelfish precedenti alla 3.2, la Modalità LOB completa potrebbe causare un errore di tabella. In tal caso, crea un'attività separata per le tabelle che non sono state caricate. Utilizza quindi la Modalità LOB limitata per specificare il valore appropriato per Dimensione massima dei LOB (KB). Un'altra opzione consiste nell'impostare l'attributo di connessione dell'endpoint ForceFullLob=True di SQL Server.

  • Per le versioni di Babelfish precedenti alla 3.2, l'esecuzione della convalida dei dati per tabelle Babelfish che non utilizzano chiavi primarie basate su numeri interi genera un messaggio che indica che non è possibile trovare una chiave univoca adatta. A partire da Aurora PostgreSQL (versione 1.5). 3/14.8 e successive) e Babelfish (versione 3.2.0 e successive), è supportata la convalida dei dati per chiavi primarie non intere.

  • A causa delle differenze di precisione nel numero di cifre decimali per i secondi, DMS segnala gli errori di convalida dei dati per le tabelle Babelfish che utilizzano tipi di dati DATETIME. Per correggere questi errori, puoi aggiungere il seguente tipo di regola di convalida per i tipi di dati DATETIME.

    { "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" }