

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Transport de bases de données PostgreSQL entre des instances de base de données
<a name="PostgreSQL.TransportableDB"></a>

En utilisant les bases de données transportables PostgreSQL pour Amazon RDS, vous pouvez déplacer une base de données PostgreSQL entre deux instances de base de données. Il s'agit d'un moyen très rapide de migrer de grandes bases de données entre différentes instances de base de données. Pour utiliser cette approche, vos instances de base de données doivent toutes deux exécuter la même version majeure de PostgreSQL. 

Cette fonctionnalité nécessite que vous installiez l'extension `pg_transport` sur les instances de base de données source et de destination. L'extension `pg_transport` fournit un mécanisme de transport physique qui déplace les fichiers de base de données avec un traitement minimal. Ce mécanisme déplace les données beaucoup plus rapidement que les processus traditionnels de vidage et de chargement, avec moins de temps d'arrêt. 

**Note**  
Les bases de données transportables PostgreSQL sont disponibles dans RDS for PostgreSQL versions 10.10 et ultérieures, ansi que versions 11.5 et ultérieures.

Pour transporter une instance de base de données PostgreSQL d'une instance de base de données RDS for PostgreSQL à une autre, vous devez d'abord configurer les instances source et de destination, comme indiqué dans la section [ Configuration d'instances de base de données pour leur transport](PostgreSQL.TransportableDB.Setup.md). Vous pouvez ensuite transporter la base de données à l'aide de la fonction décrite dans [ Transport d'une base de données PostgreSQL](PostgreSQL.TransportableDB.Transporting.md). 

**Topics**
+ [Que se passe-t-il durant le transport d'une base de données ?](#PostgreSQL.TransportableDB.DuringTransport)
+ [Limites à l'utilisation de bases de données transportables PostgreSQL](#PostgreSQL.TransportableDB.Limits)
+ [Configuration pour le transport d'une base de données PostgreSQL](PostgreSQL.TransportableDB.Setup.md)
+ [Transport d'une base de données PostgreSQL vers la destination depuis la source](PostgreSQL.TransportableDB.Transporting.md)
+ [Référence des fonctions des base de données transportables](PostgreSQL.TransportableDB.transport.import_from_server.md)
+ [Référence des paramètres des bases de données transportables](PostgreSQL.TransportableDB.Parameters.md)

## Que se passe-t-il durant le transport d'une base de données ?
<a name="PostgreSQL.TransportableDB.DuringTransport"></a>

La fonction de bases de données transportables PostgreSQL utilisent un modèle d'extraction pour importer la base de données à partir de l'instance de base de données source. La fonction `transport.import_from_server` crée la base de données en transit sur l'instance de base de données de destination. La base de données en transit est inaccessible sur l'instance de base de données de destination pendant toute la durée du transport.

Lorsque le transport commence, toutes les sessions en cours sur la base de données source cessent. Les bases de données autres que la base de données source sur l'instance de base de données source ne sont pas affectées par le transport. 

La base de données source est placée dans un mode lecture seule spécial. Lorsqu'elle est dans ce mode, vous pouvez vous connecter à la base de données source et exécuter des requêtes de lecture seule. Par contre, les requêtes d'écriture et certains autres types de commandes sont bloqués. Seule la base de données source qui fait l'objet du transport est affectée par ces restrictions. 

Durant le transport, vous ne pouvez pas restaurer l'instance de base de données de destination à un instant dans le passé. En effet, le transport n'est pas transactionnel et n'utilise pas le journal write-ahead (WAL) PostgreSQL pour enregistrer les modifications. Si les sauvegardes automatiques sont activées sur l'instance de base de données de destination, une sauvegarde est automatiquement effectuée une fois le transport terminé. Point-in-timeles restaurations sont disponibles pendant un certain temps *après* la fin de la sauvegarde.

En cas d'échec du transport, l'extension `pg_transport` tente d'annuler toutes les modifications apportées aux instances de base de données source et de destination. Cela inclut la suppression de la base de données partiellement transportée sur la destination. Selon le type de défaillance, la base de données source peut continuer à rejeter les requêtes d'écriture. Si tel est le cas, utilisez la commande suivante pour autoriser les requêtes d'écriture.

```
ALTER DATABASE db-name SET default_transaction_read_only = false;
```

## Limites à l'utilisation de bases de données transportables PostgreSQL
<a name="PostgreSQL.TransportableDB.Limits"></a>

Les bases de données transportables présentent les limites suivantes :
+ **Réplicas en lecture **– Vous ne pouvez pas utiliser des bases de données transportables sur des réplicas en lecture ou des instances parentes de réplicas en lecture.
+ **Types de colonne non pris en charge** – Vous ne pouvez pas utiliser les types de données `reg` dans des tables de bases de données que vous souhaitez transporter avec cette méthode. Ces types dépendent de l'objet du catalogue système IDs (OIDs), qui change souvent pendant le transport.
+ **Espaces de tables** – Tous les objets de base de données sources doivent se trouver dans l'espace de table `pg_default` par défaut . 
+ **Compatibilité** – Les instances de base de données source et destination doivent exécuter la même version majeure de PostgreSQL. 
+ **Extensions** : l'instance de base de données source ne peut avoir que `pg_transport` installé. 
+ **Rôles et ACLs** — Les privilèges d'accès et les informations de propriété de la base de données source ne sont pas transférés vers la base de données de destination. Tous les objets de base de données sont créés par l'utilisateur de destination locale du transport et sont sa propriété.
+ **Transports simultanés** : une seule instance de base de données peut prendre en charge jusqu'à 32 transports simultanés, y compris les importations et les exportations, si les processus de travail ont été correctement configurés. 
+ **Uniquement RDS pour les instances de bases de données PostgreSQL** : les bases de données transportables PostgreSQL ne sont prises en charge que sur les instances de base de données RDS for PostgreSQL. Vous ne pouvez pas l'utiliser avec des bases de données locales ou des bases de données exécutées sur Amazon EC2.

# Configuration pour le transport d'une base de données PostgreSQL
<a name="PostgreSQL.TransportableDB.Setup"></a>

Avant de commencer, vérifiez que vos instances de base de données RDS pour PostgreSQL répondent aux exigences suivantes :
+ Les instances de base de données source et destination doivent exécuter la même version de PostgreSQL.
+ La base de données de destination ne peut pas avoir de base de données portant le même nom que la base de données source que vous souhaitez transporter.
+ Le compte que vous utilisez pour exécuter le transport doit avoir les privilèges `rds_superuser` sur les bases de données source et de destination. 
+ Le groupe de sécurité de l'instance de base de données source doit autoriser l'accès entrant depuis l'instance de base de données de destination. C'est peut-être déjà le cas si vos instances de base de données source et de destination se trouvent dans le VPC. Pour plus d’informations sur les groupes de sécurité, consultez [Contrôle d’accès par groupe de sécurité](Overview.RDSSecurityGroups.md).

Le transport de bases de données d'une instance de base de données source vers une instance de base de données de destination nécessite plusieurs modifications apportées au groupe de paramètres de base de données associé à chaque instance. Cela signifie que vous devez créer un groupe de paramètres de base de données personnalisé pour l'instance de base de données source et créer un groupe de paramètres de base de données personnalisé pour l'instance de base de données de destination.

**Note**  
Si vos instances de base de données sont déjà configurées à l'aide de groupes de paramètres de base de données personnalisés, vous pouvez commencer par l'étape 2 de la procédure suivante. 

**Pour configurer les paramètres de groupe de base de données personnalisés pour le transport de bases de données**

Pour les étapes suivantes, utilisez un compte doté des privilèges `rds_superuser`. 

1. Si les instances de base de données source et de destination utilisent un groupe de paramètres de base de données par défaut, vous devez créer un groupe de paramètres de base de données personnalisé à l’aide de la version appropriée pour vos instances. Vous pouvez ainsi modifier les valeurs de plusieurs paramètres. Pour de plus amples informations, veuillez consulter [Groupes de paramètres pour Amazon RDS](USER_WorkingWithParamGroups.md). 

1. Dans le groupe de paramètres de base de données personnalisé, modifiez les valeurs des paramètres suivants :
   + `shared_preload_libraries` : ajoutez `pg_transport` à la liste des bibliothèques. 
   + `pg_transport.num_workers` : la valeur par défaut est 3. Augmentez ou réduisez cette valeur au besoin pour votre base de données. Pour une base de données de 200 Go, nous recommandons de ne pas dépasser 8. N'oubliez pas que si vous augmentez la valeur par défaut de ce paramètre, vous devez également augmenter la valeur de `max_worker_processes`. 
   + `pg_transport.work_mem` : la valeur par défaut est 128 Mo ou 256 Mo, selon la version PostgreSQL. Le paramètre par défaut peut généralement rester inchangé. 
   + `max_worker_processes` : la valeur de ce paramètre doit être définie à l'aide du calcul suivant :

     ```
     (3 * pg_transport.num_workers) + 9
     ```

     Cette valeur est nécessaire au niveau de la destination pour gérer les divers processus employés en arrière-plan impliqués dans le transport. Pour en savoir plus sur `max_worker_processes,`, consultez [Resource Consumption](https://www.postgresql.org/docs/current/runtime-config-resource.html) (Consommation des ressources) dans la documentation de PostgreSQL. 

   Pour de plus amples informations sur les paramètres `pg_transport`, consultez [Référence des paramètres des bases de données transportables](PostgreSQL.TransportableDB.Parameters.md).

1. Redémarrez l’instance de base de données source RDS pour PostgreSQL et l’instance de destination pour que les paramètres prennent effet.

1. Connectez-vous à votre instance de base de données source RDS pour PostgreSQL.

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

1. Supprimez les extensions externes du schéma public de l'instance de base de données. Seule l'extension `pg_transport` est autorisée pendant l'opération de transport réelle.

1. Installez l'extension `pg_transport` comme suit :

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

1. Connectez-vous à votre instance de base de données de destination RDS pour PostgreSQL. Supprimez toutes les extensions externes, puis installez l'extension `pg_transport`.

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

# Transport d'une base de données PostgreSQL vers la destination depuis la source
<a name="PostgreSQL.TransportableDB.Transporting"></a>

Une fois terminé le processus décrit dans [Configuration pour le transport d'une base de données PostgreSQL](PostgreSQL.TransportableDB.Setup.md), vous pouvez démarrer le transport. Pour cela, exécutez la fonction `transport.import_from_server` sur l'instance de base de données de destination. Dans la syntaxe suivante, vous trouverez les paramètres de la fonction.

```
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);
```

Le valeur `false` illustrée dans l'exemple indique à la fonction qu'il ne s'agit pas d'un test. Pour tester la configuration de votre transport, vous pouvez spécifier `true` pour `dry_run` lorsque vous appelez la fonction, comme illustré ci-après :

```
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)
```

Les lignes INFO sont affichées car le paramètre `pg_transport.timing` est défini sur sa valeur par défaut, à savoir `true`. Définissez `dry_run` à la valeur `false` lorsque vous exécutez la commande et que la base de données source est importée vers la destination, comme indiqué ci-dessous :

```
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)
```

Cette fonction nécessite que vous fournissiez les mots de passe utilisateur de la base de données. Nous vous recommandons donc de modifier les mots de passe des rôles utilisateur que vous avez utilisés une fois le transport terminé. Vous pouvez aussi utiliser des variables de liaison SQL pour créer des rôles utilisateur temporaires. Utilisez ces rôles temporaires pour le transport, puis supprimez-les une fois que vous n'en avez plus besoin. 

Si votre transport n'est pas réussi, vous pouvez voir un message d'erreur similaire à ce qui suit :

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

Le message d'erreur « Impossible de télécharger les données du fichier » indique que le nombre de processus de travail n'est pas défini correctement pour la taille de la base de données. Vous devrez peut-être augmenter ou diminuer la valeur définie pour `pg_transport.num_workers`. Chaque échec indique le pourcentage d'achèvement, afin que vous puissiez voir l'impact de vos modifications. Par exemple, la modification du paramètre de 8 à 4 dans un cas a entraîné les résultats suivants :

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

Gardez à l'esprit que le paramètre `max_worker_processes` est également pris en compte pendant le processus de transport. Autrement dit, vous devrez peut-être modifier à la fois `pg_transport.num_workers` et `max_worker_processes` pour transporter correctement la base de données. L'exemple présenté a finalement fonctionné lorsque le `pg_transport.num_workers` a été réglé sur 2 :

```
pg_transport.num_workers=2 100% of files transported
```

Pour plus d'informations sur la fonction `transport.import_from_server` et ses paramètres, veuillez consulter [Référence des fonctions des base de données transportables](PostgreSQL.TransportableDB.transport.import_from_server.md). 

# Référence des fonctions des base de données transportables
<a name="PostgreSQL.TransportableDB.transport.import_from_server"></a>

La fonction `transport.import_from_server` transporte une base de données PostgreSQL en l'important d'une instance de base de données source vers une instance de base de données de destination. Elle effectue cette opération en utilisant un mécanisme de transport physique de connexion de base de données.

Avant de démarrer le transport, cette fonction vérifie que les instances de base de données source et de destination sont de la même version et sont compatibles avec la migration. Elle confirme également que l'instance de base de données de destination dispose de suffisamment d'espace pour la source. 

**Syntaxe**

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

**Valeur renvoyée**

Aucun.

**Paramètres**

Le tableau ci-dessous contient les descriptions des paramètres de la fonction `transport.import_from_server`.


****  

| Paramètre | Description | 
| --- | --- | 
| host |  Point de terminaison de l'instance de base de données source.  | 
| port | Entier représentant le port de l'instance de base de données source. Les instances de base de données PostgreSQL utilisent souvent le port 5432. | 
| username |  Utilisateur de l'instance de base de données source. Cet utilisateur doit être membre du rôle `rds_superuser`.  | 
| password |  Mot de passe utilisateur de l'instance de base de données source.  | 
| database |  Nom de la base de données à transporter à partir de l'instance de base de données source.  | 
| local\$1password |  Mot de passe local de l'utilisateur actuel pour l'instance de base de données de destination. Cet utilisateur doit être membre du rôle `rds_superuser`.  | 
| dry\$1run | Valeur booléenne facultative spécifiant si un essai est nécessaire. La valeur par défaut est `false`, ce qui signifie que le transport est effectué.Pour vérifier la compatibilité entre les instances de base de données source et de destination sans effectuer le transport réel, définissez dry\$1run sur true. | 

**Exemple**

Pour obtenir un exemple, consultez [Transport d'une base de données PostgreSQL vers la destination depuis la source](PostgreSQL.TransportableDB.Transporting.md).

# Référence des paramètres des bases de données transportables
<a name="PostgreSQL.TransportableDB.Parameters"></a>

Plusieurs paramètres contrôlent le comportement de l'extension `pg_transport`. Vous trouverez ci-dessous la description de ces paramètres. 

**`pg_transport.num_workers`**  
Le nombre d'unités de travail à utiliser pour le processus de transport. La valeur par défaut est 3. Les valeurs valides vont de 1 à 32. Même les transports de base de données les plus volumineux nécessitent généralement moins de 8 unités de travail. La valeur de ce paramètre sur l'instance de base de données de destination est utilisée par la destination et la source pendant le transport.

**`pg_transport.timing` **  
Indique s'il faut signaler les informations de synchronisation pendant le transport. La valeur par défaut est `true`, ce qui signifie que les informations de synchronisation sont signalées. Nous vous recommandons de laisser ce paramètre défini sur `true` pour que vous puissiez suivre les progrès réalisés. Pour un exemple de sortie, veuillez consulter [Transport d'une base de données PostgreSQL vers la destination depuis la source](PostgreSQL.TransportableDB.Transporting.md).

**`pg_transport.work_mem`**  
Quantité de mémoire maximale à allouer à chaque unité de travail. La valeur par défaut est 131 072 kilo-octets (Ko) ou 262 144 Ko (256 Mo), selon la version PostgreSQL. La valeur minimale est de 64 méga-octets (65 536 Ko). Les valeurs valides sont exprimées en kilo-octets (KBs) sous forme d'unités binaires en base 2, où 1 Ko = 1024 octets.   
Le transport peut utiliser moins de mémoire que spécifié dans ce paramètre. Même les transports de base de données volumineux nécessitent généralement moins de 256 Mo (262 144 Ko) de mémoire par unité de travail.