Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Use pg_dump and pg_restore to migrate data from a self-managed PostgreSQL instance to an ApsaraDB RDS for PostgreSQL instance

Última atualização: Jun 26, 2026

Este guia demonstra como migrar um único banco de dados de uma instância PostgreSQL auto-gerenciada para o ApsaraDB RDS for PostgreSQL com pg_dump e pg_restore.

Quando usar esta abordagem: adote este método se você já conhece pg_dump e pg_restore e precisa migrar apenas um banco de dados. Para outros cenários:

Pré-requisitos

Antes de começar, verifique se você tem:

É possível migrar entre versões diferentes do PostgreSQL, mas recomenda-se fortemente usar a mesma versão para evitar problemas de compatibilidade. Para verificar a versão da sua instância auto-gerenciada, execute psql --version . Após a migração, atualize a versão principal do mecanismo da sua instância RDS. Para mais detalhes, consulte Atualizar a versão principal do mecanismo .
Se sua instância auto-gerenciada estiver em execução em uma instância Elastic Compute Service (ECS), crie a instância RDS na mesma região e virtual private cloud (VPC). A migração de dados pela rede interna é mais rápida e segura. Nesse caso, use o endpoint interno da instância RDS; caso contrário, use o endpoint público.

Etapa 1: Verificar o banco de dados de origem

Conecte-se à sua instância PostgreSQL auto-gerenciada. Na linha de comando psql, execute \l para listar todos os bancos de dados e anote os valores de Owner, Encoding, Collate e Ctype do banco de dados que deseja migrar.

Neste exemplo, o banco de dados de origem é testdb:

                                                 List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider |   Access privileges
-----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =Tc/postgres         +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/postgres          +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/postgres          +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 testdb    | testuser | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |
(4 rows)

Registre esses valores, pois serão necessários na Etapa 3.

Etapa 2: Migrar usuários

O RDS não oferece suporte direto ao privilégio SUPERUSER do PostgreSQL. Antes de migrar os dados, recrie o proprietário do banco de dados de origem na instância RDS com a função rds_SUPERUSER.

  1. No servidor que hospeda sua instância auto-gerenciada, exporte as definições de usuário:

    pg_dumpall -g -h 127.0.0.1 -p 5432 -U testuser

    A saída inclui uma seção Roles. Para testuser, ela será semelhante a:

    CREATE ROLE testuser;
    ALTER ROLE testuser WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:0IEvNqWupQsGcaoDS3SX****3U=';
  2. Conecte-se à instância RDS usando a conta privilegiada. Para mais detalhes, consulte Conectar-se a uma instância ApsaraDB RDS for PostgreSQL.

  3. Substitua SUPERUSER por rds_SUPERUSER na instrução de role e execute-a na instância RDS:

    CREATE ROLE testuser;
    ALTER ROLE testuser WITH rds_SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:0IEvNqWupQsGcaoDS3SX****3U=';

Etapa 3: Criar o banco de dados de destino

Na instância RDS, crie um banco de dados com o mesmo conjunto de caracteres e os mesmos valores de Collate e Ctype do banco de dados de origem registrados na Etapa 1.

CREATE DATABASE <destination-database-name> WITH OWNER <database-owner> TEMPLATE template0 ENCODING 'UTF8' LC_CTYPE 'en_US.UTF-8' LC_COLLATE 'en_US.UTF-8';

Substitua os espaços reservados pelos valores reais:

Espaço reservado

Descrição

Exemplo

<destination-database-name>

Nome do novo banco de dados no RDS (pode ser diferente do nome de origem)

testdb_rds

<database-owner>

Deve corresponder ao proprietário do banco de dados de origem

testuser

Etapa 4: Migrar dados

Escolha o método adequado à sua configuração de rede:

Método

Quando usar

Migração online

O servidor que hospeda sua instância auto-gerenciada consegue acessar a instância RDS diretamente

Migração offline

Não há caminho de rede direto entre os dois ambientes; exporte primeiro, depois copie e importe

Migração online

Execute todas as etapas no servidor que hospeda sua instância auto-gerenciada.

  1. Crie e configure o arquivo de senhas .pgpass para que o pg_dump e o psql possam autenticar sem solicitações interativas. Para detalhes sobre o formato do arquivo de senhas, consulte The Password File.

    vi ~/.pgpass

    Adicione as duas linhas a seguir. O formato é host:port:dbname:username:password. Os valores para dbname e username devem estar em letras minúsculas, a menos que os nomes tenham sido criados com identificadores de caixa mista entre aspas duplas.

    <RDS-endpoint>:5432:<destination-database-name>:<destination-database-owner>:<password>
    127.0.0.1:5432:<source-database-name>:<superuser>:<password>

    Por exemplo, se o endpoint do RDS for rm-bp1xxxx.pg.rds.aliyuncs.com, o banco de dados de destino for testdb_rds e o banco de dados de origem for testdb:

    rm-bp1xxxx.pg.rds.aliyuncs.com:5432:testdb_rds:testuser:YourPassword
    127.0.0.1:5432:testdb:testuser:YourPassword
  2. Defina as permissões necessárias para o arquivo:

    chmod 700 ~/.pgpass
  3. Execute a migração. Este comando transmite a exportação diretamente para a instância RDS:

    nohup pg_dump -F p -h 127.0.0.1 -p 5432 -U <superuser> -d <source-database-name> --no-tablespaces \
      | time psql -h <RDS-endpoint> -p 5432 -U <destination-database-owner> --single-transaction <destination-database-name> \
      > ./pg.dump.log 2>&1 &
  4. Após a conclusão do comando, verifique o arquivo de log. Um arquivo pg.dump.log vazio indica que a migração foi bem-sucedida.

    cat ./pg.dump.log
A flag --single-transaction agrupa todas as operações de importação em uma única transação. Se alguma operação falhar, toda a importação é revertida, permitindo resolver o problema e reimportar os dados corretamente.

Migração offline

Use este método quando os dois servidores não puderem se conectar diretamente. Exporte o banco de dados para um arquivo, copie-o para um host que tenha acesso à instância RDS e, em seguida, importe-o.

Configure a lista de permissões do RDS para permitir o host intermediário antes de importar. Para mais detalhes, consulte Configure uma lista de permissões de endereços IP .

Exportar o banco de dados

No servidor que hospeda sua instância auto-gerenciada:

nohup pg_dump -F c -h 127.0.0.1 -p 5432 -U <superuser> -d <source-database-name> --no-tablespaces \
  -f ./pg.dump > ./pg.dump.log 2>&1 &

Aguarde a conclusão da exportação e confirme se o arquivo pg.dump.log não contém erros.

Importar o banco de dados

Copie o arquivo pg.dump para um host que possa acessar a instância RDS e escolha um dos seguintes métodos de importação:

Opção 1: Importação single-thread

pg_restore -h <RDS-endpoint> -p 5432 -U <destination-database-owner> \
  -d <destination-database-name> --no-tablespaces --single-transaction \
  pg.dump > ./pg.restore.log

Um arquivo pg.restore.log vazio indica que a importação foi bem-sucedida.

A flag --single-transaction garante que a importação seja atômica. Em caso de falha, todas as alterações são revertidas e você pode reimportar após corrigir o problema.

Opção 2: Importação paralela multi-thread

Para bancos de dados grandes, a importação paralela pode reduzir significativamente o tempo de migração:

pg_restore -h <RDS-endpoint> -p 5432 -U <destination-database-owner> \
  -d <destination-database-name> --no-tablespaces \
  -j <number-of-threads> pg.dump > ./pg.restore.log 2>&1 &

Defina -j como um número inteiro positivo. Um valor de 2 a 4 vezes o número de núcleos de CPU do host é um bom ponto de partida, suficiente para utilizar os recursos disponíveis sem causar contenção.

--single-transaction e -j não podem ser usados simultaneamente. Se a importação paralela falhar, limpe todas as tabelas no banco de dados de destino e reimporte para garantir a consistência dos dados.

Verificar a migração

Após a conclusão da importação, faça login na instância RDS e confirme se as tabelas migradas, os dados e a contagem de linhas correspondem ao banco de dados de origem.

Próximos passos

Referências