Wir haben ein sehr seltsames Problem auf unserem Server.MySQL localhost Zugriff verweigert, bis Flush
Jeder Benutzer (einschließlich root) kann nicht auf mysql auf dem lokalen System zugreifen und tauscht zwischen den Flushes.
wir einen einfachen PHP-Skript verwenden, um es zu testen ...
$username = "test";
$password = "pass123";
$conn = new mysqli("localhost", $username, $password);
if ($conn->connect_error) {echo "[localhost] Connection failed: " . $conn->connect_error;} else echo "[localhost] Connected successfully";
echo "<hr>";
$conn = new mysqli("127.0.0.1", $username, $password);
if ($conn->connect_error) {echo "[127.0.0.1] Connection failed: " . $conn->connect_error;} else echo "[127.0.0.1] Connected successfully";
echo "<hr>";
$conn = new mysqli("192.168.1.2", $username, $password);
if ($conn->connect_error) {echo "[192.168.1.2] Connection failed: " . $conn->connect_error;} else echo "[192.168.1.2] Connected successfully";
So lassen Sie mich durch die Sequenz fort.
- MySQL-Benutzer konfiguriert, user @% mit pass123, mit voller Server privs auf allen db.
- PHP Script wird ausgeführt. Die ersten beiden Tests scheitern mit Zugriff verweigert. Letzte gelingt.
- Mysql Benutzer neu konfiguriert: [email protected]
- Skript ausführen: Alle drei verweigert.
- MySQL Flush Privs
- Erste zwei gelingen. Letzter Fehler (sinnvoll)
- MySQL Benutzer konfiguriert: user @%(Original von Stufe 1)
- Script auszuführen: Alle drei erfolgreich zu sein. (Hooray? Nein)
- MySQL Flush privs (und/oder Server-Neustart)
- Zurück 2.
Schritt Wir können nicht Coldfusion oder PHP-Verbindungen aufrecht zu erhalten. Es funktioniert zuerst, die erste Verbindung, wenn [email protected] (so in mysql konfiguriert), aber anschließend fehlschlägt in Coldfusion, und PHP kann nicht zuverlässig verbinden abhängig von Service-Neustarts oder Leerungen. PHP skizziert das Problem wirklich, wie oben gesehen. Aber der JDBC-Konnektor für die Coldfusion scheint zufällig zu funktionieren oder nicht.
Irgendwelche Ideen, was hier passiert? Benutzer @% sollte immer funktionieren, sollte es nicht?
- MySQL v5.5, PHP v 7, Coldfusion v11 (jdbc .38 neueste). Windows Server 2012.
- my.cnf ist nicht mit Bind-Adresse konfiguriert (alle Hosts zulässig).
-
- max-connections = 500
- IPv6 deaktiviert (OxFFFFFF)
- Firewall ist ausgeschaltet.
- Die gleiche Datenbank, die gleichen Benutzer und die gleiche Konfiguration funktionieren problemlos auf Windows Server 2008, von dem wir versuchen, zu migrieren. Dies sind alles Neuinstallationen jeder Software. Wir konnten einfach Benutzer @% erstellen und zu allen Zeiten eine Verbindung zu allen 3 Tests herstellen.
Zusätzliche Hinweise:
- "localhost", wenn sie in Browser (lokale IIS) eingegeben haben, funktioniert manchmal, manchmal tut. 127.0.0.1 funktioniert immer einwandfrei.
- keine Hosts Eintrag, da Win7 + interne DNS verwendet. Wir haben den localhost-Eintrag hinzugefügt, es hat keinen Effekt.
- IIS hält uns frieren. Die Websites beginnen sich im Browser zu "drehen" und werden nie geladen. Wir müssen ein iisreset ausführen. Wir können nicht feststellen, warum dies geschieht - es scheint zufällig zu sein. Scheint etwas mit dem localhost Problem zu tun, ja?
Die Erklärung ist nicht ganz richtig. Wenn ein Benutzer versucht, eine Verbindung zum MySQL-Server herzustellen, betrachtet MySQL die Zeilen aus der Tabelle mysql.user in einer bestimmten Reihenfolge. Sie haben Recht, dass MySQL vor jedem ** 'user' @ '%' ** ** '' @ 'localhost' ** bestellt, und das wird zuerst überprüft. In MySQL ist der Host-Wert von 'localhost' * nicht * auch mit der Loopback-IP 127.0.0.1. Es ist überhaupt keine IP-Verbindung. Es ist eine Verbindung auf dem lokalen Server, über einen Socket, der * kein * IP-Socket ist. Dieser Eintrag in der Benutzertabelle betrifft also nur Clients auf dem lokalen Server und keine Verbindung über IP. – spencer7593
Alle DML (INSERT/UPDATE/DELETE) Änderungen gemacht die msyql.user, mysql.db, et al. Tabellen sind * nicht * wirksam, bis ein FLUSH PRIVILEGES den MySQL-Server veranlasst, die Tabellen zu lesen und die Speicherstrukturen neu zu füllen. Wenn Berechtigungen durch GRANT- und REVOKE-Anweisungen geändert werden, werden die Änderungen wirksam, ohne dass eine FLUSH PRIVILEGES-Anweisung ausgeführt werden muss. – spencer7593
Tolle Erklärung, das macht jetzt mehr Sinn. Dieses Zeug sollte zum Lesen benötigt werden, es ist einfach wichtig.Nicht sicher, ob Sie in der Lage sind, meine Antwort zu verbessern/zu bearbeiten, würde es vorziehen, Kredit zu geben, wo Kredit fällig ist. – Barry