

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
<a name="PostgreSQL.TransportableDB"></a>

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](PostgreSQL.TransportableDB.Setup.md). È quindi possibile trasportare il database utilizzando la funzione descritta in [ Trasporto di un database PostgreSQL](PostgreSQL.TransportableDB.Transporting.md). 

**Topics**
+ [Cosa succede durante il trasporto del database](#PostgreSQL.TransportableDB.DuringTransport)
+ [Limitazioni all'utilizzo di Transportable Database di PostgreSQL](#PostgreSQL.TransportableDB.Limits)
+ [Configurazione del trasporto di un database PostgreSQL](PostgreSQL.TransportableDB.Setup.md)
+ [Trasporto di un database PostgreSQL alla destinazione dall'origine](PostgreSQL.TransportableDB.Transporting.md)
+ [Riferimento per la funzione Transportable Database](PostgreSQL.TransportableDB.transport.import_from_server.md)
+ [Riferimento per i parametri di Transportable Database](PostgreSQL.TransportableDB.Parameters.md)

## Cosa succede durante il trasporto del database
<a name="PostgreSQL.TransportableDB.DuringTransport"></a>

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 l'istanza DB di destinazione ha i backup automatici abilitati, viene eseguito automaticamente un backup dopo il completamento del trasporto. Point-in-timei ripristini 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;
```

## Limitazioni all'utilizzo di Transportable Database di PostgreSQL
<a name="PostgreSQL.TransportableDB.Limits"></a>

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 dall'oggetto del catalogo di sistema IDs (OIDs), che spesso cambia 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 ACLs**: i privilegi di accesso e le informazioni sulla proprietà del database di origine non vengono trasferiti al 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
<a name="PostgreSQL.TransportableDB.Setup"></a>

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](Overview.RDSSecurityGroups.md).

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 database di origine e di destinazione utilizzano un gruppo di parametri database predefinito, è necessario creare un gruppo di parametri database personalizzato utilizzando la versione appropriata per le istanze. Questa operazione consente di modificare i valori per diversi parametri. Per ulteriori informazioni, consulta [Gruppi di parametri per Amazon RDS](USER_WorkingWithParamGroups.md). 

1. 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](https://www.postgresql.org/docs/current/runtime-config-resource.html) nella documentazione di PostgreSQL. 

   Per ulteriori informazioni sui parametri `pg_transport`, consulta [Riferimento per i parametri di Transportable Database](PostgreSQL.TransportableDB.Parameters.md).

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

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

   ```
   psql --host=source-instance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
   ```

1. Rimuovi le estensioni estranee dallo schema pubblico dell'istanza database. Solo l’estensione `pg_transport` è consentita durante l'effettiva operazione di trasporto.

1. Installa l’estensione `pg_transport` come segue:

   ```
   postgres=> CREATE EXTENSION pg_transport;
   CREATE EXTENSION
   ```

1. 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
<a name="PostgreSQL.TransportableDB.Transporting"></a>

Dopo aver completato il processo descritto in [Configurazione del trasporto di un database PostgreSQL](PostgreSQL.TransportableDB.Setup.md), 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](PostgreSQL.TransportableDB.transport.import_from_server.md). 

# Riferimento per la funzione Transportable Database
<a name="PostgreSQL.TransportableDB.transport.import_from_server"></a>

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\$1password |  La password locale dell'utente corrente per l'istanza database di destinazione. Questo utente deve essere membro del ruolo `rds_superuser`.  | 
| dry\$1run | 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\$1run su true. | 

**Esempio**

Per un esempio, consulta [Trasporto di un database PostgreSQL alla destinazione dall'origine](PostgreSQL.TransportableDB.Transporting.md).

# Riferimento per i parametri di Transportable Database
<a name="PostgreSQL.TransportableDB.Parameters"></a>

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](PostgreSQL.TransportableDB.Transporting.md).

**`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 espressi in kilobyte (KBs) come unità binarie in base 2, 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.