Die klassische Antwort auf diese Frage ist 127.0.0.1
oder die IP der Host- oder die Hostnamen anstelle des „besonderen Namen“ localhost
zu verwenden. Vom documentation:
[...] Verbindungen auf Unix zu localhost eine Unix-Socket-Datei standardmäßig
Und später verwenden gemacht:
Unter Unix MySQL-Programme behandeln den Hostnamen localhost speziell, in einer Weise, die wahrscheinlich anders ist als erwartet im Vergleich zu anderen Netzwerk- basierte Programme. Bei Verbindungen mit localhost versuchen MySQL-Programme, eine Verbindung zum lokalen Server herzustellen, indem sie eine Unix-Socket-Datei verwenden. Dies geschieht auch dann, wenn eine Option --port oder -P angegeben wird, um eine Portnummer anzugeben. Um sicherzustellen, dass der Client eine TCP/IP-Verbindung zum lokalen Server herstellt, verwenden Sie --host oder -h, um einen Hostnamen von 127.0.0.1 oder die IP-Adresse oder den Namen des lokalen Servers anzugeben.
Doch dieser einfache Trick erscheint nicht in Ihrem Fall zu arbeiten, so dass Sie irgendwie Kraft die Verwendung eines TCP-Socket haben. Wie Sie es selbst erklärt haben, verwenden Sie beim Aufruf von mysql
in der Befehlszeile die Option --protocol tcp
.
Wie erklärt here, von SQLAlchemy, können Sie die entsprechenden Optionen (falls vorhanden), um Ihre Fahrer entweder als URL-Optionen oder mit dem connect_args
Stichwort Argumente übergeben.
Zum Beispiel mit PyMySQL, auf einem Testsystem I-Setup haben zu diesem Zweck (MariaDB 10.0.12, SQLAlchemy 0.9.8 und 0.6.2 PyMySQL) Ich habe folgende Ergebnisse:
>>> engine = create_engine(
"mysql+pymysql://sylvain:[email protected]/db?host=localhost?port=3306")
# ^^^^^^^^^^^^^^^^^^^^^^^^^^
# Force TCP socket. Notice the two uses of `?`
# Normally URL options should use `?` and `&`
# after that. But that doesn't work here (bug?)
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost:54164',)]
# Same result by using 127.0.0.1 instead of localhost:
>>> engine = create_engine(
"mysql+pymysql://sylvain:[email protected]/db?host=localhost?port=3306")
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost:54164',)]
# Alternatively, using connect_args:
>>> engine = create_engine("mysql+pymysql://sylvain:[email protected]/db",
connect_args= dict(host='localhost', port=3306))
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost:54353',)]
Wie Sie bemerkt haben, verwenden beide eine TCP-Verbindung (das weiß ich wegen der Portnummer nach dem Hostnamen).Auf der anderen Seite:
>>> engine = create_engine(
"mysql+pymysql://sylvain:[email protected]/db?unix_socket=/path/to/mysql.sock")
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# Specify the path to mysql.sock in
# the `unix_socket` option will force
# usage of a UNIX socket
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost',)]
# Same result by using 127.0.0.1 instead of localhost:
>>> engine = create_engine(
"mysql+pymysql://sylvain:[email protected]/db?unix_socket=/path/to/mysql.sock")
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost',)]
# Alternatively, using connect_args:
>>> engine = create_engine("mysql+pymysql://sylvain:[email protected]/db",
connect_args= dict(unix_socket="/path/to/mysql.sock"))
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost',)]
Kein Anschluss nach dem Hostnamen: Dies ist ein UNIX-Socket.
Richten Sie einen SSH-Tunnel ein, und zeigen Sie dann Ihren lokalen MySQL-Server auf den Tunnel-Port des lokalen Computers. mysql wird nicht wissen, dass es getunnelt wird, und ssh kümmert sich darum, alles dorthin umzuleiten, wo es hingehört. –
Tunnel ist bereits installiert von X.X.X.X: 3306 -> localhost: 3306 Vielleicht muss ich tunnel zu einem anderen Port, zum Beispiel localhost: 3307? – strevg
@strevg Um die Dinge zu klären: Sie haben einen MySQL Server auf Ihrem lokalen Rechner. Und ein zweiter MySQL-Server, auf den remote über einen SSH-Tunnel zugegriffen wird. Beide laufen gleichzeitig? Welcher Server ist an welchen Port Ihres lokalen Hosts gebunden? –