Transportar bancos de dados PostgreSQL entre instâncias de banco de dados - Amazon Relational Database Service

Transportar bancos de dados PostgreSQL entre instâncias de banco de dados

Usando os bancos de dados PostgreSQL transportáveis para Amazon RDS, você pode mover um banco de dados PostgreSQL entre duas instâncias de banco de dados. Essa é uma maneira muito rápida de migrar bancos de dados grandes entre diferentes instâncias de banco de dados. Para usar essa abordagem, suas instâncias de banco de dados devem executar a mesma versão principal do PostgreSQL.

Esse recurso requer que você instale a extensão pg_transport nas instâncias de banco de dados de origem e de destino. A extensão pg_transport fornece um mecanismo de transporte físico que move os arquivos de banco de dados com o mínimo de processamento. Esse mecanismo move os dados muito mais rapidamente que os processos tradicionais de despejo e carregamento, com menos tempo de inatividade.

nota

Os bancos de dados PostgreSQL transportáveis estão disponíveis no RDS para PostgreSQL versões 11.5 e posteriores e 10.10 e posteriores.

Para transportar uma instância de banco de dados PostgreSQL de uma instância de banco de dados do RDS for PostgreSQL para outra, você primeiro configura as instâncias de origem e de destino, conforme detalhado em Configurar uma instância de banco de dados para transporte. Em seguida, você pode transportar o banco de dados usando a função descrita em Como transportar um banco de dados PostgreSQL.

Limitações para o uso de bancos de dados PostgreSQL transportáveis

Os bancos de dados transportáveis têm as seguintes limitações:

  • Réplicas de leitura – não é possível usar bancos de dados transportáveis em réplicas de leitura nem em instâncias pai de réplicas de leitura.

  • Tipos de coluna não compatíveis – não é possível usar os tipos de dados reg em nenhuma tabela de banco de dados que você planeja transportar com esse método. Esses tipos dependem dos IDs de objeto (OIDs) do catálogo do sistema, que geralmente são alterados durante o transporte.

  • Espaços de tabela – todos os objetos do banco de dados de origem devem estar no espaço de tabela pg_default padrão.

  • Compatibilidade – as instâncias de banco de dados de origem e destino devem executar a mesma versão principal do PostgreSQL.

  • Extensões: a instância de banco de dados de origem pode ter apenas a extensão pg_transport instalada.

  • Funções e ACLs – os privilégios de acesso e as informações de propriedade do banco de dados de origem não são transferidos para o banco de dados de destino. Todos os objetos de banco de dados são criados e pertencentes ao usuário de destino local do transporte.

  • Transportes simultâneos: uma única instância de banco de dados pode aceitar até 32 transportes simultâneos, incluindo importações e exportações, se os processos do operador tiverem sido configurados corretamente.

  • Somente para instâncias de banco de dados do RDS for PostgreSQL: os bancos de dados transportáveis do PostgreSQL são compatíveis apenas com instâncias de banco de dados do RDS for PostgreSQL. Não é possível utilizá-los com bancos de dados locais ou bancos de dados em execução no Amazon EC2.

Configurar o transporte de um banco de dados PostgreSQL

Antes de começar, certifique-se de que as instâncias de banco de dados do RDS for PostgreSQL atendam aos seguintes requisitos:

  • As instâncias de banco de dados do RDS for PostgreSQL para a origem e o destino devem ser executadas na mesma versão do PostgreSQL.

  • O banco de dados de destino não pode ter um banco de dados com o mesmo nome do banco de dados de origem que você deseja transportar.

  • A conta que você usa para executar o transporte precisa dos privilégios rds_superuser nos bancos de dados de origem e de destino.

  • O grupo de segurança da instância de banco de dados de origem deve permitir acesso de entrada da instância de banco de dados de destino. Isso pode já ser o caso se as instâncias de banco de dados de origem e de destino estiverem localizadas na VPC. Para obter mais informações sobre grupo de seguranças, consulte Controlar acesso com grupos de segurança.

O transporte de bancos de dados de uma instância de banco de dados de origem para uma instância de banco de dados de destino requer várias alterações no grupo de parâmetros de banco de dados associado a cada instância. Isso significa que você deve criar um grupo de parâmetros de banco de dados personalizado para a instância de banco de dados de origem e criar um grupo de parâmetros de banco de dados personalizado para a instância de banco de dados de destino.

nota

Se suas instâncias de banco de dados já estiverem configuradas usando grupos de parâmetros de banco de dados personalizados, você poderá começar com a etapa 2 no procedimento a seguir.

Para configurar os parâmetros de grupos de banco de dados personalizados para o transporte de bancos de dados

Para as etapas a seguir, use uma conta que tenha os privilégios rds_superuser.

  1. Se as instâncias de banco de dados de origem e de destino usarem um grupo de parâmetros de banco de dados padrão, você precisará criar um grupo de parâmetros de banco de dados personalizado usando a versão apropriada para suas instâncias. Você faz isso para poder alterar valores para vários parâmetros. Para obter mais informações, consulte Trabalhar com grupos de parâmetros.

  2. No grupo de parâmetros de banco de dados personalizado, altere os valores dos seguintes parâmetros:

    • shared_preload_libraries: adicionar pg_transport à lista de bibliotecas.

    • pg_transport.num_workers: o valor padrão é 3. Aumente ou reduza esse valor conforme necessário para o banco de dados. Para um banco de dados de 200 GB, recomendamos não mais que 8. Tenha em mente que, se você aumentar o valor padrão desse parâmetro, você também deverá aumentar o valor de max_worker_processes.

    • pg_transport.work_mem: o valor padrão é 128 MB ou 256 MB, dependendo da versão do PostgreSQL. A configuração padrão geralmente pode ser deixada inalterada.

    • max_worker_processes: o valor desse parâmetro precisa ser definido usando o seguinte cálculo:

      (3 * pg_transport.num_workers) + 9

      Esse valor é obrigatório no destino para lidar com vários processos de operador em segundo plano envolvidos no transporte. Para saber mais sobre max_worker_processes, consulte Consumo de recursos na documentação do PostgreSQL.

    Para obter mais informações sobre parâmetros do pg_transport, consulte Referência de parâmetros de bancos de dados transportáveis .

  3. Reinicialize a instância de banco de dados do RDS for PostgreSQL de origem e a instância de destino para que as configurações dos parâmetros entrem em vigor.

  4. Conecte-se à sua instância de banco de dados do RDS for PostgreSQL de origem.

    psql --host=source-instance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
  5. Remova extensões estranhas do esquema público da instância de banco de dados. Somente a extensão pg_transport é permitida durante a operação de transporte real.

  6. Instale a extensão pg_transport da seguinte forma:

    postgres=> CREATE EXTENSION pg_transport; CREATE EXTENSION
  7. Conecte-se à sua instância de banco de dados do RDS for PostgreSQL de destino. Remova qualquer extensão estranha e, em seguida, instale a extensão pg_transport.

    postgres=> CREATE EXTENSION pg_transport; CREATE EXTENSION

Transportar um banco de dados PostgreSQL para o destino a partir da origem

Depois de concluir o processo descrito em Configurar o transporte de um banco de dados PostgreSQL, você pode iniciar o transporte. Para fazer isso, execute a função transport.import_from_server na instância de banco de dados de destino. Na sintaxe a seguir, você pode encontrar os parâmetros da função.

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

O valor false mostrado no exemplo diz à função que esta não é uma simulação. Para testar sua configuração de transporte, você pode especificar true para dry_run quando você chama a função, conforme mostrado a seguir:

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)

As linhas INFO são emitidas porque o parâmetro pg_transport.timing está definido como seu valor padrão, true. Defina dry_run para false quando você executa o comando e o banco de dados de origem é importado para o destino, conforme mostrado a seguir:

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)

Esta função requer que você forneça senhas de usuário do banco de dados. Portanto, recomendamos que você altere as senhas das funções de usuário usadas após a conclusão do transporte. Ou você pode usar variáveis de ligação do SQL para criar funções de usuário temporárias. Use essas funções temporárias para o transporte e descarte as funções posteriormente.

Quando o transporte não for bem-sucedido, talvez você veja uma mensagem de erro semelhante à seguinte:

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

A mensagem de erro “falha ao baixar dados do arquivo” indica que o número de processos de trabalho não está definido corretamente para o tamanho do banco de dados. Talvez seja necessário aumentar ou diminuir o valor definido para pg_transport.num_workers. Cada falha informa a porcentagem de conclusão, para que você possa ver o impacto de suas alterações. Por exemplo, alterar a configuração de 8 para 4 em um caso resultou no seguinte:

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

Lembre-se de que o parâmetro max_worker_processes também é levado em consideração durante o processo de transporte. Em outras palavras, talvez seja necessário modificar pg_transport.num_workers e max_worker_processes para transportar o banco de dados com êxito. O exemplo mostrado finalmente funcionou quando pg_transport.num_workers foi definido como 2:

pg_transport.num_workers=2 100% of files transported

Para obter mais informações sobre a função transport.import_from_server seus respectivos parâmetros de configuração, consulte Referência de funções de bancos de dados transportáveis.

O que acontece durante o transporte do banco de dados

O recurso de bancos de dados PostgreSQL transportáveis usa um modelo pull para importar o banco de dados da instância de banco de dados de origem para a de destino. A função transport.import_from_server cria o banco de dados em trânsito na instância de banco de dados de destino. O banco de dados em trânsito está inacessível na instância de banco de dados de destino durante o transporte.

Quando o transporte começa, todas as sessões atuais no banco de dados de origem são encerradas. Quaisquer bancos de dados que não sejam o banco de dados de origem na instância de banco de dados de origem não são afetados pelo transporte.

O banco de dados de origem é colocado em um modo somente leitura especial. Enquanto estiver nesse modo, você pode se conectar ao banco de dados de origem e executar consultas somente leitura. No entanto, as consultas habilitadas para gravação e alguns outros tipos de comandos estão bloqueados. Somente o banco de dados de origem específico que está sendo transportado é afetado por essas restrições.

Durante o transporte, você não pode restaurar a instância do banco de dados de destino em um determinado momento. Isso ocorre porque o transporte não é transacional e não usa o log de gravação antecipada do PostgreSQL para registrar as alterações. Se a instância de banco de dados de destino tiver backups automáticos ativados, um backup será feito automaticamente após a conclusão do transporte. As restaurações em um ponto anterior no tempo ficam disponíveis por algumas horas após a conclusão do backup.

Se o transporte falhar, a extensão pg_transport tenta desfazer todas as alterações nas instâncias de banco de dados de origem e destino. Isso inclui a remoção do banco de dados parcialmente transportado do destino. Dependendo do tipo de falha, o banco de dados de origem pode continuar a rejeitar consultas habilitadas para gravação. Se isso acontecer, use o comando a seguir para permitir consultas habilitadas para gravação.

ALTER DATABASE db-name SET default_transaction_read_only = false;

Referência de funções de bancos de dados transportáveis

A função transport.import_from_server transporta um banco de dados PostgreSQL importando-o de uma instância de banco de dados de origem para uma instância de banco de dados de destino. Isso é feito usando um mecanismo de transporte de conexão de banco de dados físico.

Antes de iniciar o transporte, essa função verifica se as instâncias de banco de dados de origem e de destino são da mesma versão e são compatíveis com a migração. Também confirma que a instância de banco de dados de destino tem espaço suficiente para a origem.

Sintaxe

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

Valor de retorno

Nenhum.

Parâmetros

Você pode encontrar descrições dos parâmetros da função transport.import_from_server na tabela a seguir.

Parâmetro Descrição
host

O endpoint da instância de banco de dados de origem.

port Um número inteiro que representa a porta da instância de banco de dados de origem.

As instâncias de banco de dados do PostgreSQL costumam usar a porta 5432.

username

O usuário da instância de banco de dados de origem. Este usuário deve ser um membro da função rds_superuser.

password

A senha da instância de banco de dados de origem.

database

O nome do banco de dados na instância do banco de dados de origem a ser transportada.

local_password

A senha local do usuário atual para a instância de banco de dados de destino. Este usuário deve ser um membro da função rds_superuser.

dry_run

Um valor booleano opcional que especifica se é necessário executar uma simulação. O padrão é false, o que significa que o transporte continua.

Para confirmar a compatibilidade entre as instâncias de banco de dados de origem e destino sem executar o transporte real, configure dry_run como true.

Exemplo

Para ver um exemplo, consulte Transportar um banco de dados PostgreSQL para o destino a partir da origem.

Referência de parâmetros de bancos de dados transportáveis

Vários parâmetros controlam o comportamento da extensão pg_transport. A seguir, você pode encontrar as descrições desses parâmetros.

pg_transport.num_workers

O número de operadores a serem usados para o processo de transporte. O padrão é 3. Os valores válidos são 1–32. Geralmente, mesmo os maiores transportes de banco de dados exigem menos de oito operadores. O valor dessa configuração na instância de banco de dados de destino é usada pelo destino e pela origem durante o transporte.

pg_transport.timing

Especifica se é necessário relatar informações de tempo durante o transporte. O padrão é true, o que significa que as informações de tempo são relatadas. Recomendamos deixar esse parâmetro definido como true para que você possa monitorar o progresso. Veja um exemplo de resultado em Transportar um banco de dados PostgreSQL para o destino a partir da origem.

pg_transport.work_mem

A quantidade máxima de memória a ser alocada para cada operador. O padrão é 131.072 kilobytes (KB) ou 262.144 KB (256 MB), dependendo da versão do PostgreSQL. O valor mínimo é de 64 megabytes (65.536 KB). Os valores válidos estão em kilobytes (KBs) como unidades binárias de base 2, em que 1 KB = 1.024 bytes.

O transporte pode usar menos memória que o especificado neste parâmetro. Geralmente, mesmo transportes grandes de banco de dados exigem menos de 256 MB (262.144 KB) de memória por operador.