#python #pymysql
Вопрос:
Я пытаюсь подключиться к базе данных MySQL в AWS на своем локальном компьютере.
Ниже приведен код, который я использовал. Я «вычеркнул» конфиденциальную информацию.
import pymysql import pandas as pd from paramiko import SSHClient from sshtunnel import SSHTunnelForwarder ssh_host = '54.x.x.x' ssh_port = 22 ssh_username = 'xxxx' ssh_pkey = paramiko.RSAKey.from_private_key_file('keys/xxxx.pem') sql_host = '10.x.x.x' sql_port = 3036 sql_username = 'xxxx' sql_password = 'xxxx' sql_db = 'xxxx' local_host = '127.0.0.1' with SSHTunnelForwarder( (ssh_host, ssh_port), ssh_username=ssh_username, ssh_pkey=ssh_pkey, remote_bind_address = (sql_host, sql_port) ) as tunnel: dbconn = pymysql.connect(host=local_host, user=sql_username, passwd=sql_password, db=sql_db, port=tunnel.local_bind_port)
Я получаю следующую ошибку:
2021-10-29 13:07:46,737| ERROR | Secsh channel 0 open FAILED: Connection refused: Connect failed 2021-10-29 13:07:46,753| ERROR | Could not establish connection from local ('127.0.0.1', 63918) to remote ('10.x.x.x', 3036) side of the tunnel: open new channel ssh error: ChannelException(2, 'Connect failed') --------------------------------------------------------------------------- OperationalError Traceback (most recent call last) C:Users...Temp/ipykernel_13796/2110950023.py in lt;modulegt; 5 remote_bind_address = (sql_host, sql_port) 6 ) as tunnel: ----gt; 7 dbconn = pymysql.connect(host=local_host, 8 user=sql_username, 9 passwd=sql_password, ~Miniconda3envs...libsite-packagespymysqlconnections.py in __init__(self, user, password, host, database, unix_socket, port, charset, sql_mode, read_default_file, conv, use_unicode, client_flag, cursorclass, init_command, connect_timeout, read_default_group, autocommit, local_infile, max_allowed_packet, defer_connect, auth_plugin_map, read_timeout, write_timeout, bind_address, binary_prefix, program_name, server_public_key, ssl, ssl_ca, ssl_cert, ssl_disabled, ssl_key, ssl_verify_cert, ssl_verify_identity, compress, named_pipe, passwd, db) 351 self._sock = None 352 else: --gt; 353 self.connect() 354 355 def __enter__(self): ~Miniconda3envs...libsite-packagespymysqlconnections.py in connect(self, sock) 630 self._next_seq_id = 0 631 --gt; 632 self._get_server_information() 633 self._request_authentication() 634 ~Miniconda3envs...libsite-packagespymysqlconnections.py in _get_server_information(self) 1053 def _get_server_information(self): 1054 i = 0 -gt; 1055 packet = self._read_packet() 1056 data = packet.get_all_data() 1057 ~Miniconda3envs...libsite-packagespymysqlconnections.py in _read_packet(self, packet_type) 690 buff = bytearray() 691 while True: --gt; 692 packet_header = self._read_bytes(4) 693 # if DEBUG: dump_packet(packet_header) 694 ~Miniconda3envs...libsite-packagespymysqlconnections.py in _read_bytes(self, num_bytes) 746 if len(data) lt; num_bytes: 747 self._force_close() --gt; 748 raise err.OperationalError( 749 CR.CR_SERVER_LOST, "Lost connection to MySQL server during query" 750 ) OperationalError: (2013, 'Lost connection to MySQL server during query')
Самое странное, что вчера это сработало, а сегодня нет. Я связался с командой сервера, и они подтвердили, что не внесли никаких изменений.
Я нахожусь в Windows 10, среде Python Anaconda.
Обновление(2021.11.10): Я могу подключиться к MySQL через DBeaver, используя те же настройки.
Комментарии:
1. Я вижу, вы используете это для подключения ssh_host = ’54.x.x.x’. Возможно, сервер был остановлен, а затем запущен, и общедоступный IP-адрес для машины изменился.
2. @TobievanderMerwe, адрес сервера не изменился. Я могу подключиться к серверу SSH через командную строку.