Resolva problemas de ligação

Introdução

Geralmente, os problemas de ligação enquadram-se numa das seguintes três áreas:

  • Ligação: consegue aceder à sua instância através da rede?
  • Autorização: tem autorização para se ligar à instância?
  • Autenticação: a base de dados aceita as suas credenciais da base de dados?

Cada um destes pode ser dividido em diferentes caminhos para investigação. A secção seguinte inclui exemplos de perguntas que pode fazer a si mesmo para ajudar a restringir ainda mais o problema:

Lista de verificação de problemas de ligação

Mensagens de erro

Para mensagens de erro específicas da API, consulte a página de referência Mensagens de erro.

Resolução de problemas de conetividade adicionais

Para outros problemas, consulte a secção Conetividade na página de resolução de problemas.

Problemas de ligação comuns

Verifique se a sua aplicação está a fechar as ligações corretamente

Se vir erros que contenham "Aborted connection nnnn to db:", normalmente, significa que a sua aplicação não está a interromper as ligações corretamente. Os problemas de rede também podem causar este erro. O erro não significa que existam problemas com a sua instância do Cloud SQL. Também recomendamos que execute tcpdump para inspecionar os pacotes e localizar a origem do problema.

Para ver exemplos de práticas recomendadas para a gestão de ligações, consulte o artigo Gerir ligações à base de dados.

Verifique se os seus certificados não expiraram

Se a sua instância estiver configurada para usar SSL, aceda à página Instâncias do Cloud SQL na Google Cloud consola e abra a instância. Abra a página Ligações, selecione o separador Segurança e certifique-se de que o certificado do servidor é válido. Se tiver expirado, tem de adicionar um novo certificado e alternar para o mesmo.

Confirme se tem autorização para estabelecer ligação

Se as suas ligações estiverem a falhar, verifique se tem autorização para estabelecer ligação:

  • Se tiver problemas ao estabelecer ligação através de um endereço IP, por exemplo, se estiver a estabelecer ligação a partir do seu ambiente no local com o cliente mysql, certifique-se de que o endereço IP a partir do qual está a estabelecer ligação está autorizado a estabelecer ligação à instância do Cloud SQL.

    As ligações a uma instância do Cloud SQL através de um endereço IP privado são autorizadas automaticamente para intervalos de endereços RFC 1918. Desta forma, todos os clientes privados podem aceder à base de dados sem passar pelo proxy Auth do Cloud SQL. Os intervalos de endereços não RFC 1918 têm de ser configurados como redes autorizadas.

    Por predefinição, o Cloud SQL não aprende trajetos de sub-redes não RFC 1918 da sua VPC. Tem de atualizar a interligação de redes para o Cloud SQL para exportar quaisquer trajetos não RFC 1918. Por exemplo:

    gcloud compute networks peerings update cloudsql-mysql-googleapis-com \
    --network=NETWORK \
    --export-subnet-routes-with-public-ip \
    --project=PROJECT_ID
  • Este é o seu endereço IP atual.

  • Experimente o comando gcloud sql connect para se ligar à sua instância. Este comando autoriza o seu endereço IP durante um curto período de tempo. Pode executar este comando num ambiente com a CLI gcloud e o cliente mysql instalados. Também pode executar este comando no Cloud Shell, que está disponível naGoogle Cloud consola e tem a CLI gcloud e o cliente mysql pré-instalados. O Cloud Shell fornece uma instância do Compute Engine que pode usar para se ligar ao Cloud SQL.
  • Permitir temporariamente que todos os endereços IP se liguem a uma instância. Para IPv4 autorize 0.0.0.0/0 (para IPv6, autorize ::/0.

Valide a forma como se liga

Se receber uma mensagem de erro como:

ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: NO)

Quando estabelecer ligação, verifique se está a fornecer uma palavra-passe.

Se receber uma mensagem de erro como:

ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: YES)

Quando se ligar, verifique se está a usar a palavra-passe correta e se está a ligar-se através de SSL, se a instância o exigir.

Determinar como as ligações estão a ser iniciadas

Pode ver informações sobre as suas associações atuais ao associar-se à sua base de dados e executar o seguinte comando:

SHOW PROCESSLIST;

As ligações que mostram um endereço IP, como 1.2.3.4, estão a estabelecer ligação através de IP. As ligações com cloudsqlproxy~1.2.3.4 estão a usar o proxy Auth do Cloud SQL ou têm origem no App Engine. As ligações do localhost podem ser usadas por alguns processos internos do Cloud SQL.

Limites de ligação

Não existem limites de QPS para instâncias do Cloud SQL. No entanto, existem limites específicos de ligação, tamanho e do App Engine em vigor. Consulte as cotas e os limites.

As ligações à base de dados consomem recursos no servidor e na aplicação de ligação. Use sempre boas práticas de gestão de ligações para minimizar a pegada da sua aplicação e reduzir a probabilidade de exceder os limites de ligações do Cloud SQL. Para mais informações, consulte o artigo Faça a gestão das ligações à base de dados.

Mostrar ligações e discussões

Se receber a mensagem de erro "demasiadas ligações" ou quiser saber o que está a acontecer numa instância, pode mostrar o número de ligações e threads com SHOW PROCESSLIST.

A partir de um cliente MySQL, execute:

mysql> SHOW PROCESSLIST;

Recebe um resultado semelhante ao seguinte:

+----+-----------+--------------+-----------+---------+------+-------+----------------------+
| Id | User      | Host         | db        | Command | Time | State | Info                 |
+----+-----------+--------------+-----------+---------+------+-------+----------------------+
|  3 | user-name | client-IP    | NULL      | Query   |    0 | NULL  | SHOW processlist     |
|  5 | user-name | client-IP    | guestbook | Sleep   |    1 |       | SELECT * from titles |
| 17 | user-name | client-IP    | employees | Query   |    0 | NULL  | SHOW processlist     |
+----+-----------+--------------+-----------+---------+------+-------+----------------------+
3 rows in set (0.09 sec)

Para obter informações sobre como interpretar as colunas devolvidas por PROCESSLIST, consulte a referência do MySQL.

Para obter uma contagem de discussões, pode usar:

mysql> SHOW STATUS WHERE Variable_name = 'Threads_connected';

Recebe um resultado semelhante ao seguinte:

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 7     |
+-------------------+-------+
1 row in set (0.08 sec)

O tempo limite das ligações foi excedido (do Compute Engine)

As ligações com uma instância do Compute Engine expiram após 10 minutos de inatividade, o que pode afetar as ligações não utilizadas de longa duração entre a instância do Compute Engine e a instância do Cloud SQL. Para mais informações, consulte o artigo Redes e firewalls na documentação do Compute Engine.

Para manter ativas as ligações não usadas de longa duração, pode definir o keepalive TCP. Os seguintes comandos definem o valor de manutenção ativa do TCP para um minuto e tornam a configuração permanente nos reinícios da instância.

Apresente o valor tcp_keepalive_time atual.

cat /proc/sys/net/ipv4/tcp_keepalive_time

Defina tcp_keepalive_time como 60 segundos e torne-o permanente nos reinícios.

echo 'net.ipv4.tcp_keepalive_time = 60' | sudo tee -a /etc/sysctl.conf

Aplique a alteração.

sudo /sbin/sysctl --load=/etc/sysctl.conf

Apresente o valor tcp_keepalive_time para verificar se a alteração foi aplicada.

cat /proc/sys/net/ipv4/tcp_keepalive_time

Ligue-se com IPv6

Se receber uma das seguintes mensagens de erro

Can't connect to MySQL server on '2001:1234::4321' (10051)
Can't connect to MySQL server on '2001:1234::4321' (101)

Quando se liga, é provável que esteja a tentar ligar-se ao endereço IPv6 da sua instância, mas não tem o IPv6 disponível na sua estação de trabalho. Pode verificar se o IPv6 está funcional na sua estação de trabalho acedendo a ipv6.google.com. Se a página não for carregada, significa que o IPv6 não está disponível. Em alternativa, ligue-se ao endereço IPv4 ou à sua instância do Cloud SQL. Pode ter de adicionar um endereço IPv4 à sua instância primeiro.

Falhas de ligação ocasionais (HA antigo)

Quando o Cloud SQL reinicia uma instância devido a eventos de manutenção, as ligações podem ser encaminhadas para a réplica de failover. Quando se liga à réplica de failover:

  • Os pedidos de leitura de clientes que usam ligações não encriptadas são bem-sucedidos como habitualmente. No entanto, os pedidos de gravação falham e devolvem uma mensagem de erro, como "Erro 1290: O servidor MySQL está a ser executado com a opção --read-only, pelo que não pode executar esta declaração".
  • As solicitações de leitura e escrita de clientes que usam ligações encriptadas falham e devolvem uma mensagem de erro, como "x509: certificate is valid for master-instance, not failover-instance" (x509: o certificado é válido para a instância principal e não para a instância de alternativa).

Após o evento terminar, o Cloud SQL repõe a ligação. Tente estabelecer ligação novamente. Recomendamos que crie as suas aplicações para processar falhas de ligação ocasionais implementando uma estratégia de processamento de erros, como a retirada exponencial. Consulte Implementação da aplicação para mais informações.

Ferramentas para depurar a conetividade

tcpdump

O tcpdump é uma ferramenta para capturar pacotes. É altamente recomendável executar tcpdump para capturar e inspecionar os pacotes entre o anfitrião e as instâncias do Cloud SQL quando estiver a depurar os problemas de conetividade.

Localize o seu endereço IP local

Se não souber o endereço local do seu anfitrião, execute o comando ip -br address show. No Linux, isto mostra a interface de rede, o estado da interface, o IP local e os endereços MAC. Por exemplo: eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64.

Em alternativa, pode executar ipconfig ou ifconfig para ver o estado das suas interfaces de rede.

Teste com o teste de conetividade

O teste de conetividade é uma ferramenta de diagnóstico que lhe permite verificar a conetividade entre pontos finais na sua rede. Analisa a sua configuração e, em alguns casos, realiza a validação em tempo de execução. Agora, suporta o Cloud SQL. Siga estas instruções para executar testes com as suas instâncias do Cloud SQL.

Teste a sua ligação

Pode usar o cliente mysql para testar a sua capacidade de estabelecer ligação a partir do ambiente local. Para mais informações, consulte os artigos Ligar o cliente mysql através de endereços IP e Ligar o cliente mysql através do proxy Auth do Cloud SQL.

Determine o endereço IP da sua aplicação

Para determinar o endereço IP de um computador que executa a sua aplicação, de modo a poder autorizar o acesso à sua instância do Cloud SQL a partir desse endereço, use uma das seguintes opções:

  • Se o computador não estiver protegido por um proxy ou uma firewall, inicie sessão no computador e use a página Qual é o meu IP? site para determinar o respetivo endereço IP.
  • Se o computador estiver protegido por um proxy ou uma firewall, inicie sessão no computador e use uma ferramenta ou um serviço como whatismyipaddress.com para determinar o respetivo endereço IP verdadeiro.

Abra portas locais

Para verificar se o anfitrião está a ouvir nas portas que pensa que está, execute o comando ss -tunlp4. Isto indica que portas estão abertas e a escutar. Por exemplo, se tiver uma base de dados MySQL em execução, a porta 3306 deve estar ativa e a receber pedidos. Para o SSH, deve ver a porta 22.

Toda a atividade da porta local

Use o comando netstat para ver toda a atividade da porta local. Por exemplo, netstat -lt mostra todas as portas atualmente ativas.

Ligue-se à sua instância do Cloud SQL através do telnet

Para verificar se consegue estabelecer ligação à sua instância do Cloud SQL através do TCP, execute o comando telnet. O Telnet tenta estabelecer ligação ao endereço IP e à porta que lhe indicar.

Se a sua instância do Cloud SQL estiver a executar uma base de dados MySQL, por exemplo, deve conseguir estabelecer uma ligação telnet à mesma na porta 3306: telnet 35.193.198.159 3306.

Se tiver êxito, vê o seguinte:

Trying 35.193.198.159...

Connected to 35.193.198.159. .

Em caso de falha, vê que o telnet fica bloqueado até forçar o encerramento da tentativa:

Trying 35.193.198.159...

^C. .

Cloud Logging

O Cloud SQL e o Cloud SQL usam o Cloud Logging. Consulte a documentação do Cloud Logging para ver informações completas e reveja as consultas de exemplo do Cloud SQL.

Ver registos

Pode ver registos de instâncias do Cloud SQL e outros Google Cloud projetos, como instâncias do Cloud VPN ou Compute Engine. Para ver os registos das entradas de registo da sua instância do Cloud SQL:

Consola

  1. Na Google Cloud consola, aceda à página Cloud Logging.

    Aceda ao Cloud Logging

  2. Selecione um projeto do Cloud SQL existente na parte superior da página.
  3. No criador de consultas, adicione o seguinte:
    • Recurso: selecione Base de dados do Cloud SQL. Na caixa de diálogo, selecione uma instância do Cloud SQL.
    • Nomes dos registos: desloque a página até à secção do Cloud SQL e selecione os ficheiros de registo adequados para a sua instância. Por exemplo:
      • cloudsql.googlapis.com/mysql-general.log
      • cloudsql.googleapis.com/mysql.err
    • Gravidade: selecione um nível de registo.
    • Intervalo de tempo: selecione uma predefinição ou crie um intervalo personalizado.

gcloud

Use o comando gcloud logging para ver as entradas do registo. No exemplo abaixo, substitua PROJECT_ID. A flag limit é um parâmetro opcional que indica o número máximo de entradas a devolver.

gcloud logging read "projects/PROJECT_ID/logs/cloudsql.googleapis.com/mysql-general.log" \
--limit=10

Endereços IP privados

As ligações a uma instância do Cloud SQL através de um endereço IP privado são autorizadas automaticamente para intervalos de endereços RFC 1918. Os intervalos de endereços não RFC 1918 têm de ser configurados no Cloud SQL como redes autorizadas. Também tem de atualizar a interligação de redes para o Cloud SQL para exportar quaisquer trajetos não RFC 1918. Por exemplo:

gcloud compute networks peerings update cloudsql-mysql-googleapis-com 
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID

Resolução de problemas da VPN

Consulte a página de resolução de problemas da VPN na nuvem.