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.
Argomenti
- Limitazioni all'utilizzo di Transportable Database di PostgreSQL
- Configurazione del trasporto di un database PostgreSQL
- Trasporto di un database PostgreSQL alla destinazione dall'origine
- Cosa succede durante il trasporto del database
- Riferimento per la funzione Transportable Database
- Riferimento per i parametri di Transportable Database
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
.
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.
Nel gruppo parametri del database personalizzato, modifica i valori per i seguenti parametri:
shared_preload_libraries
– Aggiungipg_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 dimax_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 risorsenella documentazione di PostgreSQL.
Per ulteriori informazioni sui parametri
pg_transport
, consulta Riferimento per i parametri di Transportable Database .Riavvia l'istanza database RDS for PostgreSQL e l'istanza di destinazione in modo che le impostazioni per i parametri abbiano effetto.
Connettiti all'istanza database RDS for PostgreSQL di origine.
psql --host=
source-instance
.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres --passwordRimuovi le estensioni estranee dallo schema pubblico dell'istanza database. Solo l’estensione
pg_transport
è consentita durante l'effettiva operazione di trasporto.Installa l’estensione
pg_transport
come segue:postgres=>
CREATE EXTENSION pg_transport;
CREATE EXTENSION
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.666666666666
aws-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 |
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 |
dry_run |
Un valore booleano facoltativo che specifica se eseguire un test. L'impostazione predefinita è 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 sutrue
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.