Transport de bases de données PostgreSQL entre des instances de base de données - Amazon Relational Database Service

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

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

Limites à l'utilisation de bases de données transportables PostgreSQL

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 des ID d'objet de catalogue système (OID), qui varient souvent durant 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 ACL – Les privilèges d'accès et les informations de propriété de la base de données source ne sont pas transporté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

Avant de commencer, vérifiez que vos instances de base de données RDS for 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é.

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 paramètre de bas 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 plus d'informations, consultez Utilisation des groupes de paramètres.

  2. 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 (Consommation des ressources) dans la documentation de PostgreSQL.

    Pour de plus amples informations sur les paramètres pg_transport, veuillez consulter Référence des paramètres des bases de données transportables .

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

  4. Connectez-vous à votre instance de base de données source RDS for PostgreSQL.

    psql --host=source-instance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
  5. 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.

  6. Installez l'extension pg_transport comme suit :

    postgres=> CREATE EXTENSION pg_transport; CREATE EXTENSION
  7. Connectez-vous à votre instance de base de données de destination RDS for 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

Une fois terminé le processus décrit dans Configuration pour le transport d'une base de données PostgreSQL, 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.

Que se passe-t-il durant le transport d'une base de données ?

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 pour l'instance de base de données de destination, une sauvegarde est automatiquement effectuée une fois le transport terminé. Les restaurations ponctuelles 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;

Référence des fonctions des base de données transportables

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_password

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_run

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_run sur true.

Example (Exemple)

Pour obtenir un exemple, veuillez consulter Transport d'une base de données PostgreSQL vers la destination depuis la source.

Référence des paramètres des bases de données transportables

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.

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 (Ko) sous forme d'unités binaires de base 2, où 1 Ko = 1 024 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.