[...] połączenia w systemie UNIX do localhost wykonane są przy użyciu pliku gniazda Unix domyślnie
a później:
W systemie UNIX Programy MySQL traktują nazwę hosta localhost specjalnie, w sposób, który prawdopodobnie różni się od tego, czego się spodziewasz w porównaniu do innych sieci. oparte programy. W przypadku połączeń z lokalnym hostem, programy MySQL próbują połączyć się z serwerem lokalnym za pomocą pliku gniazda uniksowego. Dzieje się tak, nawet jeśli podano opcję --port lub -P w celu określenia numeru portu. Aby upewnić się, że klient tworzy połączenie TCP/IP z serwerem lokalnym, użyj parametru -host lub -h, aby określić wartość nazwy hosta 127.0.0.1 lub adres IP lub nazwę lokalnego serwera.
Jednak ten prosty trik nie wydaje się działać w Twoim przypadku, więc trzeba jakoś siły użycie gniazda TCP. Jak sam wyjaśniłeś, podczas wywoływania mysql
w wierszu poleceń, używasz opcji --protocol tcp
.
Jak wyjaśniono here z SQLAlchemy, można przekazać odpowiednie opcje (jeśli w ogóle) do sterownika albo jako opcje URL lub używając argumentu connect_args
słowa kluczowego.
na przykład stosując PyMySQL na systemie testowym mam ustawić w tym celu (MariaDB 10.0.12, SQLAlchemy 0.9.8 i 0.6.2) PyMySQL Mam następujące wyniki:
>>> 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',)]
Jak zauważyłeś, oba będą używać połączenia TCP (wiem to z powodu numeru portu po nazwie hosta).Z drugiej strony:
>>> 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',)]
nr portu po hosta: Jest to gniazdo UNIX.
skonfiguruj tunel ssh, a następnie wskaż lokalny mysql w porcie tunelu na komputerze lokalnym. mysql nie będzie wiedział, że jest tunelowany, a ssh zajmie się przekierowaniem wszystkiego, co powinno. –
Tunel został już zainstalowany z X.X.X.X: 3306 -> localhost: 3306 Może muszę ustawić tunel na inny port, na przykład localhost: 3307? – strevg
@strevg W celu wyjaśnienia rzeczy: masz serwer MySQL uruchomiony na lokalnym hoście. I drugi serwer MySQL dostępny zdalnie przez tunel SSH. Oba działają jednocześnie? Który serwer jest powiązany z jakim portem na lokalnym hoście? –