Trasporto dei database PostgreSQL tra istanze database - Amazon Relational Database 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à.

Trasporto dei database PostgreSQL tra istanze database

Utilizzando Transportable Database di PostgreSQL per Amazon RDS, puoi spostare un database PostgreSQL tra due istanze database. Si tratta di un modo molto rapido per migrare database di grandi dimensioni tra diverse istanze database. Per utilizzare questo approccio, le istanze database devono essere entrambe eseguite con la stessa versione principale di PostgreSQL.

Questa funzionalità richiede l'installazione dell’estensione pg_transport sull'istanza database di origine e destinazione. L’estensione pg_transport fornisce un meccanismo di trasporto fisico che consente di spostare i file del database con elaborazione minima. Questo meccanismo consente di spostare i dati più rapidamente rispetto ai tradizionali processi dump e load, con tempi di inattività molto ridotti.

Nota

Transportable Database di PostgreSQL è disponibile in RDS for PostgreSQL versioni 11.5 e in RDS for PostgreSQL versioni 10.10 e successive.

Per trasportare un'istanza database PostgreSQL da un'istanza database RDS for PostgreSQL a un'altra, è necessario innanzitutto impostare le istanze di origine e di destinazione come descritto in Configurazione di un’istanza database per il trasporto. È quindi possibile trasportare il database utilizzando la funzione descritta in Trasporto di un database PostgreSQL.

Limitazioni all'utilizzo di Transportable Database di PostgreSQL

Transportable Database ha le limitazioni seguenti:

  • Repliche di lettura – I database trasportabili non possono essere utilizzati su repliche di lettura o istanze padre di repliche di lettura.

  • Tipi di colonne non supportati – Impossibile utilizzare i tipi di dati reg nelle tabelle di database che si intendono trasportare con questo metodo. Questi tipi dipendono dagli ID oggetto del catalogo di sistema (OID), che spesso vengono modificati durante il trasporto.

  • Spazi tabelle – Tutti gli oggetti del database di origine devono trovarsi nello spazio tabelle pg_default predefinito.

  • Compatibilità – Le istanze database di origine e di destinazione devono eseguire la stessa versione principale di PostgreSQL.

  • Estensioni – L'istanza database di origine può avere solo pg_transport installato.

  • Ruoli e liste di controllo accessi (ACL) – I privilegi di accesso al database di origine e le informazioni di proprietà non vengono trasferite nel database di destinazione. Tutti gli oggetti del database vengono creati e assegnati all'utente di destinazione locale del trasporto.

  • Trasporti simultanei – Una singola istanza database può supportare fino a 32 trasporti simultanei, comprese le importazioni e le esportazioni, se i processi di lavoro sono stati configurati correttamente.

  • Solo istanze database RDS for PostgreSQL – Sono supportati solo database trasportabili sulle istanze database RDS for PostgreSQL. Non è possibile utilizzarlo con database o database locali in esecuzione su Amazon EC2.

Configurazione del trasporto di un database PostgreSQL

Prima di iniziare, verifica che le istanze database RDS for PostgreSQL soddisfino i seguenti requisiti seguenti:

  • Le istanze database RDS for PostgreSQL di origine e di destinazione devono eseguire la stessa versione di PostgreSQL.

  • Il database di destinazione non può avere un database con lo stesso nome del database di origine che si desidera trasportare.

  • L'account utilizzato per eseguire il trasporto necessita di privilegi rds_superuser sia sul database di origine che sul database di destinazione.

  • Il gruppo di sicurezza per l'istanza database di origine deve consentire l'accesso in entrata dall'istanza database di destinazione. Questo potrebbe già accadere se le istanze database di origine e di destinazione si trovano nel VPC. Per ulteriori informazioni sui gruppi di sicurezza, consulta Controllo dell'accesso con i gruppi di sicurezza.

Il trasporto dei database da un'istanza database di origine a un'istanza database di destinazione richiede diverse modifiche al gruppo parametri del database associato a ciascuna istanza. Ciò significa che è necessario creare un gruppo parametri del database personalizzato per l'istanza database di origine e creare un gruppo parametri del database personalizzato per l'istanza database di destinazione.

Nota

Se le istanze database sono già configurate utilizzando gruppi di parametri del database personalizzati, è possibile iniziare con il passaggio 2 della procedura seguente.

Per configurare il gruppo parametri del database personalizzato per il trasporto dei database

Per i seguenti passaggi, utilizza un account con privilegi rds_superuser.

  1. Se le istanze DB di origine e di destinazione utilizzano un gruppo di parametri DB predefinito, è necessario creare un gruppo di parametri DB personalizzato utilizzando la versione appropriata per le istanze. Questa operazione consente di modificare i valori per diversi parametri. Per ulteriori informazioni, consulta Utilizzo di gruppi di parametri.

  2. Nel gruppo parametri del database personalizzato, modifica i valori per i seguenti parametri:

    • shared_preload_libraries – Aggiungi pg_transport all'elenco delle librerie.

    • pg_transport.num_workers – Il valore predefinito è 3. Aumenta o riduci questo valore secondo necessità del tuo database. Per un database da 200 GB, consigliamo un valore non più alto di 8. Tieni presente che se aumenti il valore predefinito per questo parametro, dovresti anche aumentare il valore di max_worker_processes.

    • pg_transport.work_mem – Il valore predefinito è 128 MB o 256 MB, a seconda della versione di PostgreSQL. In genere, l'impostazione predefinita può essere lasciata invariata.

    • max_worker_processes - Il valore di questo parametro deve essere impostato utilizzando il seguente calcolo:

      (3 * pg_transport.num_workers) + 9

      Questo valore è necessario sulla destinazione per gestire vari processi di lavoro in background coinvolti nel trasporto. Per ulteriori informazioni su max_worker_processes,, consulta Consumo di risorse nella documentazione di PostgreSQL.

    Per ulteriori informazioni sui parametri pg_transport, consulta Riferimento per i parametri di Transportable Database .

  3. Riavvia l'istanza database RDS for PostgreSQL e l'istanza di destinazione in modo che le impostazioni per i parametri abbiano effetto.

  4. Connettiti all'istanza database RDS for PostgreSQL di origine.

    psql --host=source-instance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
  5. Rimuovi le estensioni estranee dallo schema pubblico dell'istanza database. Solo l’estensione pg_transport è consentita durante l'effettiva operazione di trasporto.

  6. Installa l’estensione pg_transport come segue:

    postgres=> CREATE EXTENSION pg_transport; CREATE EXTENSION
  7. Connettiti all'istanza database RDS for PostgreSQL di destinazione. Rimuovi eventuali estensioni estranee, quindi installa l’estensione pg_transport.

    postgres=> CREATE EXTENSION pg_transport; CREATE EXTENSION

Trasporto di un database PostgreSQL alla destinazione dall'origine

Dopo aver completato il processo descritto in Configurazione del trasporto di un database PostgreSQL, puoi avviare il trasporto. A questo scopo, esegui la funzione transport.import_from_server nell'istanza database di destinazione. Nella sintassi seguente puoi trovare i parametri della funzione.

SELECT transport.import_from_server( 'source-db-instance-endpoint', source-db-instance-port, 'source-db-instance-user', 'source-user-password', 'source-database-name', 'destination-user-password', false);

Il valore false mostrato nell'esempio indica alla funzione che non si tratta di un test. Per testare la configurazione di trasporto, è possibile specificare true per l’opzione dry_run quando chiami la funzione, come illustrato di seguito:

postgres=> SELECT transport.import_from_server( 'docs-lab-source-db.666666666666aws-region.rds.amazonaws.com', 5432, 'postgres', '********', 'labdb', '******', true); INFO: Starting dry-run of import of database "labdb". INFO: Created connections to remote database (took 0.03 seconds). INFO: Checked remote cluster compatibility (took 0.05 seconds). INFO: Dry-run complete (took 0.08 seconds total). import_from_server -------------------- (1 row)

Le linee INFO sono di output perché il parametro pg_transport.timing è impostato sul valore predefinito, true. Imposta la proprietà dry_run su false quando esegui il comando e il database di origine viene importato nella destinazione, come illustrato di seguito:

INFO: Starting import of database "labdb". INFO: Created connections to remote database (took 0.02 seconds). INFO: Marked remote database as read only (took 0.13 seconds). INFO: Checked remote cluster compatibility (took 0.03 seconds). INFO: Signaled creation of PITR blackout window (took 2.01 seconds). INFO: Applied remote database schema pre-data (took 0.50 seconds). INFO: Created connections to local cluster (took 0.01 seconds). INFO: Locked down destination database (took 0.00 seconds). INFO: Completed transfer of database files (took 0.24 seconds). INFO: Completed clean up (took 1.02 seconds). INFO: Physical transport complete (took 3.97 seconds total). import_from_server -------------------- (1 row)

Questa funzione richiede l'inserimento di password per l'utente del database. Quindi, ti consigliamo di modificare le password dei ruoli utente utilizzati dopo aver completato il trasporto. In alternativa, puoi utilizzare le variabili di associazione SQL per creare ruoli utente temporanei. Utilizza questi ruoli temporanei per il trasporto, quindi eliminali al termine.

Se il trasporto non ha esito positivo, potrebbe essere visualizzato un messaggio di errore simile al seguente:

pg_transport.num_workers=8 25% of files transported failed to download file data

Il messaggio di errore "Impossibile scaricare dati file" indica che il numero di processi di lavoro non è impostato correttamente per le dimensioni del database. Potrebbe essere necessario aumentare o diminuire il valore impostato per pg_transport.num_workers. Ogni errore segnala la percentuale di completamento, in modo da poter vedere l'impatto delle modifiche. Ad esempio, la modifica dell'impostazione da 8 a 4 in un caso ha comportato quanto segue:

pg_transport.num_workers=4 75% of files transported failed to download file data

Ricorda che il parametro max_worker_processes viene preso in considerazione anche durante il processo di trasporto. In altre parole, potrebbe essere necessario modificare sia pg_transport.num_workers che max_worker_processes per trasportare correttamente il database. L'esempio mostrato ha finalmente funzionato quando pg_transport.num_workers è stato impostato su 2:

pg_transport.num_workers=2 100% of files transported

Per ulteriori informazioni sulla funzione transport.import_from_server e sui relativi parametri, consulta Riferimento per la funzione Transportable Database.

Cosa succede durante il trasporto del database

La funzione Transportable Database di PostgreSQL utilizza un modello pull per importare il database dall'istanza database di origine alla destinazione. La funzione transport.import_from_server crea il database in transito nell'istanza database di destinazione. Il database in transito non è accessibile nell'istanza database di destinazione per tutta la durata del trasporto.

All'avvio del trasporto, tutte le sessioni correnti nel database di origine vengono terminate. Nessun database, oltre al database di origine nell'istanza database di origine, viene interessato dal trasporto.

Il database di origine passa in una modalità speciale di sola lettura. In questa modalità, puoi connetterti al database di origine ed eseguire query di sola lettura. Invece, le query abilitate per la scrittura e alcuni altri tipi di comandi sono bloccati. Solo lo specifico database di origine trasportato è sottoposto a queste limitazioni.

Durante il trasporto, non puoi ripristinare l'istanza database di destinazione a un point-in-time perché il trasporto non è transazionale e non utilizza il log write-ahead (WAL) di PostgreSQL per registrare le modifiche. Se nell'istanza database di destinazione sono abilitati i backup automatici, dopo il trasporto viene eseguito automaticamente un backup. I oint-in-time ripristini P sono disponibili per alcuni periodi successivi al termine del backup.

Se il trasporto non riesce, l'estensione pg_transport tenta di annullare tutte le modifiche alle istanze database di origine e di destinazione, inclusa la rimozione del database parzialmente trasportato nella destinazione. A seconda del tipo di errore, il database di origine potrebbe continuare a rifiutare le query abilitate per la scrittura. Se accade, utilizza il comando seguente per consentirle.

ALTER DATABASE db-name SET default_transaction_read_only = false;

Riferimento per la funzione Transportable Database

La funzione transport.import_from_server trasporta un database PostgreSQL importandolo da un'istanza database di origine a un'istanza database di destinazione. Per farlo, utilizza un meccanismo di trasporto con connessione al database fisico.

Prima di iniziare il trasporto, questa funzione verifica che le istanze database di origine e di destinazione siano della stessa versione e siano compatibili per la migrazione. Conferma inoltre che l'istanza database di destinazione abbia spazio sufficiente per l'origine.

Sintassi

transport.import_from_server( host text, port int, username text, password text, database text, local_password text, dry_run bool )

Valore restituito

Nessuna.

Parametri

Le descrizioni dei parametri della funzione transport.import_from_server sono disponibili nella tabella seguente.

Parametro Descrizione
host

L'endpoint dell'istanza database di origine.

port Un numero intero che rappresenta la porta dell'istanza database di origine.

Le istanze database di PostgreSQL spesso utilizzano la porta 5432.

username

L'utente dell'istanza database di origine. Questo utente deve essere membro del ruolo rds_superuser.

password

La password utente dell'istanza database di origine.

database

Il nome del database nell'istanza database di origine da trasportare.

local_password

La password locale dell'utente corrente per l'istanza database di destinazione. Questo utente deve essere membro del ruolo rds_superuser.

dry_run

Un valore booleano facoltativo che specifica se eseguire un test. L'impostazione predefinita è false, che indica che il trasporto procede.

Per confermare la compatibilità tra le istanze database di origine e di destinazione senza eseguire effettivamente il trasporto, imposta dry_run su true.

Esempio

Per un esempio, consulta Trasporto di un database PostgreSQL alla destinazione dall'origine.

Riferimento per i parametri di Transportable Database

Diversi parametri controllano il comportamento dell'estensione pg_transport. Di seguito, sono disponibili le descrizioni di questi parametri.

pg_transport.num_workers

Il numero di dipendenti da utilizzare per il processo di trasporto. L'impostazione predefinita è 3. I valori validi sono 1–32. Anche i trasporti di database più grandi in genere richiedono un numero di dipendenti inferiore a 8. Il valore di questa impostazione sull'istanza database di destinazione viene utilizzato sia dall’origine che dalla destinazione durante il trasporto.

pg_transport.timing

Specifica se riportare le informazioni temporali durante il trasporto. Il valore predefinito è true, il che significa che le informazioni temporali vengono riportate. Consigliamo di lasciare questo parametro impostato su true in modo da poter monitorare i progressi. Per output di esempio, vedi Trasporto di un database PostgreSQL alla destinazione dall'origine.

pg_transport.work_mem

La quantità massima di memoria da allocare per ogni processo di lavoro. Il valore predefinito è 131072 kilobyte (KB) o 262144 KB (256 MB), a seconda della versione di PostgreSQL. Il valore minimo è 64 megabyte (65536 KB). I valori validi sono unità in base 2 binarie espresse in kilobyte (KB), dove 1 KB = 1024 byte.

Il trasporto potrebbe utilizzare meno memoria rispetto a quella specificata in questo parametro. Anche i trasporti di database di dimensioni maggiori in genere richiedono meno di 256 MB (262144 KB) di memoria per dipendente.