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
- A estabelecer ligação
- IP privado
- Ativou a
Service Networking API
para o seu projeto? - Está a usar uma VPC partilhada?
- A sua conta de utilizador ou de serviço tem as autorizações de IAM necessárias para gerir uma ligação de acesso a serviços privados?
- A ligação de acesso a serviços privados está configurada para o seu projeto?
- Atribuiu um intervalo de endereços IP para a ligação privada?
- Os seus intervalos de endereços IP atribuídos continham, pelo menos, um espaço /24 para cada região onde planeia criar instâncias do MySQL?
- Se estiver a especificar um intervalo de endereços IP atribuídos para as suas instâncias do MySQL, o intervalo contém, pelo menos, um espaço /24 para cada região onde planeia criar instâncias do MySQL neste intervalo?
- A ligação privada foi criada?
- Se a ligação privada foi alterada, as vpc-peerings foram atualizadas?
- Os registos de VPC indicam algum erro?
- O IP do computador de origem é um endereço não RFC 1918?
- IP público
- O seu IP de origem está listado como uma rede autorizada?
- Os certificados SSL/TLS são obrigatórios?
- O utilizador ou a conta de serviço tem as autorizações do IAM necessárias para estabelecer ligação a uma instância do Cloud SQL?
- Autorizar
- Proxy Auth do Cloud SQL
- O proxy Auth do Cloud SQL está atualizado?
- O proxy Auth do Cloud SQL está em execução?
- O nome de ligação da instância está formado corretamente no comando de ligação do proxy Auth do Cloud SQL?
- Verificou o resultado do proxy Auth do Cloud SQL? Encaminhe a saída para um ficheiro ou observe o terminal do Cloud Shell onde iniciou o Proxy Auth do Cloud SQL.
- O utilizador ou a conta de serviço tem as autorizações do IAM necessárias para estabelecer ligação a uma instância do Cloud SQL?
- Ativou a
Cloud SQL Admin API
para o seu projeto? - Se tiver uma política de firewall de saída, certifique-se de que permite ligações à porta 3307 na instância do Cloud SQL de destino.
- Se estiver a estabelecer ligação através de sockets de domínio UNIX, confirme que os sockets foram criados listando o diretório especificado com -dir quando iniciou o proxy Auth do Cloud SQL.
- Conetores do Cloud SQL e código específico do idioma
- A string de ligação está formada corretamente?
- Comparou o seu código com o código de exemplo para a sua linguagem de programação?
- Está a usar um tempo de execução ou uma framework para a qual não temos um exemplo de código?
- Se for esse o caso, procurou na comunidade material de referência relevante?
- Certificados SSL/TLS autogeridos
- O certificado de cliente está instalado no computador de origem?
- O certificado de cliente está escrito corretamente nos argumentos de ligação?
- O certificado de cliente ainda é válido?
- Está a receber erros quando se liga através de SSL?
- O certificado do servidor ainda é válido?
- Redes autorizadas
- O endereço IP de origem está incluído?
- Está a usar um endereço IP não RFC 1918?
- Está a usar um endereço IP não suportado?
- Falhas de ligação
- Tem autorização para estabelecer ligação?
- Está a ver erros de limite de ligações?
- A sua aplicação está a fechar as ligações corretamente?
- A autenticar
- Autenticação da base de dados nativa (nome de utilizador/palavra-passe)
- Está a ver erros
access denied
? - O nome de utilizador e a palavra-passe estão corretos?
- Autenticação da base de dados de IAM
- Ativou o sinalizador
cloudsql.iam_authentication
na sua instância? - Adicionou uma associação de políticas para a conta?
- Está a usar o proxy Auth do Cloud SQL com o
-enable_iam_login
ou um token OAuth 2.0 como palavra-passe da base de dados? - Se estiver a usar uma conta de serviço, está a usar o nome de email abreviado?
- Saiba mais acerca da autenticação de base de dados da IAM no PostgreSQL.
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.
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
-
Na Google Cloud consola, aceda à página Cloud Logging.
- Selecione um projeto do Cloud SQL existente na parte superior da página.
- 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.