Diagnosticar problemas nas migrações do PostgreSQL para o AlloyDB

Resolver problemas de migração

O processo de job de migração pode gerar erros durante o tempo de execução.

  • Alguns erros, como uma senha incorreta no banco de dados de origem, são recuperáveis, o que significa que eles podem ser corrigidos e o job de migração é retomado automaticamente.
  • Alguns são irrecuperáveis, como erros na replicação de dados, o que significa que o job de migração precisa ser reiniciado do início.

Quando ocorre um erro, o status do job de migração muda para Failed, e o substatus reflete o último status antes da falha.

Para resolver um problema, acesse o job de migração com falha para ver o erro e siga as etapas descritas na mensagem de erro.

Para ver mais detalhes sobre o erro, acesse o Cloud Monitoring usando o link no job de migração. Os registros são filtrados para o job de migração específico.

Na tabela a seguir, você encontra alguns exemplos de problemas e como eles podem ser resolvidos:

Sintoma Causas possíveis O que você pode tentar
Falha ao se conectar à instância do banco de dados de origem. Houve um problema de conectividade entre a instância do banco de dados de origem e a instância de destino. Siga as etapas em Como depurar a conectividade.
Falha ao executar o job de migração devido a versões incompatíveis do banco de dados de origem e de destino. As versões do banco de dados de origem e de destino não são uma combinação compatível. Especificamente, a versão do banco de dados de origem fornecida é incompatível com a versão do banco de dados de destino. Verifique se a versão do banco de dados de destino é a mesma ou uma versão principal acima da versão do banco de dados de origem. Em seguida, crie um novo job de migração.
As linguagens de definição de dados (DDLs) ou as linguagens de manipulação de dados (DMLs) estão bloqueadas na origem. As DDLs que exigem o ACCESS EXCLUSIVE bloqueio e estão em execução durante a fase de dump completo são bloqueadas.

Durante o processo de sincronização inicial (dump completo), as DDLs ou programas que exigem ACCESS EXCLUSIVE bloqueios como ALTER TABLE ou DROP TABLE precisam ser evitados nas tabelas. Caso contrário, as DDLs ou programas vão aguardar até que a sincronização inicial seja concluída.

Por exemplo, se uma tabela ainda estiver no processo de sincronização inicial e um comando ALTER TABLE for executado na mesma tabela, o comando não será executado e os comandos DDL e DML subsequentes serão bloqueados até que a sincronização inicial seja concluída.

Mensagem de erro: No pglogical extension installed on databases (X) Um ou mais bancos de dados de origem não têm pglogical instalado. Siga estas diretrizes para instalar pglogical nos bancos de dados da instância de origem.
Mensagem de erro: Replication user 'x' doesn't have sufficient privileges. O usuário que está usando o Database Migration Service não tem os privilégios necessários para realizar a operação designada. Siga estas diretrizes para garantir que esse usuário tenha os privilégios necessários.
Mensagem de erro: Unable to connect to source database server. O Database Migration Service não pode estabelecer uma conexão com o servidor de banco de dados de origem. Verifique se as instâncias de banco de dados de origem e de destino podem se comunicar entre si e se você concluiu todos os pré-requisitos necessários que apareceram ao definir as configurações do job de migração.
Mensagem de erro: The source database 'wal_level' configuration must be equal to 'logical'. O wal_level do banco de dados de origem está definido como um valor diferente de logical. Defina o wal_level como logical.
Mensagem de erro: The source database 'max_replication_slots' configuration is not sufficient. O parâmetro max_replication_slots não foi configurado corretamente. Siga estas diretrizes para definir esse parâmetro corretamente.
Mensagem de erro: The source database 'max_wal_senders' configuration is not sufficient. O parâmetro max_wal_senders não foi configurado corretamente. Siga estas diretrizes para definir esse parâmetro corretamente.
Mensagem de erro: The source database 'max_worker_processes' configuration is not sufficient. O parâmetro max_worker_processes não foi configurado corretamente. Siga estas diretrizes para definir esse parâmetro corretamente.

Mensagem de erro: Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.

OU

Mensagem de erro: Error promoting EM replica: finished drop replication with errors.

As configurações necessárias para a replicação não podem ser limpas durante a promoção de um job de migração.

Para cada banco de dados, execute comandos como um usuário com o privilégio superuser.

Para mais informações sobre quais comandos executar, consulte Limpar slots de replicação.

Mensagem de erro: x509 certificate signed by unknown authority.

O certificado de CA de origem fornecido ao Database Migration Service pode conter apenas o certificado raiz. No entanto, o certificado de origem exige o certificado raiz e todos os certificados intermediários.

Por exemplo, para o Amazon Relational Database Service, o uso do certificado rds-ca-2019-root.pem pode resultar nesse problema.

Crie um certificado de CA de origem combinado que contenha o certificado raiz e todos os certificados intermediários necessários.

Para o caso de uso do Amazon Relational Database Service, em vez do certificado rds-ca-2019-root.pem, use o certificado rds-combined-ca-bundle.pem.

Mensagem de erro: ERROR: Out of shared memory HINT: You might need to increase max_locks_per_transaction.

O valor definido para o max_locks_per_transaction parâmetro não é suficiente. Defina o valor desse parâmetro como pelo menos {max_number_of_tables_per_database}/(max_connections + max_prepared_transactions).

Mensagem de erro: ERROR: no data left in message.

O pacote pglogical não está instalado corretamente na instância de origem. Para mais informações sobre como instalar esse pacote corretamente, consulte Instalar o pacote pglogical na instância de origem.

Mensagem de erro: Cannot assign TransactionIds during recovery.

A origem configurada está no modo de recuperação. Configure uma origem que não esteja no modo de recuperação.
O dump completo é lento. O destino do AlloyDB pode ser lento na importação de dados grandes do banco de dados de origem.
  • Escolha um nível mais alto para o destino do AlloyDB para receber a largura de banda máxima disponível de rede e disco.
  • Ajuste a flag max_wal_size do destino do AlloyDB. Normalmente, 32 GB ou 64 GB é um bom valor para definir essa flag. A atualização dessa flag não exige que você reinicie o servidor.
Mensagem de erro: subscriber {subscriber_name} initialization failed during nonrecoverable step (d), please try the setup again

O job de migração falhou durante a fase de dump completo e não é recuperável. A instância do banco de dados de origem foi reiniciada ou está no modo de recuperação, ou as conexões de replicação terminaram devido a um valor insuficiente definido para o wal_sender_timeout parâmetro.

Para descobrir a causa raiz do problema:

  1. Acesse a página do Análise de registros no Google Cloud console.
  2. Na lista de recursos, selecione a instância do AlloyDB. Uma lista dos registros mais recentes da instância aparece.
  3. Nos nomes dos arquivos de registro, selecione postgres.log.
  4. Defina o nível de gravidade do registro para todos os níveis acima de Warning. Os primeiros registros de erro podem ser a causa raiz da falha.
  • Verifique se o Database Migration Service sempre pode se conectar à instância do banco de dados de origem durante a fase de dump completo.
  • Verifique se o valor do parâmetro wal_sender_timeout está definido como um número maior (por exemplo, 0) na instância do banco de dados de origem.
  • Reinicie o job de migração e tente novamente.
Mensagem de erro: ERROR: unknown column name {column_name}

Uma coluna foi adicionada a uma tabela replicada no nó principal, mas não no nó de réplica.

Somente as alterações da linguagem de manipulação de dados (DML) são atualizadas automaticamente durante as migrações contínuas. O gerenciamento das alterações da linguagem de definição de dados (DDL) para que os bancos de dados de origem e de destino permaneçam compatíveis é de responsabilidade do usuário e pode ser feito de duas maneiras:

  • Interrompa as gravações no banco de dados de origem e execute os comandos DDL na origem e no destino. Antes de executar os comandos DDL no destino, conceda o papel cloudsqlexternalsync ao usuário do Cloud SQL que aplica as alterações DDL.
  • Use o pglogical.replicate_ddl_command para permitir que os comandos DDL sejam executados na origem e no destino em um ponto consistente. O usuário que executa os comandos precisa ter o mesmo nome de usuário na origem e no destino e precisa ser o superusuário ou o proprietário do artefato que está sendo migrado (por exemplo, a tabela, a sequência, a visualização ou o banco de dados).
  • Consulte Migração contínua para encontrar exemplos de uso do pglogical.replicate_ddl_command.

Mensagem de erro: ERROR: cannot truncate a table referenced in a foreign key constraint

O usuário tentou truncar uma tabela que tem uma restrição chave externa.

Remova a restrição chave externa primeiro e, em seguida, trunque a tabela.

Mensagem de erro: ERROR: connection to other side has died

A conexão de replicação terminou devido a um valor insuficiente definido para o wal_sender_timeout parameter. O erro geralmente ocorre durante a fase de replicação após o sucesso do dump inicial.

Considere aumentar o valor do parâmetro wal_sender_timeout ou desativar o mecanismo de tempo limite definindo o valor como 0 na instância do banco de dados de origem.

Quando você migra bancos de dados selecionados e o job de migração não consegue replicar dados para um ou mais bancos de dados, um status Falha é exibido na lista de bancos de dados. Vários erros de job de migração.

Na coluna Erros, clique em Ver erros e corrija-os. Também é possível remover os bancos de dados com falha do job de migração.

Para mais informações sobre como remover um banco de dados com falha de um job de migração, consulte Gerenciar jobs de migração.

Limpar slots de replicação

Você encontra uma das seguintes mensagens:

  • Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.
  • Error promoting EM replica: finished drop replication with errors.

Causas possíveis

Ao promover uma instância do AlloyDB, se a instância de origem não puder ser acessada pela instância do AlloyDB (por exemplo, a instância de origem não está em execução ou você removeu a instância do AlloyDB da lista de permissões de instâncias de origem), as configurações necessárias para a replicação não poderão ser limpas durante a promoção de um job de migração. É necessário limpar os slots de replicação manualmente.

O que você pode tentar

Para cada banco de dados, execute os comandos a seguir como um usuário com o privilégio superuser:

  1. Receba os nomes dos slots de replicação da mensagem de erro e execute o comando a seguir para remover os slots, um por um:

    select pg_drop_replication_slot({slot_name});
  2. Se os nomes dos slots de replicação não estiverem disponíveis na mensagem de erro, execute o comando a seguir para consultar os slots de replicação atuais:

    select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name like '%alloydb%' and active = 'f';
  3. Se não houver réplicas do AlloyDB usando a instância de origem, execute o comando a seguir para limpar as configurações pglogical:

    select pglogical.drop_node(node_name) from pglogical.node where node_name like 'alloydb';
  4. Se a extensão pglogical não for mais necessária, execute o comando a seguir para desinstalar a extensão:

    DROP EXTENSION IF EXISTS pglogical;

Excluir clusters órfãos do AlloyDB no modo de inicialização

Em casos extremos raros, você pode descobrir que o job de migração foi excluído, mas o cluster do AlloyDB associado não foi e ainda está no modo de inicialização. É possível excluir o cluster usando o comando gcloud do AlloyDB para excluir um cluster, combinado com a opção --force.

A exclusão de um cluster de inicialização enquanto ele está sendo usado por um job de migração resulta em um comportamento indefinido.

Gerenciar usuários e papéis

Migrar usuários atuais

No momento, o Database Migration Service não oferece suporte à migração de usuários atuais de uma instância de origem para uma instância de destino do AlloyDB. Você pode gerenciar essa migração criando os usuários no AlloyDB manualmente.

Sobre o usuário alloydbexternalsync

Durante a migração, todos os objetos na instância principal do AlloyDB pertencem ao usuário alloydbexternalsync. Depois que os dados são migrados, é possível modificar a propriedade dos objetos para outros usuários seguindo estas etapas:

  • Execute o comando GRANT alloydbexternalsync to {USER}.
  • Em cada banco de dados, execute o comando reassign owned by alloydbexternalsync to {USER};.
  • Para remover o usuário alloydbexternalsync, execute o comando drop role alloydbexternalsync.