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 table-by-table approccio per 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 pieno caricamento, 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.

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 Descrizione

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)

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.

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

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.

loadUsingCSV

Utilizzate questo attributo di connessione aggiuntivo (ECA) per trasferire i dati per le operazioni di caricamento completo utilizzando il comando\ COPY.

Valore predefinito: true

Valori validi: true/false

Esempio ECA: loadUsingCSV=true;

Nota: l'impostazione di questo 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

Esempio: DatabaseMode=default;

BabelfishDatabaseName

Utilizza questo attributo per specificare il nome del database T-SQL Babelfish di destinazione in cui eseguire la migrazione. Questo è necessario se DatabaseMode è impostato su Babelfish. Questo non è il database babelfish_db riservato.

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 T-SQL, il linguaggio SQL di proprietà di Microsoft SQL Server, e 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 Impostazione dell'endpoint aggiungi le impostazioni per configurare DatabaseMode su Babelfish e BabelfishDatabaseName sul nome del database T-SQL Babelfish di destinazione.

Aggiunta delle regole di trasformazione all'attività di migrazione

Quando definisci un'attività di migrazione per una destinazione Babelfish, è necessario includere le regole di trasformazione che assicurino che DMS utilizzi le tabelle T-SQL Babelfish già create 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 i nomi delle tabelle create utilizzando T-SQL in lettere minuscole nel catalogo pg_class PostgreSQL. Tuttavia, quando le tabelle SQL Server includono nomi in maiuscolo e minuscolo, DMS crea le tabelle utilizzando i tipi di dati nativi PostgreSQL anziché i tipi di dati compatibili con 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 SQL Server per includere il nome del database T-SQL. Ad esempio, se il nome dello schema SQL Server originale è dbo e il nome del database T-SQL è mydb, rinomina lo schema in mydb_dbo utilizzando una regola di trasformazione.

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 con il database T-SQL di destinazione in Babelfish. one-to-one

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 T-SQL potrebbe non riconoscere.

  • AWS DMS non supporta il tipo di dati sql_variant.

  • Babelfish non supporta i tipi di dati HEIRARCHYID, GEOMETRY e GEOGRAPHY. Per migrare questi tipi di dati, puoi aggiungere le regole di trasformazione per cui 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

    Modifica il tipo di dati T-SQL precedente con il tipo di dati BYTEA supportato da T-SQL.

    [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 15.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

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

  • Dopo aver migrato i dati di tabelle con le colonne IDENTITY o il tipo di dati SERIAL, reimposta l'oggetto sequenza basato su PostgreSQL in base al valore massimo per la colonna. Dopo aver eseguito il pieno carico delle tabelle, usa la seguente query T-SQL per generare le istruzioni per inizializzare l'oggetto 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 15.3/14.8 e successive) e Babelfish (versione 3.2.0 e successive), è supportata la convalida dei dati per chiavi primarie basate su numeri non interi.

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