L'host "xxx.xx.xxx.xxx" non può connettersi a questo server MySQL


668

Questo dovrebbe essere assolutamente semplice, ma non riesco a farlo funzionare per la mia vita.
Sto solo cercando di connettermi in remoto al mio server MySQL.

collegamento come

mysql -u root -h localhost -p  

funziona bene, ma provando

mysql -u root -h 'any ip address here' -p

fallisce con l'errore

ERROR 1130 (00000): Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server

Nella mysql.usertabella, esiste esattamente la stessa voce per l'utente 'root' con l'host 'localhost' di un'altra con l'host '%'.

Sono alla fine del mio ingegno e non ho idea di come procedere. Tutte le idee sono benvenute.


Impossibile accedere come root nella maggior parte dei casi a causa di precauzioni di sicurezza.
AO_

Risposte:


816

Forse una precauzione di sicurezza. Potresti provare ad aggiungere un nuovo account amministratore:

mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
    ->     WITH GRANT OPTION;
mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
    ->     WITH GRANT OPTION;

Anche se come Pascal e altri hanno notato, non è una buona idea avere un utente con questo tipo di accesso aperto a qualsiasi IP. Se hai bisogno di un utente amministrativo, usa root e lascialo su localhost. Per ogni altra azione, specifica esattamente i privilegi di cui hai bisogno e limita l'accessibilità dell'utente come Pascal ha suggerito di seguito.

Modificare:

Dalle domande frequenti su MySQL:

Se non riesci a capire perché viene negato l'accesso, rimuovi dalla tabella utenti tutte le voci che hanno valori Host contenenti caratteri jolly (voci che contengono caratteri '%' o '_'). Un errore molto comune è quello di inserire una nuova voce con Host = '%' e User = 'some_user', pensando che ciò ti consenta di specificare localhost per la connessione dalla stessa macchina. Il motivo per cui ciò non funziona è che i privilegi predefiniti includono una voce con Host = 'localhost' e User = ''. Poiché quella voce ha un valore Host "localhost" più specifico di "%", viene utilizzata in preferenza alla nuova voce quando ci si collega da localhost! La procedura corretta è inserire una seconda voce con Host = 'localhost' e User = 'some_user', o per eliminare la voce con Host = 'localhost' e User = ''. Dopo aver eliminato la voce, ricordare di emettere un'istruzione FLUSH PRIVILEGES per ricaricare le tabelle delle sovvenzioni. Vedere anche Sezione 5.4.4, "Controllo degli accessi, Fase 1: verifica della connessione".


17
Buona cattura Yannick, tuttavia non gli consiglierei di concedere tutti i privilegi a un utente non root. Forse un set ridotto?
Corey Ballou,

3
Bene, questa non sarebbe una buona idea, ma consentire a "root" di connettersi da tutti gli host è esattamente lo stesso, poiché è allo stesso livello di privilegio.
Yannick Motton,

2
Penso che ti sfugga il mio punto Pascal. Il punto è che l'utente 'root' ha già quei diritti e vuole che qualsiasi ip si autentichi come quell'utente. Quindi, se questo è davvero ciò che vuole, l'esempio predefinito di creazione di un nuovo utente amministratore (che ha esattamente gli stessi diritti) è un'alternativa a ciò che sta provando.
Yannick Motton,

2
Esatto Yannick, ho letto velocemente e rimuoverò il mio commento. Tuttavia, AFAIK, le autorizzazioni funzionano bene in MySQL, quindi: 1. forse l'OP ha modificato manualmente le tabelle delle sovvenzioni e quindi deve svuotare i privilegi. 2. forse non ha usato la sintassi di concessione corretta per root. L'aggiunta di un altro utente amministrativo potrebbe essere una soluzione alternativa ma non risolverà il vero problema IMHO.
Pascal Thivent,

1
Ho sentito che fornire l'accesso da tutti gli host a root non era una soluzione adeguata. Invece ho creato un nuovo utente e concesso un set ridotto di privilegi, il set che ho usato è descritto come 'DBManager' su MySQL Workbench. Ho anche consentito l'accesso solo da un determinato gruppo di host nella mia rete locale, in particolare 192.168.0.%
Gustavo Guevara,

272

Uno deve creare un new MySQL Usere assegnare i privilegi come sotto in Query prompttramite phpMyAdmin o prompt dei comandi:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

Una volta fatto con tutte e quattro le query, dovrebbe connettersi con username / password


5
Ho dovuto riavviare mysql dopo aver completato i passaggi precedenti per farlo funzionare per me.
casello il

Devi creare username @ localhost? Non è sufficiente creare solo il nome utente @%? Voglio dire, se crei solo username @%, non sarai in grado di connetterti con quell'utente da localhost?
Sorin Postelnicu,

1
sì, creare un @localhostavrebbe senso se i privilegi fossero diversi in qualche modo, ma qui sono uguali e probabilmente sarà più confuso di qualsiasi altra cosa (come cambiare password su uno non realizzando l'altro esiste e che il tuo login potrebbe colpire quello ).
Bratchley,

come un principiante mi ha davvero aiutato
Muhammad Nayab

1
grazie risolve il mio "SQLSTATE [HY000] [1130] L'host 'DESKTOP-xxx.xx' non è autorizzato a connettersi a questo server MariaDB" nell'applicazione laravel containerizzata in Windows
Zulqarnain,

117

Il mio messaggio di errore era simile e diceva "L' host XXX non è autorizzato a connettersi a questo server MySQL " anche se stavo usando root. Ecco come assicurarsi che root abbia le autorizzazioni corrette.

La mia configurazione :

  • Ubuntu 14.04 LTS
  • MySQL v5.5.37

Soluzione

  1. Apri il file in "etc / mysql / my.cnf"
  2. Controlla:

    • porta (per impostazione predefinita si tratta di "porta = 3306")
    • bind-address (per impostazione predefinita questo è 'bind-address = 127.0.0.1'; se vuoi aprire a tutti, commenta questa riga. Per il mio esempio, dirò che il server effettivo è il 10.1.1.7)
  3. Ora accedi al database MySQL sul tuo vero server (supponi che il tuo indirizzo remoto sia 123.123.123.123 sulla porta 3306 come "root" dell'utente e che voglio cambiare le autorizzazioni sul "dataentry" del database. Ricorda di cambiare l'indirizzo IP, la porta e il nome del database alle tue impostazioni)

    mysql -u root -p
    Enter password: <enter password>
    mysql>GRANT ALL ON *.* to root@'123.123.123.123' IDENTIFIED BY 'put-your-password';
    mysql>FLUSH PRIVILEGES;
    mysql>exit
    
  4. sudo service mysqld restart

  5. Ora dovresti essere in grado di collegarti in remoto al tuo database. Ad esempio, sto usando MySQL Workbench e inserendo "Nome host: 10.1.1.7", "Porta: 3306", "Nome utente: root"

1
Puoi saltare la use dataentrylinea (poiché la maggior parte delle persone non avrà creato quel database).
Jedidja,

3
sono stato in grado di farlo senza riavviare il mysqlservizio alla fine
Ryan Tuck,

5
FLUSH PRIVILEGESdovrebbe consentire di non dover riavviare.
Adam B,

Questo ha funzionato per me per MySQL 5.5 su Windows 10 con FLUSH PRIVILEGES, senza riavviare il servizio. Su Windows, le proprietà del servizio dovrebbero identificare il file my.ini utilizzato per la configurazione (Proprietà | Generale | Percorso dell'eseguibile)
FreeText

Supponevo che specificando bind-address = "0.0.0.0" avrebbe ascoltato tutte le interfacce e le connessioni remote avrebbero funzionato ma mi sbagliavo. Sì, netstat ha mostrato che mysql era in ascolto su 0.0.0.0 (tutte le interfacce) ma ho riscontrato l'errore nel titolo della domanda. Una volta rimossa completamente la riga dell'indirizzo di bind, ha iniziato a funzionare. Strano.
Henno,

73

Devi concedere l'accesso all'utente da qualsiasi nome host.

Ecco come aggiungere nuovi privilegi da phpmyadmin

Vai a Privilegi> Aggiungi un nuovo utente

inserisci qui la descrizione dell'immagine

Seleziona Qualsiasi host per il nome utente desiderato

inserisci qui la descrizione dell'immagine


Molto utile, grazie fratello
Anderson Laverde

65

Esegui solo i seguenti passaggi:

1a) Connetti a mysql (tramite localhost)

mysql -uroot -p

1b) Se il server myslq è in esecuzione in Kubernetes (K8s) e vi si accede tramite un NodePort

kubectl exec -it [pod-name] -- /bin/bash
mysql -uroot -p

2) Crea utente

CREATE USER 'user'@'%' IDENTIFIED BY 'password';

3) Concedere le autorizzazioni

 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;

4) Lavare i privilegi

FLUSH PRIVILEGES;

4
ERRORE 1045 (28000): Accesso negato per l'utente 'root' @ 'localhost' (utilizzando passwoYES) Y
Gank

11
Dovrebbe essere *.* ?
sgarg

26

Il messaggio *Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL serverè una risposta dal server MySQL al client MySQL. Nota come restituisce l'indirizzo IP e non il nome host.

Se stai provando a connetterti mysql -h<hostname> -u<somebody> -pe restituisce questo messaggio con l'indirizzo IP, il server MySQL non è in grado di effettuare una ricerca inversa sul client. Questo è fondamentale perché è così che associa il client MySQL alle sovvenzioni.

Assicurati di poter fare un nslookup <mysqlclient>DA dal server MySQL. Se il problema persiste, non è presente alcuna voce nel server DNS. In alternativa, puoi inserire una voce nel file HOSTS del server MySQL ( <ipaddress> <fullyqualifiedhostname> <hostname><- L'ordine qui potrebbe essere importante).

Una voce nel file host del mio server che consente una ricerca inversa del client MySQL ha risolto questo problema.


1
"è una risposta dal server MySQL al client MySQL." Grazie, mi chiedevo da dove venisse l'errore, la mia macchina o il server. Ho l'errore "ERRORE 1130 (HY000):" ecc.
PJ Brunet,

20

Modo semplice:

Grant All Privileges ON *.* to 'USER_NAME'@'%' Identified By 'YOUR_PASSWORD'; 

poi

FLUSH PRIVILEGES;

fatto!


cosa significa%?
dataview

1
è come tutto. Puoi fare un esempio: WHERE CustomerName LIKE 'a%'- Trova i valori che iniziano con "a"
user5510975

16

Se si modificano manualmente le tabelle delle sovvenzioni (utilizzando INSERT, UPDATE, ecc.), È necessario eseguire FLUSH PRIVILEGESun'istruzione per dire al server di ricaricare le tabelle delle sovvenzioni.

PS: Non consiglierei di consentire a qualsiasi host di connettersi per qualsiasi utente (soprattutto non l' rootuso). Se stai usando mysql per un'applicazione client / server, preferisci un indirizzo di sottorete. Se si utilizza mysql con un server Web o un server applicazioni, utilizzare IP specifici.


4

Basta usare l'interfaccia fornita dallo strumento GUI di MySql (SQLyog):

Fai clic su Gestione utenti: inserisci qui la descrizione dell'immagine

Ora, se vuoi concedere l'accesso PER QUALUNQUE ALTRO PC REMOTO, assicurati che, proprio come nella figura sottostante, il valore del campo Host sia% (che è il carattere jolly)

inserisci qui la descrizione dell'immagine


4

La maggior parte delle risposte qui mostra come creare utenti con due valori host: uno per localhoste uno per %.

Si noti che, ad eccezione di un utente localhost integrato come root, non è necessario farlo. Se desideri semplicemente creare un nuovo utente che possa accedere da qualsiasi luogo, puoi utilizzarlo

CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT <whatever privileges are appropriate> ON <relevant tables> TO myuser;

e funzionerà bene. (Come altri hanno già detto, è una pessima idea concedere privilegi amministrativi a un utente di qualsiasi dominio.)


3

il modo semplice è accedere a phpmyadmin con account root, andare al database mysql e selezionare la tabella utente, modificare l'account root e nel campo host aggiungere% jolly. e poi attraverso i privilegi di flush di ssh

 FLUSH PRIVILEGES;

Questo mi ha aiutato a combinare questo: CONCESSIONE DI TUTTI I PRIVILEGI . A 'root' @ '%' CON OPZIONE CONCESSIONE;
Lanklaas,

2

Se si tratta di un'installazione mysql recente, prima di modificare qualsiasi altra cosa, prova semplicemente a eseguire questo comando e quindi riprova:

flush privileges;

Questo da solo risolve il problema per me su Ubuntu 16.04, mysql 5.7.20. YMMV.


2

Trova un modo migliore per farlo dal tuo pannello di controllo di hosting (sto usando DirectAdmin qui)

semplicemente vai al DB del server di destinazione nel tuo pannello di controllo, nel mio caso: gestione MySQL -> seleziona il tuo DB -> troverai: "Accedi agli host", aggiungi semplicemente il tuo host remoto qui e ora funziona! inserisci qui la descrizione dell'immagine

Immagino che ci sia un'opzione simile su altri pannelli come Plesk, ecc.

Spero sia stato utile anche a te.


2

Bene, niente della risposta sopra ha funzionato per me. Dopo molte ricerche, ho trovato una soluzione. Anche se potrei essere in ritardo, questo potrebbe aiutare gli altri in futuro.

Accedi al tuo server SQL da un terminale

 mysql -u root -p
 -- root password
GRANT ALL ON *.* to root@'XX.XXX.XXX.XX' IDENTIFIED BY 'password';

Questo dovrebbe risolvere il problema di autorizzazione.

Prima di risolvere l'errore

Dopo aver risolto il problema

Buona programmazione !!


1

Bene, quello che puoi fare è solo aprire il file mysql.cfg e devi cambiare l'indirizzo Bind in questo

bind-address = 127.0.0.1

quindi riavvia mysql e sarai in grado di connettere quel server a questo.

Guarda questo puoi avere un'idea che.

questo è un vero sol


3
Questo è correlato, ma non è lo stesso problema. L'errore originariamente ricevuto indica che il client si sta connettendo correttamente al server MySQL, ma quindi non riesce l'autenticazione. Se l'indirizzo bind fosse impostato su 127.0.0.1, si otterrebbe invece un errore di connessione rifiutata.
assone

Ma questo è l'indirizzo che consentirà a tutto l'host di connettersi al server na?
Kishan Bheemajiyani,

Ma concedere tutte le autorizzazioni all'utente non sarà saggia opzione per quel bcoz se si dispone di un utente client e non si è autorizzati a creare l'utente con tutte le autorizzazioni, quale sarebbe la soluzione.
Kishan Bheemajiyani,

1

Se ti capita di essere in esecuzione su Windows; Una soluzione semplice è eseguire la procedura guidata di configurazione dell'istanza del server MySQL. È nel tuo gruppo MYSQL nel menu di avvio. Nella seconda dall'ultima schermata, fai clic sulla casella "Consenti accesso root da macchine remote".


1

Se hai WAMP Server + Windows 10 e lo stai utilizzando per lo sviluppo, fai clic con il tasto destro sull'icona Wamp => Wamp Settings=>Check Allow Virtual Hosts other than 127* inserisci qui la descrizione dell'immagine


0

Stavo anche affrontando lo stesso problema. L'ho risolto in 2 minuti per me ho appena inserito nella lista bianca ip tramite cpanel

Supponiamo che tu stia provando a connettere il database del server B dal server A. Vai al Server B Cpanel-> MySQL remoto-> inserisci l'indirizzo IP del server A e il gioco è fatto.


0

Questa risposta potrebbe aiutare qualcuno ...

Tutte queste risposte non sono state d'aiuto, poi mi sono reso conto di aver dimenticato di controllare una cosa cruciale. La porta :)

Ho mysql in esecuzione in un contenitore finestra mobile in esecuzione su una porta diversa. Stavo puntando alla mia macchina host sulla porta 3306, su cui ho un server mysql in esecuzione. Il mio contenitore espone il server sulla porta 33060. Quindi, per tutto questo tempo, stavo guardando il server sbagliato! doh!


0
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

questo errore perché nessuna password per il root e questo forse si è verificato con te quando hai provato a connetterti dall'esterno.


0

Soluzione CPANEL

Vai a Cpanel, cerca MySQL remoto. Aggiungi l'IP nel campo di input:

Host (% jolly è consentito)

Commenta per ricordare di che IP si tratta. Questo è stato per me.


0

Questo funziona per qualsiasi futura connessione mysql remota!

    sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Passare alla riga che inizia con la direttiva bind-address. Dovrebbe sembrare come questo:

    bind-address            = 0.0.0.0

Accedi al tuo mysql come terminale root

    mysql -u root -p
    -- root password

    CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

    CREATE USER 'username'@'%' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

    FLUSH PRIVILEGES;

    EXIT;

concedere infine a quella macchina l'autorizzazione esclusiva per connettersi al database in remoto con il seguente comando.

    sudo ufw allow from remote_IP_address to any port 3306

-1

Nella remota possibilità che qualcuno affronti questo problema dall'interno di SQLyog, questo è successo:

Mi ero collegato al database remoto (dall'interno di SQLyog) e ho lavorato per alcune ore. Successivamente ho lasciato il sistema per alcuni minuti, poi sono tornato per continuare il mio lavoro - ERRORE 1130 ! Niente di ciò che ho provato ha funzionato; Il riavvio di SQLyog non ha risolto il problema. Quindi ho riavviato il sistema - non funzionava ancora.

Quindi ho provato a collegarmi dal terminale - ha funzionato. Quindi riprovato su SQLyog ... e ha funzionato. Non posso spiegarlo a parte la "stranezza casuale del computer", ma penso che potrebbe aiutare qualcuno.


-1

se si sta tentando di eseguire la query mysql senza definire la stringa di connessione, verrà visualizzato questo errore.

Probabilmente hai dimenticato di definire la stringa di connessione prima dell'esecuzione. hai verificato questo? (Scusa per il pessimo inglese)


-1

Problema: root @ localhost non è in grado di connettersi a una nuova installazione di mysql-community-server su openSUSE 42.2-1.150.x86_64. Mysql rifiuta le connessioni - punto.

Soluzione:

$ ls -l /var/lib/mysql/mysql/user.*
-rw-rw---- 1 mysql mysql     0 Apr 29 19:44 /var/lib/mysql/mysql/user.MYD
-rw-rw---- 1 mysql mysql  1024 Apr 29 19:44 /var/lib/mysql/mysql/user.MYI
-rw-rw---- 1 mysql mysql 10684 Apr 29 19:44 /var/lib/mysql/mysql/user.frm

Il file user.MYD ha dimensioni 0 (davvero?!). Ho copiato tutti e 3 i file da un altro sistema funzionante.

$ /usr/sbin/rcmysql stop
$ cd /var/lib/mysql/mysql/
$ scp root@othersytem:/var/lib/mysql/mysql/user.* ./
$ /usr/sbin/rcmysql start
$ cd -
$ mysql -u root -p

Sono stato in grado di accedere. Quindi, era solo una questione di riapplicare tutti i privilegi di schema. Inoltre, se hai disabilitato IPv6, riattivalo temporaneamente in modo che anche l'account root @ :: 1 possa funzionare.


-1

Questo funziona per DirectAdmin ;

  1. Vai al tuo DirectAdmin.
  2. Vai al tuo MySQL Management.
  3. Seleziona il tuo database.
  4. Sotto la tua Accesse Hostscheda, c'è un campo. Dovresti riempire questo campo con xxx.xx.xxx.xx.
  5. Clicca su Add Host.

Finito. Ora puoi accedere a questo DB con il tuo your_database_username& your_database_password.
Così semplice!


-3

Tutte le risposte qui non hanno funzionato nel mio caso, quindi posso dire che questo potrebbe aiutare altri utenti in futuro. Questo può anche essere un problema nel nostro codice, non solo in MySQL.

Se stai usando VB.NET

Invece di questo codice:

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database

 MysqlConn = New MySqlConnection()

Devi passare MysqlConn = New MySqlConnection()alla prima riga. Quindi sarebbe così

 MysqlConn = New MySqlConnection()

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.