Introdução
Geralmente, os problemas de conexão se enquadram em uma destas três áreas:
- Conexão: você consegue acessar a instância na rede?
- Autorização: você está autorizado a se conectar à instância?
- Autenticação: o banco de dados aceita as suas credenciais?
Cada uma delas pode ser dividida em caminhos diferentes para investigação. A seção a seguir inclui exemplos de perguntas que você pode fazer para resolver o problema:
Lista de verificação de problemas de conexão
- Conectando
- IP particular
- Você ativou a
Service Networking API
no projeto? - Você está usando uma VPC compartilhada?
- O usuário ou a conta de serviço tem as permissões necessárias do IAM para gerenciar uma conexão de acesso a serviços particulares?
- A conexão de acesso a serviços particulares está configurada no projeto?
- Você alocou um intervalo de endereços IP para a conexão particular?
- Os intervalos de endereços IP alocados contêm pelo menos um espaço /24 para cada região em que você planeja criar instâncias do MySQL?
- Se você estiver especificando um intervalo de endereços IP alocado para suas instâncias do MySQL, o intervalo vai conter pelo menos um espaço /24 para cada região em que você planeja criar instâncias do MySQL nesse intervalo?
- A conexão particular foi criada?
- Se a conexão particular foi alterada, a vpc-peerings foi atualizada?
- Os registros de VPC indicam algum erro?
- O IP da máquina de origem é um endereço não RFC 1918?
- IP público
- O IP de origem está listado como uma rede autorizada?
- Os certificados SSL/TLS são necessários?
- A conta de serviço ou usuário tem as permissões necessárias do IAM para se conectar a uma instância do Cloud SQL?
- Autorizar
- Proxy do Cloud SQL Auth
- O proxy do Cloud SQL Auth está atualizado?
- O proxy do Cloud SQL Auth está em execução?
- O nome da conexão da instância é formado corretamente no comando de conexão do proxy do Cloud SQL Auth?
- Você verificou a saída do proxy do Cloud SQL Auth? Redirecione a saída para um arquivo ou observe o terminal do Cloud Shell em que você iniciou o proxy do Cloud SQL Auth.
- A conta de serviço ou usuário tem as permissões necessárias do IAM para se conectar a uma instância do Cloud SQL?
- Você ativou a
Cloud SQL Admin API
no projeto? - Se você tiver uma política de firewall para o tráfego de saída, verifique se ela permite conexões com a porta 3307 na instância do Cloud SQL de destino.
- Se você estiver se conectando usando soquetes de domínio UNIX, confirme se os soquetes foram criados listando o diretório especificado com -dir quando você iniciou o proxy do Cloud SQL Auth.
- Conectores do Cloud SQL e código específico da linguagem
- A string de conexão foi formada corretamente?
- Você comparou o código com o código de amostra da linguagem de programação?
- Você está usando um ambiente de execução ou um framework que não tem código de amostra?
- Em caso afirmativo, você procurou na comunidade o material de referência relevante?
- Certificados SSL/TLS autogerenciados
- O certificado do cliente está instalado na máquina de origem?
- O certificado do cliente foi escrito corretamente nos argumentos de conexão?
- O certificado do cliente ainda é válido?
- Você está recebendo erros ao conectar-se usando SSL?
- O certificado do servidor ainda é válido?
- Redes autorizadas
- O endereço IP de origem está incluído?
- Você está usando um endereço IP não RFC 1918?
- Você está usando um endereço IP incompatível?
- Falhas de conexão
- Você tem autorização para se conectar?
- Você está vendo erros de limite de conexão?
- O aplicativo está fechando conexões adequadamente?
- Autenticar
- Autenticação de banco de dados nativo (nome de usuário/senha)
- Você está vendo erros
access denied
? - O nome de usuário e a senha estão corretos?
- Autenticação do banco de dados do IAM
- Você ativou a sinalização
cloudsql.iam_authentication
na instância? - Você adicionou uma vinculação de política à conta?
- Você está usando o proxy do Cloud SQL Auth com o
-enable_iam_login
ou um token Oauth 2.0 como senha do banco de dados? - Se você estiver usando uma conta de serviço, o nome de e-mail abreviado será usado?
- Saiba mais sobre a autenticação do banco de dados do IAM no PostgreSQL.
Mensagens de erro
Para ver mensagens de erro específicas da API, consulte a página de referência Mensagens de erro.
Solução de problemas adicionais de conectividade
Para outros problemas de conexão, consulte a seção Conectividade na página de solução de problemas.
Problemas comuns de conexão
Verificar se o aplicativo está encerrando as conexões corretamente
Erros contendo "Aborted connection nnnn to db:
" costumam indicar que o aplicativo não está interrompendo as conexões corretamente. Problemas de rede também podem causar esse erro. O erro não significa que há problemas com sua instância do Cloud SQL. Também recomendamos que você execute tcpdump
para inspecionar os pacotes e rastrear a origem do problema.
Para ver exemplos de práticas recomendadas de gerenciamento de conexões, consulte Como gerenciar conexões de banco de dados.
Verificar se os certificados expiraram
Se a instância estiver configurada para usar SSL, acesse a página Instâncias do Cloud SQL no console do Google Cloud e abra a instância. Abra a página Conexões, selecione a guia Segurança e verifique se o certificado do servidor é válido. Se ele tiver expirado, você precisará adicionar um novo e fazer a rotação dos certificados.
Verificar se você está autorizado a se conectar
Caso não esteja conseguindo se conectar, verifique se você tem autorização de conexão:
- Se estiver com dificuldade para se conectar usando um endereço IP, por exemplo, a partir do seu ambiente local com o cliente mysql, confirme se o endereço IP está autorizado a se conectar à instância do Cloud SQL.
As conexões com uma instância do Cloud SQL usando um endereço IP privado são autorizadas automaticamente para intervalos de endereços RFC 1918. Dessa forma, todos os clientes particulares podem acessar o banco de dados sem passar pelo proxy do Cloud SQL Auth. Os intervalos de endereços não RFC 1918 precisam ser configurados como redes autorizadas.
Por padrão, o Cloud SQL não aprende as rotas de sub-rede não RFC 1918 da sua VPC. É necessário atualizar o peering de rede para o Cloud SQL para exportar rotas que não sejam RFC 1918. Exemplo:
gcloud compute networks peerings update cloudsql-mysql-googleapis-com \ --network=NETWORK \ --export-subnet-routes-with-public-ip \ --project=PROJECT_ID
Veja aqui o endereço IP atual.
- Tente usar o
comando
gcloud sql connect
para se conectar à instância. Esse comando autoriza seu endereço IP por um curto período. É possível executar esse comando em um ambiente com a CLI gcloud e cliente mysql instalados. Também é possível executar esse comando no Cloud Shell, que está disponível no console do Google Cloud e tem a CLI gcloud e o cliente mysql pré-instalados. É fornecida uma instância do Compute Engine para você se conectar ao Cloud SQL. - Permita temporariamente que todos os endereços IP se conectem a uma instância. Para IPv4,
autorize
0.0.0.0/0
. Para IPv6, autorize::/0
.
Verifique como você está se conectando
Se você receber uma mensagem de erro como:ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: NO)
ao se conectar, verifique se você forneceu uma senha.
Se você receber uma mensagem de erro como:
ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: YES)
ao se conectar, verifique se está fornecendo a senha correta e se está utilizando SSL, se exigido pela instância.
Determinar como as conexões estão sendo iniciadas
Para ver informações sobre as conexões atuais, conecte-se ao banco de dados e execute o seguinte comando:
SHOW PROCESSLIST;
As conexões que mostram um endereço IP, como 1.2.3.4
, são feitas usando IP.
As conexões com cloudsqlproxy~1.2.3.4
usam o proxy do Cloud SQL Auth. Caso contrário, elas são
originadas do App Engine. As conexões de localhost
podem ser usadas por alguns processos internos do Cloud SQL.
Limites de conexão
Não há limite de QPS para instâncias do Cloud SQL. No entanto, há limites específicos em relação à conexão, ao tamanho e ao App Engine. Consulte Cotas e limites.
As conexões do banco de dados consomem recursos no servidor e no aplicativo conectado. Sempre use boas práticas de gerenciamento de conexões para minimizar o espaço ocupado pelo seu aplicativo e reduzir a probabilidade de exceder os limites de conexão do Cloud SQL. Para mais informações, consulte Como gerenciar conexões de banco de dados.
Exibir conexões e threads
Se você receber a mensagem de erro "muitas conexões" ou quiser descobrir o que está
acontecendo em uma instância, poderá exibir o número de conexões e linhas de execução
com SHOW PROCESSLIST
.
Em um cliente MySQL, execute:
mysql> SHOW PROCESSLIST;
Você verá um resultado parecido com este:
+----+-----------+--------------+-----------+---------+------+-------+----------------------+ | 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)
Veja informações sobre como interpretar as colunas retornadas pelo
comando PROCESSLIST
na referência do MySQL (em inglês).
Para receber uma contagem de linhas de execução, use:
mysql> SHOW STATUS WHERE Variable_name = 'Threads_connected';
Você verá um resultado parecido com este:
+-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_connected | 7 | +-------------------+-------+ 1 row in set (0.08 sec)
Tempo limite das conexões (do Compute Engine)
As conexões com uma instância do Compute Engine expiram após dez minutos de inatividade, o que pode afetar conexões de longa duração não usadas entre a instância do Compute Engine e a instância do Cloud SQL. Para mais informações, consulte Rede e firewalls na documentação do Compute Engine.
Para manter ativas as conexões de longa duração não utilizadas, configure o TCP keepalive. Os comandos a seguir definem o valor TCP keepalive como um minuto e tornam a configuração permanente em reinicializações da instância.
Exiba 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 durante as reinicializações.
echo 'net.ipv4.tcp_keepalive_time = 60' | sudo tee -a /etc/sysctl.conf
Aplique a alteração.
sudo /sbin/sysctl --load=/etc/sysctl.conf
Exiba o valor tcp_keepalive_time para verificar se a alteração foi aplicada.
cat /proc/sys/net/ipv4/tcp_keepalive_time
Conectar-se com IPv6
Se você receber uma destas 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)
ao se conectar, é provável que esteja tentando conectar-se ao endereço IPv6 da instância, mas a estação de trabalho não tem IPv6 disponível. Acesse o site ipv6.google.com para verificar se o IPv6 está funcionando na estação de trabalho. Se o site não carregar, isso significa que o IPv6 não está disponível. Como solução, conecte-se ao endereço IPv4 ou à instância do Cloud SQL. Talvez seja necessário adicionar um endereço IPv4 à instância primeiro.
Falhas de conexão ocasionais (HA legada)
Quando o Cloud SQL reinicia uma instância devido a eventos de manutenção, as conexões podem ser roteadas para a réplica de failover. Quando você se conecta à réplica de failover:
- As solicitações de leitura de clientes que usam conexões não criptografadas têm êxito normalmente. No entanto, as solicitações de gravação falham e retornam uma mensagem de erro, como "Erro 1290: o servidor MySQL está em execução com a opção --read-only, portanto, não pode executar esta instrução."
- As solicitações de leitura e gravação de clientes que usam conexões criptografadas falham e retornam uma mensagem de erro, como "x509: o certificado é válido para instância mestre, não para a instância de failover".
Depois que o evento terminar, o Cloud SQL redefinirá a conexão. Tente estabelecer conexão novamente. Recomendamos que os aplicativos sejam desenvolvidos implementando uma estratégia de tratamento de erros, como a espera exponencial, para manipular falhas de conexão de vez em quando. Consulte Implementação do aplicativo para mais informações.
Ferramentas para depurar a conectividade
tcpdump
O tcpdump
é uma ferramenta para capturar pacotes. É altamente recomendável executar tcpdump
para capturar e inspecionar os pacotes entre o host e as instâncias do Cloud SQL quando você estiver depurando os problemas de conectividade.
Localizar o endereço IP local
Se você não souber o endereço local do host, execute o
comando ip -br address show
. No Linux, isso mostra a interface de rede,
o status 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
.
Se preferir, execute ipconfig
ou ifconfig
para ver
o status das interfaces de rede.
Testar com o Teste de conectividade
Os testes de conectividade são uma ferramenta de diagnóstico que permite verificar a conectividade entre os endpoints na sua rede. Ele analisa sua configuração e, em alguns casos, executa a verificação de ambiente de execução. Agora, ele é compatível com o Cloud SQL. Siga estas instruções para executar testes com instâncias do Cloud SQL.
Testar sua conexão
Você pode usar o cliente MySQL para testar sua capacidade de se conectar a partir do seu ambiente local. Para mais informações, consulte Como conectar o cliente mysql usando endereços IP e Como conectar o cliente mysql usando o proxy do Cloud SQL Auth.
Determinar o endereço IP do aplicativo
Para determinar o endereço IP de um computador que executa seu aplicativo com o objetivo de 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 por trás de um proxy ou firewall, faça login no computador e use o site What is my IP? para determinar seu endereço IP.
- Se o computador estiver por trás de um proxy, faça login no computador e use uma ferramenta ou serviço como o whatismyipaddress.com (em inglês) para determinar o endereço IP verdadeiro.
Abrir portas locais
Para verificar se o host está detectando nas portas que você acredita que estejam, execute o
comando ss -tunlp4
. Isso informa quais portas estão abertas e
detectando.
Por exemplo, se houver um banco de dados MySQL em execução, a porta 3306 estará ativa e
detectando. Para o SSH, será a porta 22.
Atividade de todas as portas locais
Use o comando netstat
para ver a atividade de todas as portas locais. Por
exemplo, netstat -lt
mostra todas as portas ativas no momento.
Conectar-se à instância do Cloud SQL usando telnet
Para verificar se é possível se conectar à instância do Cloud SQL usando TCP
, execute
o comando telnet
. O telnet tenta se conectar ao endereço IP e
à porta fornecidos por você.
telnet 35.193.198.159 3306
.
Se o processo for bem-sucedido, você verá o seguinte:
Trying 35.193.198.159...
Connected to 35.193.198.159.
Em caso de falha, você verá que telnet
trava até que você force o encerramento da tentativa:
Trying 35.193.198.159...
^C.
Cloud Logging
O Cloud SQL usa o Cloud Logging. Consulte a documentação do Cloud Logging para informações completas e revise as consultas de amostra do Cloud SQL.
Ver registros
É possível ver os registros das instâncias do Cloud SQL e de outros projetos do Google Cloud, como as instâncias do Cloud VPN ou do Compute Engine. Para ver as entradas de registro da instância do Cloud SQL, faça o seguinte:
Console
-
No console do Google Cloud, acesse a página do Cloud Logging.
- Selecione um projeto do Cloud SQL na parte superior da página.
- No criador de consultas, adicione o seguinte:
- Recurso: selecione Banco de dados do Cloud SQL. Na caixa de diálogo, selecione uma instância do Cloud SQL.
- Nomes de registros: vá até a seção do Cloud SQL e selecione
os arquivos de registro correspondentes à instância. Exemplo:
- cloudsql.googlapis.com/mysql-general.log
- cloudsql.googleapis.com/mysql.err
- Gravidade: selecione um nível de registro.
- Período: selecione um valor predefinido ou crie um período personalizado.
gcloud
Use o comando gcloud logging
para visualizar as entradas de registro. No exemplo abaixo, substitua PROJECT_ID
.
A sinalização limit
é um parâmetro opcional que indica o número máximo de entradas a serem
retornadas.
gcloud logging read "projects/PROJECT_ID/logs/cloudsql.googleapis.com/mysql-general.log" \ --limit=10
Endereços IP particulares
As conexões com uma instância do Cloud SQL usando 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 precisam ser configurados no Cloud SQL como redes autorizadas. É necessário atualizar o peering de rede para o Cloud SQL exportar rotas que não sejam RFC 1918. Exemplo:
gcloud compute networks peerings update cloudsql-mysql-googleapis-com
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID
Solução de problemas de VPN
Consulte a página Solução de problemas do Cloud VPN.