Meine MySQL-Datenbank benötigt zwei Benutzer: Appuser und Support.
Einer der Anwendungsentwickler besteht darauf, dass ich vier Konten für diese Benutzer erstelle:
appuser@'%'
appuser@'localhost'
support@'%'
support@'localhost'
Für mein Leben kann ich nicht herausfinden, warum er glaubt, dass wir das brauchen. Würde sich die Verwendung des Platzhalters als Host nicht um den 'localhost' kümmern?
Irgendwelche Ideen?
(Verwenden von MySQL 5.5 hier)
Wie @nos in den Kommentaren der aktuell akzeptierten Antwort auf diese Frage hervorhob, ist die akzeptierte Antwort falsch.
Ja, es gibt einen Unterschied zwischen
%
undlocalhost
für den Host des Benutzerkontos, wenn eine Verbindung über eine Socket-Verbindung anstelle einer Standard-TCP / IP-Verbindung hergestellt wird.Ein Hostwert von
%
istlocalhost
für Sockets nicht enthalten und muss daher angegeben werden, wenn Sie mit dieser Methode eine Verbindung herstellen möchten.quelle
Lassen Sie uns einfach testen.
Als Superuser verbinden und dann:
und dann
Konfiguration
Erstellen Sie einen Benutzer
foo
mit einem Kennwortbar
zum Testen:Verbinden
/var/run/mysqld/mysqld.sock
Führen Sie dies in der Befehlszeile aus, um eine Verbindung zum Unix Domain Socket (dh zur E / A-Pipe, die durch den Dateisystemeintrag oder einen ähnlichen Namen benannt ist )--protocol
herzustellen (verwenden Sie die Option, um doppelt sicherzugehen).Man erwartet, dass die obigen Übereinstimmungen "Benutzer kommt von localhost", aber sicherlich nicht "Benutzer kommt von 127.0.0.1".
Führen Sie dies in der Befehlszeile aus, um stattdessen über "127.0.0.1" eine Verbindung zum Server herzustellen
Wenn Sie dies weglassen,
--protocol=TCP
versucht dermysql
Befehl weiterhin, den Unix-Domänensocket zu verwenden. Du kannst auch sagen:Die zwei Verbindungsversuche in einer Zeile:
(Das Passwort wird in der Umgebung so festgelegt, dass es an das übergeben wird
mysql
Prozess übergeben wird.)Überprüfung im Zweifelsfall
Um wirklich zu überprüfen, ob die Verbindung über einen TCP / IP-Socket oder einen Unix Domain-Socket erfolgt
ps faux
lsof -n -p<yourpid>
.Sie werden so etwas sehen wie:
oder
So:
Fall 0: Host = '10 .10.10.10 '(Nulltest)
Fall 1: Host = '%'
Fall 2: Host = 'localhost'
Das Verhalten variiert und dies hängt anscheinend davon ab
skip-name-resolve
. Wenn gesetzt, werden Zeilen mitlocalhost
gemäß Protokoll ignoriert. Im Fehlerprotokoll wird Folgendes angezeigt : "'Benutzer' -Eintrag 'root @ localhost' wird im Auflösungsmodus --skip-name ignoriert." . Dies bedeutet, dass keine Verbindung über den Unix Domain Socket hergestellt wird. Dies ist jedoch empirisch nicht der Fall.localhost
bedeutet jetzt NUR den Unix Domain Socket und stimmt nicht mehr mit 127.0.0.1 überein.skip-name-resolve
ist aus:skip-name-resolve
ist eingeschaltet:Fall 3: Host = '127.0.0.1'
Fall 4: Host = ''
(Laut MySQL 5.7: 6.2.4 Zugriffskontrolle, Phase 1: Verbindungsüberprüfung , die leere Zeichenkette ‚‘ bedeutet auch „jeden Host“ , sondern sortiert nach ‚%‘. )
Fall 5: Host = '192.168.0.1' (zusätzlicher Test)
('192.168.0.1' ist eine der IP-Adressen meines Computers. Ändern Sie sie in Ihrem Fall entsprechend.)
aber
mysql -pbar -ufoo -h192.168.0.1
: OK (!)Letzteres, weil es sich tatsächlich um eine TCP-Verbindung handelt, von der
192.168.0.1
Folgendes stammtlsof
:Randfall A: Host = '0.0.0.0'
Randfall B: Host = '255.255.255.255'
Randfall C: Host = '127.0.0.2'
(127.0.0.2 ist eine vollkommen gültige Loopback-Adresse, die 127.0.0.1 entspricht, wie in RFC6890 definiert. )
Interessant:
mysql -pbar -ufoo -h127.0.0.2
verbindet von127.0.0.1
und ist FEHLERmysql -pbar -ufoo -h127.0.0.2 --bind-address=127.0.0.2
ist in OrdnungAufräumen
Nachtrag
mysql.user
Verwenden Sie Folgendes, um zu sehen, was sich tatsächlich in der Tabelle befindet, die eine der Berechtigungstabellen ist:das gibt:
Ähnliches gilt für die Tabelle
mysql.db
:quelle
Wenn Sie
user@'%'
von localhost aus eine Verbindung herstellen möchten, verwenden Siemysql -h192.168.0.1 -uuser -p
.quelle
Ich werde eine etwas andere Antwort geben als bisher.
Wenn Sie eine Zeile für einen anonymen Benutzer von localhost in Ihrer Benutzertabelle
''@'localhost'
haben, wird diese als spezifischer behandelt als Ihr Benutzer mit Wildcard-Host'user'@'%'
. Deshalb ist es notwendig, auch bereitzustellen'user'@'localhost'
.Sie können dies am Ende dieser Seite genauer erklären .
quelle
Das Prozentzeichen bedeutet: Jeder Host, einschließlich Remote- und lokaler Verbindungen.
Der localhost erlaubt nur lokale Verbindungen.
(Wenn Sie also zunächst keine Remoteverbindungen zu Ihrer Datenbank benötigen, können Sie den Benutzer appuser @ '%' sofort entfernen.)
Also ja, sie überlappen sich, aber ...
... es gibt einen Grund für das Festlegen beider Kontotypen. Dies wird in den MySQL-Dokumenten erläutert: http://dev.mysql.com/doc/refman/5.7/en/adding-users.html .
Wenn Sie einen anonymen Benutzer auf Ihrem lokalen Host haben, mit dem Sie Folgendes erkennen können:
und wenn Sie nur den Benutzer appuser @ '%' erstellen (und nicht den appuser @ 'localhost'), wird das anonyme Benutzerkonto verwendet , wenn der Benutzer mysql des Antragstellers eine Verbindung vom lokalen Host herstellt (es hat Vorrang vor Ihrem appuser @) '%' Benutzer).
Die Lösung hierfür besteht (wie man sich vorstellen kann) darin, den appuser @ 'localhost' zu erstellen (der spezifischer ist als der anonyme Benutzer des lokalen Hosts und verwendet wird, wenn Ihr appuser eine Verbindung vom localhost herstellt).
quelle