Debug dei problemi di connessione

Introduzione

In genere, i problemi di connessione rientrano in una delle tre aree seguenti:

  • Connessione in corso: riesci a raggiungere l'istanza tramite la rete?
  • Autorizzazione in corso: hai l'autorizzazione per connetterti all'istanza?
  • Autenticazione: il database accetta le credenziali del tuo database?

Ognuno di questi può essere ulteriormente suddiviso in diversi percorsi di indagine. La seguente sezione include esempi di domande che puoi porre per restringere ulteriormente il problema:

Elenco di controllo per i problemi di connessione

Messaggi di errore

Per i messaggi di errore specifici dell'API, consulta la pagina di riferimento Messaggi di errore.

Ulteriore risoluzione dei problemi di connettività

Per altri problemi, consulta la sezione Connettività nella pagina di risoluzione dei problemi.

Problemi di connessione comuni

Verifica che la tua applicazione chiuda correttamente le connessioni

Se vedi errori contenenti "Aborted connection nnnn to db:", di solito significa che la tua applicazione non interrompe correttamente le connessioni. Anche i problemi di rete possono causare questo errore. L'errore non indica problemi con l'istanza Cloud SQL. Ti consigliamo inoltre di eseguire tcpdump per ispezionare i pacchetti e individuare l'origine del problema.

Per esempi di best practice per la gestione delle connessioni, consulta Gestione delle connessioni ai database.

Verifica che i certificati non siano scaduti

Se l'istanza è configurata per l'utilizzo di SSL, vai alla pagina Istanze Cloud SQL nella console Google Cloud e apri l'istanza. Apri la pagina Connessioni, seleziona la scheda Sicurezza e assicurati che il certificato del server sia valido. Se è scaduto, devi aggiungere un nuovo certificato e ruotarlo.

Verifica di avere l'autorizzazione per connetterti

Se le connessioni non riescono, verifica di essere autorizzato a connetterti:

  • Se hai difficoltà a connetterti utilizzando un indirizzo IP, ad esempio se stai connettendo dal tuo ambiente on-premise con il client mysql, assicurati che l'indirizzo IP da cui ti stai connettendo sia autorizzato a connettersi all'istanza Cloud SQL.

    Le connessioni a un'istanza Cloud SQL che utilizzano un indirizzo IP privato vengono autorizzate automaticamente per gli intervalli di indirizzi RFC 1918. In questo modo, tutti i client privati possono accedere al database senza passare per il proxy di autenticazione Cloud SQL. Gli intervalli di indirizzi non RFC 1918 devono essere configurati come reti autorizzate.

    Per impostazione predefinita, Cloud SQL non apprende le route di subnet non RFC 1918 dal VPC. Devi aggiornare il peering di rete a Cloud SQL per esportare eventuali route non RFC 1918. Ad esempio:

    gcloud compute networks peerings update cloudsql-mysql-googleapis-com \
    --network=NETWORK \
    --export-subnet-routes-with-public-ip \
    --project=PROJECT_ID
    
  • Ecco il tuo attuale indirizzo IP.

  • Prova il comando gcloud sql connect per connetterti alla tua istanza. Questo comando autorizza il tuo indirizzo IP per un breve periodo di tempo. Puoi eseguire questo comando in un ambiente con gcloud CLI e client mysql installati. Puoi anche eseguire questo comando in Cloud Shell, che è disponibile nella console Google Cloud e in cui gcloud CLI e il client mysql sono preinstallati. Cloud Shell fornisce un'istanza Compute Engine che puoi utilizzare per connetterti a Cloud SQL.
  • Consenti temporaneamente a tutti gli indirizzi IP di connettersi a un'istanza. Per IPv4 autorizza 0.0.0.0/0 (per IPv6, autorizza ::/0.

Verifica la modalità di connessione

Se ricevi un messaggio di errore come:

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

quando ti connetti, verifica di specificare una password.

Se ricevi un messaggio di errore come:

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

Quando ti connetti, verifica di utilizzare la password corretta e di connetterti tramite SSL, se l'istanza lo richiede.

Determina la modalità di avvio delle connessioni

Per visualizzare le informazioni sulle connessioni attuali, connettiti al tuo database ed esegui questo comando:

SHOW PROCESSLIST;

Le connessioni che mostrano un indirizzo IP, come 1.2.3.4, si connettono tramite IP. Le connessioni con cloudsqlproxy~1.2.3.4 utilizzano il proxy di autenticazione Cloud SQL o hanno origine da App Engine. Le connessioni da localhost possono essere utilizzate da alcuni processi interni di Cloud SQL.

Limiti di connessione

Non sono previsti limiti QPS per le istanze Cloud SQL. Tuttavia, esistono limiti specifici per connessione, dimensioni e App Engine. Consulta Quote e limiti.

Le connessioni al database consumano risorse sul server e nell'applicazione che si connette. Utilizza sempre buone prassi di gestione delle connessioni per ridurre al minimo l'ingombro dell'applicazione e ridurre la probabilità di superare i limiti di connessione di Cloud SQL. Per ulteriori informazioni, consulta Gestione delle connessioni ai database.

Mostra connessioni e thread

Se visualizzi il messaggio di errore "Troppe connessioni" o vuoi scoprire cosa sta succedendo su un'istanza, puoi mostrare il numero di connessioni e thread con SHOW PROCESSLIST.

Da un client MySQL, esegui:

mysql> SHOW PROCESSLIST;

Ottieni un output simile al seguente:

+----+-----------+--------------+-----------+---------+------+-------+----------------------+
| 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)

Per informazioni su come interpretare le colonne restituite da PROCESSLIST, consulta la documentazione di riferimento MySQL.

Per ottenere un conteggio thread, puoi utilizzare:

mysql> SHOW STATUS WHERE Variable_name = 'Threads_connected';

Ottieni un output simile al seguente:

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

Timeout delle connessioni (da Compute Engine)

Connessioni con timeout dell'istanza Compute Engine dopo 10 minuti di inattività, che può influire sulle connessioni inutilizzate di lunga durata tra la tua istanza Compute Engine e la tua istanza Cloud SQL. Per ulteriori informazioni, consulta Networking e firewall nella documentazione di Compute Engine.

Per mantenere attive le connessioni inutilizzate di lunga durata, puoi impostare il keepalive TCP. I seguenti comandi impostano il valore keepalive TCP su un minuto e rendono permanente la configurazione tra i riavvii delle istanze.

Visualizza il valore tcp_keepalive_time corrente.

cat /proc/sys/net/ipv4/tcp_keepalive_time

Imposta tcp_keepalive_time su 60 secondi e impostalo in modo permanente tra i riavvii.

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

Applica la modifica.

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

Visualizza il valore tcp_keepalive_time per verificare che la modifica sia stata applicata.

cat /proc/sys/net/ipv4/tcp_keepalive_time

Connetti a IPv6

Se visualizzi uno dei messaggi di errore

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

quando ti connetti, è probabile che tu stia tentando di connetterti all'indirizzo IPv6 dell'istanza, ma non hai IPv6 disponibile sulla workstation. Per verificare se il protocollo IPv6 è funzionante sulla workstation, vai a ipv6.google.com. Se non viene caricato, significa che IPv6 non è disponibile. Connettiti all'indirizzo IPv4 o alla tua istanza Cloud SQL. Potresti dover prima aggiungere un indirizzo IPv4 alla tua istanza.

Strumenti per il debug della connettività

tcpdump

tcpdump è uno strumento per acquisire pacchetti. Ti consigliamo di eseguire tcpdump per acquisire e ispezionare i pacchetti tra il tuo host e le istanze Cloud SQL durante il debug dei problemi di connettività.

Individuare l'indirizzo IP locale

Se non conosci l'indirizzo locale del tuo host, esegui il comando ip -br address show. Su Linux, mostra l'interfaccia di rete, lo stato dell'interfaccia, l'IP locale e gli indirizzi MAC. Ad esempio: eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64.

In alternativa, puoi eseguire ipconfig o ifconfig per visualizzare lo stato delle interfacce di rete.

Esegui test con Connectivity Tests

Il test di connettività è uno strumento di diagnostica che consente di verificare la connettività tra endpoint della rete. Analizza la tua configurazione e, in alcuni casi, esegue la verifica in fase di runtime. Ora supporta Cloud SQL. Segui queste istruzioni per eseguire test con le istanze Cloud SQL.

Esegui il test della connessione

Puoi utilizzare il client mysql per verificare la tua capacità di connessione dal tuo ambiente locale. Per maggiori informazioni, consulta Connessione del client mysql tramite indirizzi IP e Connessione del client mysql utilizzando il proxy di autenticazione Cloud SQL.

Determina l'indirizzo IP per l'applicazione

Per determinare l'indirizzo IP di un computer che esegue la tua applicazione in modo da poter autorizzare l'accesso all'istanza Cloud SQL da quell'indirizzo, utilizza una delle seguenti opzioni:

  • Se il computer non è protetto da un proxy o un firewall, accedi al computer e utilizza il campo Qual è il mio IP? sito per stabilirne l'indirizzo IP.
  • Se il computer è protetto da un proxy o un firewall, accedi al computer e utilizza uno strumento o un servizio come whatismyipaddress.com per determinare il suo vero indirizzo IP.

Porte locali aperte

Per verificare che l'host sia in ascolto sulle porte che ritieni siano, esegui il comando ss -tunlp4. che indica quali porte sono aperte e per l'ascolto. Ad esempio, se hai un database MySQL in esecuzione, la porta 3306 deve essere attiva e in ascolto. Per SSH, dovresti vedere la porta 22. Ad esempio, se hai un database PostgreSQL in esecuzione, la porta 5432 dovrebbe essere attiva e in ascolto. Per SSH, dovresti vedere la porta 22.

Tutte le attività relative alle porte locali

Utilizza il comando netstat per visualizzare tutte le attività relative alle porte locali. Ad esempio, netstat -lt mostra tutte le porte attualmente attive.

Connettiti all'istanza Cloud SQL utilizzando Telnet

Per verificare se riesci a connetterti all'istanza Cloud SQL utilizzando TCP, esegui il comando telnet. Telnet tenta di connettersi all'indirizzo IP e alla porta che hai fornito.

Se, ad esempio, la tua istanza Cloud SQL esegue un database MySQL, dovresti essere in grado di eseguire il Telnet sulla porta 3306: telnet 35.193.198.159 3306. Se, ad esempio, la tua istanza Cloud SQL esegue un database PostgreSQL, dovresti essere in grado di eseguire il Telnet sulla porta 5432: telnet 35.193.198.159 5432.

In caso di esito positivo, vedrai quanto segue:

Trying 35.193.198.159...

Connected to 35.193.198.159. .

In caso di errore, telnet si blocca fino a quando non forza la chiusura del tentativo:

Trying 35.193.198.159...

^C. .

Autenticazione client

L'autenticazione del client è controllata da un file di configurazione, denominato pg_hba.conf (HBA è l'acronimo di host-based Authentication).

Assicurati che la sezione delle connessioni di replica del file pg_hba.conf nel database di origine sia aggiornata in modo da accettare connessioni dall'intervallo di indirizzi IP del VPC di Cloud SQL.

Cloud Logging

Cloud SQL e Cloud SQL utilizzano Cloud Logging. Per informazioni complete, consulta la documentazione di Cloud Logging ed esamina le query di esempio di Cloud SQL.

Visualizza i log

Puoi visualizzare i log per le istanze Cloud SQL e altri progetti Google Cloud, come Cloud VPN o Compute Engine. Per visualizzare i log per le voci di log dell'istanza Cloud SQL:

Console

  1. Nella console Google Cloud, vai alla pagina Cloud Logging.

    Vai a Cloud Logging

  2. Seleziona un progetto Cloud SQL esistente nella parte superiore della pagina.
  3. In Query Builder, aggiungi quanto segue:
    • Risorsa: seleziona Database Cloud SQL. Nella finestra di dialogo, seleziona un'istanza Cloud SQL.
    • Nomi di log: scorri fino alla sezione Cloud SQL e seleziona i file di log appropriati per la tua istanza. Ad esempio:
      • cloudsql.googlapis.com/mysql-general.log
      • cloudsql.googleapis.com/mysql.err
      • cloudsql.googleapis.com/postgres.log
    • Gravità: seleziona un livello di log.
    • Intervallo di tempo: seleziona un intervallo di tempo preimpostato o creane uno personalizzato.

gcloud

Utilizza il comando gcloud logging per visualizzare le voci di log. Nell'esempio seguente, sostituisci PROJECT_ID. Il flag limit è un parametro facoltativo che indica il numero massimo di voci da restituire.

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

Indirizzi IP privati

Le connessioni a un'istanza Cloud SQL che utilizzano un indirizzo IP privato vengono autorizzate automaticamente per gli intervalli di indirizzi RFC 1918. Gli intervalli di indirizzi non RFC 1918 devono essere configurati in Cloud SQL come reti autorizzate. Devi inoltre aggiornare il peering di rete a Cloud SQL per esportare eventuali route non RFC 1918. Ad esempio:

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

Risoluzione dei problemi relativi alla VPN

Consulta la pagina Risoluzione dei problemi di Cloud VPN.