Diagnosticar problemas de migrações homogêneas para o Cloud SQL para PostgreSQL

O processo de job de migração pode apresentar 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 irreversíveis, como erros na replicação de dados, o que significa que o job de migração precisa ser reiniciado desde o início.

Quando um erro ocorre, 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 conferir o erro e siga as etapas descritas na mensagem de erro.

Para conferir 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, confira alguns exemplos de problemas e como resolvê-los:

Para este problema... O problema pode ser... Tente o seguinte...
Ao migrar para uma instância de destino existente, você recebe a seguinte mensagem de erro: The destination instance contains existing data or user defined entities (for example databases, tables, or functions). You can only migrate to empty instances. Clear your destination instance and retry the migration job. A instância de destino do Cloud SQL contém dados extras. Só é possível migrar para instâncias vazias. Consulte As limitações conhecidas. Promova a instância de destino para torná-la uma instância de leitura/gravação, remova os dados extras e tente novamente o job de migração. Consulte Limpar dados extras da instância de destino atual.
Falha ao se conectar à instância do banco de dados de origem. Houve um problema de conectividade entre a instância de origem e a de destino do banco de dados. 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 é igual ou uma versão principal mais recente do que a 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 de manipulação de dados (DMLs) são bloqueadas na origem. Os DDLs que exigem o bloqueio ACCESS EXCLUSIVE e estão em execução durante a fase de despejo completo são bloqueados.

Durante o processo de sincronização inicial (dump completo), DDLs ou programas que exigem bloqueios ACCESS EXCLUSIVE, como ALTER TABLE ou DROP TABLE, devem ser evitados nas tabelas. Caso contrário, os DDLs ou programas vão esperar 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, ele 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 o pglogical nos bancos de dados da instância de origem.
Ao migrar para a versão 15 do PostgreSQL, após várias tentativas de repetição de conexão, um dos seguintes sintomas ocorre:
  • Você recebe uma mensagem de erro Cannot connect to invalid database.
  • A métrica do job de migração de uso do armazenamento não mostra progresso após um longo período quando o job de migração está realizando o despejo completo do banco de dados.
Esse problema geralmente é atribuído ao problema de intertravamento na extensão pglogical. Para mais informações, consulte o pglogical Issue Tracker no GitHub. Tente novamente ou migre primeiro para uma versão intermediária do PostgreSQL. Para mais detalhes, consulte Mensagem de erro: Cannot connect to invalid database.
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 consegue 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 quando definiu 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 é definido como um valor diferente de logical. Defina 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 da AC 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, no 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 parâmetro max_locks_per_transaction 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 despejo completo é lento. O destino do Cloud SQL pode ser lento na importação de dados grandes do banco de dados de origem.
  • Ao criar o destino, defina o tamanho do disco de dados para que ele fique próximo ao tamanho final. A fase de despejo completo usa uma carga de trabalho de E/S com muitas gravações, e um tamanho de disco maior tem um desempenho de E/S melhor. Para mais informações, consulte Desempenho do armazenamento em blocos.
  • Escolha um nível mais alto para o destino do Cloud SQL e aproveite a largura de banda de rede e disco máxima disponível.
  • Ajuste a flag max_wal_size do destino do Cloud SQL. Normalmente, 32 GB ou 64 GB é um bom valor para 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 despejo completa e não pode ser recuperado. A instância do banco de dados de origem foi reiniciada ou está no modo de recuperação. As conexões de replicação foram encerradas devido a um valor insuficiente definido para o parâmetro wal_sender_timeout.

Para encontrar a causa raiz do problema:

  1. Acesse a página Análise de registros no console do Google Cloud .
  2. Na lista de recursos, selecione a réplica do Cloud SQL. Uma lista dos registros mais recentes da réplica vai aparecer.
  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 pode sempre se conectar à instância do banco de dados de origem durante a fase de despejo 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 mudanças na linguagem de manipulação de dados (DML) são atualizadas automaticamente durante as migrações contínuas. O gerenciamento de mudanças na linguagem de definição de dados (DDL) para que os bancos de dados de origem e destino permaneçam compatíveis é 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 a função cloudsqlexternalsync ao usuário do Cloud SQL que aplica as alterações DDL.
  • Use 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 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 os 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 com uma restrição de chave externa.

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

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

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

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

Mensagem de aviso: migration job test configuration has returned the following warnings: Some table(s) have limited support.

A origem tem tabelas com suporte limitado, por exemplo, tabelas sem chaves primárias.

Esta é uma mensagem de alerta. Você pode continuar com a migração, mas observe que entidades sem suporte (por exemplo, tabelas sem chaves primárias) não são migradas. Para mais informações, consulte Configurar seus bancos de dados de origem.

Limpar dados extras da instância de destino atual

Ao migrar para uma instância de destino existente, você recebe a seguinte mensagem de erro: The destination instance contains existing data or user defined entities (for example databases, tables, or functions). You can only migrate to empty instances. Clear your destination instance and retry the migration job.

Esse problema pode ocorrer se a instância de destino tiver dados extras. Só é possível migrar para instâncias vazias. Consulte as limitações conhecidas.

O que você pode tentar

Limpe dados extras da instância de destino e inicie o job de migração novamente seguindo estas etapas:

  1. Interrompa o job de migração.
  2. Nesse ponto, a instância de destino do Cloud SQL está no modo "somente leitura". Promova a instância de destino para ter acesso de gravação.
  3. Conectar-se à instância de destino do Cloud SQL.
  4. Remova dados extras dos bancos de dados de instância de destino. O destino só pode conter dados de configuração do sistema. Os bancos de dados de destino não podem conter dados do usuário, como tabelas. Há diferentes instruções SQL que podem ser executadas nos bancos de dados para encontrar dados que não são do sistema, por exemplo:

    Exemplo de instrução SQL para recuperar bancos de dados que não são do sistema (clique para expandir)

    SELECT datname FROM pg_catalog.pg_database
    WHERE datname NOT IN ('cloudsqladmin', 'template1', 'template0', 'postgres');

    Exemplo de instrução SQL para recuperar dados não do sistema no banco de dados postgres (clique para expandir)

    O banco de dados postgres é um banco de dados do sistema, mas pode conter dados não relacionados ao sistema. Execute essas instruções no banco de dados postgres. Se você usar o cliente psql para se conectar à instância de destino, poderá alternar para outro banco de dados sem redefinir a conexão usando o comando \connect {database_name_here}.

    SELECT table_schema, table_name FROM information_schema.tables
    WHERE table_schema != 'information_schema' AND table_schema not like 'pg\_%';
    
    SELECT routine_schema, routine_name FROM information_schema.routines
    WHERE routine_schema != 'information_schema' AND routine_schema not like 'pg\_%';
    
    SELECT extname FROM pg_extension WHERE extname != 'plpgsql';
        
  5. Iniciar o job de migração.

Limpar slots de replicação

Você verá 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.

O problema pode ser

Ao promover uma instância do Cloud SQL, se a instância de origem não puder ser acessada pela instância do Cloud SQL (por exemplo, se a instância de origem não estiver em execução ou se você tiver removido a instância do Cloud SQL 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 seguintes comandos como um usuário com o privilégio superuser:

  1. Acesse os nomes dos slots de replicação na mensagem de erro e execute o comando a seguir para excluir 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 '%cloudsql%' and active = 'f';
  3. Se não houver réplicas do Cloud SQL usando a instância de origem, execute o comando a seguir para limpar as configurações de pglogical:

    select pglogical.drop_node(node_name) from pglogical.node where node_name like 'cloudsql';
  4. Se a extensão pglogical não for mais necessária, execute o seguinte comando para desinstalá-la:

    DROP EXTENSION IF EXISTS pglogical;


Mensagem de erro: Cannot connect to invalid database

Ao migrar para a versão 15 do PostgreSQL, após várias tentativas de repetição de conexão, um dos seguintes sintomas ocorre:

  • Você recebe uma mensagem de erro Cannot connect to invalid database.
  • A métrica do job de migração de uso do armazenamento não mostra progresso após um longo período quando o job de migração está realizando o despejo completo do banco de dados.

O problema pode ser

Esse problema geralmente é atribuído ao problema de intertravamento na extensão pglogical. Para mais informações, consulte o rastreador de problemas pglogical no GitHub (em inglês).

O que você pode tentar

Realizar o job de migração novamente com uma nova instância de destino

Tente excluir o banco de dados de destino em que o problema ocorreu e recriar o job de migração. Siga estas etapas:

  1. Exclua a instância de destino em que você teve problemas. Consulte Excluir instâncias na documentação do Cloud SQL para PostgreSQL.
  2. Exclua o job de migração com falha. Consulte Revisar um job de migração.
  3. Crie novamente o job de migração. Consulte Criar um job de migração.

Migrar para uma versão intermediária

Considere migrar para uma versão anterior do PostgreSQL, como o PostgreSQL 14. Após uma migração bem-sucedida, tente fazer upgrade para a instância do PostgreSQL 15 desejado. Consulte Fazer upgrade da versão principal do banco de dados migrando dados na documentação do Cloud SQL para PostgreSQL.

Gerenciar usuários e funções

Migrar usuários atuais

No momento, o Database Migration Service não oferece suporte à migração de usuários de uma instância de origem para uma instância de destino do Cloud SQL. É possível gerenciar essa migração criando os usuários no Cloud SQL manualmente.

Sobre o usuário cloudsqlexternalsync

Durante a migração, todos os objetos na réplica do Cloud SQL são de propriedade do usuário cloudsqlexternalsync. Depois que os dados forem migrados, você poderá modificar a propriedade dos objetos para outros usuários seguindo estas etapas:

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

Importar dados para uma nova instância do Cloud SQL

Se você exportar dados de uma instância do Cloud SQL migrada pelo Database Migration Service para o Cloud Storage e depois importar os dados do Cloud Storage para uma instância independente do Cloud SQL, a importação poderá falhar porque o usuário cloudsqlexternalsync não existe na instância de destino.

Para resolver o problema, crie o usuário cloudsqlexternalsync na instância de destino ou remova o usuário da instância migrada.