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:
Vários bancos de dados: utilize o Data Transmission Service (DTS).
Instância inteira: use o recurso de migração para a nuvem do ApsaraDB RDS for PostgreSQL.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância ApsaraDB RDS for PostgreSQL executando a mesma versão do PostgreSQL da sua instância auto-gerenciada. Para mais detalhes, consulte Crie uma instância ApsaraDB RDS for PostgreSQL.
Uma conta privilegiada na instância RDS. Para mais detalhes, consulte Crie uma conta.
Uma conta de administrador com a função superuser na instância PostgreSQL auto-gerenciada.
O endpoint e o número da porta da instância RDS. Para mais detalhes, consulte Visualize e altere os endpoints e números de porta de uma instância ApsaraDB RDS for PostgreSQL.
A lista de permissões da instância RDS configurada para permitir conexões do servidor que hospeda sua instância auto-gerenciada. Para mais detalhes, consulte Configure uma lista de permissões de endereços IP.
O pg_dump e o pg_restore instalados no servidor que hospeda sua instância auto-gerenciada. Execute
pg_dump --versionepg_restore --versionpara confirmar.
É 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.
-
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 testuserA 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='; Conecte-se à instância RDS usando a conta privilegiada. Para mais detalhes, consulte Conectar-se a uma instância ApsaraDB RDS for PostgreSQL.
-
Substitua
SUPERUSERporrds_SUPERUSERna 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 |
|
|
Nome do novo banco de dados no RDS (pode ser diferente do nome de origem) |
|
|
|
Deve corresponder ao proprietário do banco de dados de origem |
|
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.
-
Crie e configure o arquivo de senhas
.pgpasspara 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 ~/.pgpassAdicione as duas linhas a seguir. O formato é
host:port:dbname:username:password. Os valores paradbnameeusernamedevem 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 fortestdb_rdse o banco de dados de origem fortestdb:rm-bp1xxxx.pg.rds.aliyuncs.com:5432:testdb_rds:testuser:YourPassword 127.0.0.1:5432:testdb:testuser:YourPassword -
Defina as permissões necessárias para o arquivo:
chmod 700 ~/.pgpass -
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 & -
Após a conclusão do comando, verifique o arquivo de log. Um arquivo
pg.dump.logvazio 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-transactione-jnã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
Para atualizar a versão do PostgreSQL, consulte Atualizar a versão principal do mecanismo.